0

我正在使用流利的等待。我想返回 void 而不是 Web Element 或 Boolean。我该怎么做?我试过这样。代码片段如下

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(Duration.ofSeconds(30))
                .pollingEvery(Duration.ofSeconds(3)).ignoring(NoSuchElementException.class)

    wait.until(new Function<WebDriver, Void>() {
            public void apply(WebDriver driver) {
            if( driver.findElement(By.id("foo")).isDisplayed())
                driver.findElement(By.id("foo")).click();
            }
        });
    }

但是,它给了我无效的错误:

返回类型与 Function<WebDriver,Void>.apply(WebDriver) 不兼容

注意:我只想返回无效。那可能吗?

4

3 回答 3

1

答案是否定的,我想。


我们可以从api docs中找到一些有用的信息。

它是这样解释的Returns

如果函数在超时到期之前返回不同于 null 或 false 的值,则该函数的返回值。

因此,函数不可能同时正确处理 void 和 null。

于 2020-10-10T02:14:46.983 回答
1

我想你误解了 wait 函数的使用。一旦满足条件,它应该返回布尔值或 WebElement。您正在尝试单击方法内部,这不是它的预期使用方式。

您在这里并不需要 FluentWait。您可以使用 WebDriverWait 来简化此操作。

new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable(By.id("foo"))).click();

这将等待最多 30 秒以使元素可单击,如果未超时,则将单击返回的元素。


对于您的评论......在这种情况下,我会编写一个单独的方法ElementExists来返回一个WebElement. 如果返回WebElement不是null,点击它。

辅助方法

public static WebElement ElementExists(By locator, int timeout)
{
    try
    {
        return new WebDriverWait(driver, timeout).until(ExpectedConditions.visibilityOfElementLocated(locator));
    } catch (TimeoutException e)
    {
        return null;
    }
}

脚本代码

WebElement ele = ElementExists(By.id("foo"), 30);
if (ele != null)
{
    ele.click();
}
于 2020-10-10T06:17:31.830 回答
0

您可以使用return this,它返回正在使用 FluentWait 的当前类的实例,您可以忽略它。

于 2021-09-11T10:28:52.193 回答