我正在使用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。有可能吗?
答案 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();
}