我在FluentWait
和WebDriverWait
之间感到困惑。
FluentWait
和WebDriverwait
都使用相同的功能,例如忽略异常,更改轮询时间间隔,预期条件等。
根据我的理解,两者都实现了Wait
接口。此外,WebDriverWait
扩展了FluentWait
(这意味着所有功能也出现在WebDriverWait
中)。
WebDriverWait
中没有的FluentWait
保留的额外功能是什么?
答案 0 :(得分:3)
两者之间实际上差别很小。根据{{1}}源代码,它说:
它将忽略遇到的
WebDriverWait
个实例 (抛出)默认情况下在NotFoundException
条件下,并立即生成 传播所有其他人。您可以添加更多的忽略列表 致电until
唯一的区别是默认情况下,ignoring(exceptions to add)
中忽略了未找到的元素异常。其余功能与WebDriverWait
完全相同,因为FluentWait
扩展了它。
答案 1 :(得分:2)
FluentWait和WebDriverWait都是Wait接口的实现。
使用Fluent WebDriver显式等待和WebDriver显式等待的目标或多或少相同。但是,在少数情况下,FluentWait可以更灵活。由于这两个类都是相同Wait接口的实现,因此除了 FluentWait具有接受谓词或函数作为参数直到方法的功能时,它们或多或少具有相同的功能。另一方面, WebDriverWait仅接受函数作为ExpectedCondition in until方法,它限制您仅使用布尔返回。当您在FluentWait中使用Predicate时,它允许您返回任何对象直到方法。
实施例: 一个FluentWait,函数作为参数,直到返回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));
}
答案 2 :(得分:0)
主要区别在于,在Webdriver等待中,我们无法执行等待池的方案,而在Fluent等待中,我们可以设置Webdriver等待中不可能的池化时间。
Webdriver等待示例
WebElement dynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("dynamicElement")));
流畅等待示例 下面的代码将等待30秒,以使元素出现在页面上,每5秒检查一次该元素的存在。
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>()
{
public WebElement apply(WebDriver driver) {
driver.findElement(By.id("foo"));
}
});
答案 3 :(得分:0)
在 FluentWait 中,轮询周期是受控的,而在 Explicilit 中,它是 250 毫秒。
用户还可以使用 IgnoreExceptionTypes 命令灵活地忽略轮询期间可能发生的异常。