我想使用Fluent wait返回void,该怎么做?

时间:2020-10-09 23:59:21

标签: java selenium selenium-webdriver fluentwait

我正在使用Fluent等待。我想返回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 .apply(WebDriver)

不兼容

注意:我只想返回void。有可能吗?

2 个答案:

答案 0 :(得分:1)

我认为答案是否定的。


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

它像这样解释Returns

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

因此,该函数无法同时正确处理void和null。

答案 1 :(得分:1)

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

您这里真的不需要FluentWait。您可以使用WebDriverWait简化此过程。

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

这将等待30秒钟,以使该元素可单击,如果没有超时,则将单击返回的元素。


在这种情况下,我想写一个单独的方法ElementExists返回一个WebElement。如果返回的WebElement不是null,请单击它。

Helper方法

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();
}