FluentWait 和 WebDriverWait 都是 Wait 接口的实现。
使用 Fluent WebDriver Explicit Wait 和 WebDriver Explicit Wait 的目标大致相同。但是,在少数情况下,FluentWait 可以更加灵活。由于这两个类都是同一个 Wait 接口的实现,所以它们或多或少都具有相同的特性,除了 FluentWait 具有在 until 方法中接受谓词或函数作为参数的特性。另一方面,WebDriverWait 只接受作为 ExpectedCondition in until 方法的函数,这限制了您只能使用布尔返回。当您在 FluentWait 中使用 Predicate 时,它允许您从 until 返回任何对象方法。
这里仔细看:https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html#until-com.google.common.base.Predicate-
示例:
FluentWait 具有 Function 作为参数,直到 String 返回:
public void exampleOfFluentWait() {
WebElement foo = driver.findElement(By.id("foo"));
new FluentWait<WebElement>(foo)
.withTimeout(10, TimeUnit.SECONDS)
.pollingEvery(2, TimeUnit.SECONDS)
.until(new Function<WebElement, String>() {
@Override
public String apply(WebElement element) {
return element.getText();
}
});
}
具有布尔返回函数的相同 FluentWait 作为直到方法中的参数。
public void exampleOfFluentWait() {
WebElement foo = driver.findElement(By.id("foo"));
new FluentWait<WebElement>(foo)
.withTimeout(10, TimeUnit.SECONDS)
.pollingEvery(2, TimeUnit.SECONDS)
.until(new Function<WebElement, Boolean>() {
@Override
public Boolean apply(WebElement element) {
return element.getText().contains("foo");
}
});
}
一个带有谓词的 FluentWait。
public void exampleOfFluentWithPredicate() {
WebElement foo = driver.findElement(By.id("foo"));
new FluentWait<WebElement>(foo)
.withTimeout(10, TimeUnit.SECONDS)
.pollingEvery(100, TimeUnit.MILLISECONDS)
.until(new Predicate<WebElement>() {
@Override
public boolean apply(WebElement element) {
return element.getText().endsWith("04");
}
});
}
WebDriverWait 示例:
public void exampleOfWebDriverWait() {
WebElement foo = driver.findElement(By.id("foo"));
new WebDriverWait(driver, 10)
.pollingEvery(2, TimeUnit.SECONDS)
.withTimeout(10, TimeUnit.SECONDS)
.until(ExpectedConditions.visibilityOf(foo));
}