我正在使用WebDriverWait,将轮询间隔设置为:500毫秒。不过,WebDriverWait是否会在一段时间延迟后返回(即元素加载完成后的2-3秒)?这里有什么意见吗?
#1 楼
隐式等待:隐式等待是告诉WebDriver在尝试查找一个或多个元素(如果它们不立即可用)时轮询DOM一定时间。默认设置为0。设置后,将在WebDriver对象实例的生存期内设置隐式等待。
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
使用时间:不建议使用
显式等待:
显式等待是您定义的代码,用于在继续执行代码之前等待特定条件发生。默认情况下,WebDriverWait每500毫秒调用ExpectedCondition,直到成功返回。
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
使用时间:如果元素需要很长时间加载。另外,用于检查元素的属性(状态,可点击性等)。
FluentWait:
对于每个FluentWait实例,您可以指定:
FluentWait必须检查定义的条件的频率。
在页面上搜索元素时,请忽略特定类型的异常等待,例如NoSuchElementExceptions。
等待条件的最大时间
何时使用FluentWait:当您尝试测试FluentWait时每隔x秒/分钟出现一次的元素的存在(仅举一个例子,这是我对可以在何处使用此元素的猜测)。
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
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) {
return driver.findElement(By.id("foo"));
}
});
评论
非常感谢您提供详细的答案。让我在代码中进行尝试,以查看响应时间的变化。我的代码中存在以下问题:我正在使用webDriverWait来完成加载程序(例如:在页面中,单击复选框将加载一组数据,并且出现一个加载图标以指示用户,正在加载仍在进行中。我正在使用webDriverWait来确定加载图标是否消失。代码可以正常工作,但是webDriverWait在延迟几秒钟(2-3秒)后返回,而webDriverWait返回的加载时间为2-3秒图标消失了。
–Dinesh
15年5月5日在6:04
@小熊猫您的FluentWait代码不是有效的语法。
–史蒂夫·斯台普
18年5月8日在15:02
#2 楼
隐式等待:隐式等待告诉Web驱动程序在尝试查找元素时在每个实例上等待。就像全局等待所有driver.findelement实例一样。它将迫使Web驱动程序等到最早出现在页面或定义的时间上为止。缺点是,即使在定义的时间跨度内元素也没有加载到页面上,它都会引发异常。 >2)FluentWait
都是类并实现Wait接口。
WebDriverWait应用于具有定义的预期条件和时间的某些元素。此等待仅适用于指定的元素。当找不到元素时,此等待也可能引发异常。
WebDriverWait wait = new WebDriverWait (driver, 20);
wait.until(ExpectedConditions.VisibilityofElementLocated(By.xpath(""//button[@value='Save Changes']"")));
Fluent等待:Fluent等待是另一类显式等待,您可以定义轮询并忽略该异常以如果找不到元素,则继续执行脚本。
new FluentWait<WebDriver>(driver).withTimeout(30, TimeUnit.SECONDS).pollingevery(10, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
#3 楼
隐式等待被附加到WebDriver实例。在使用驱动程序实例执行任何操作之前,它将被调用。显式等待是高度可定制的。您可以使用两个类实现Explicit Wait:
FluentWait(类)
WebDriverWait(类)
FluentWait类具有以下配置等待的方法。
withTimeOut()
pollingEvery()
WebDriverWait类是一个扩展FluentWait类。它没有自己的方法。
,但是它具有某些构造函数,可以帮助您配置等待实例而无需调用方法。
WebDriverWait将WebDriver实例作为论点,与FluentWait不同。
有关更多详细信息,请观看:
https://youtu.be/FbGOhbzCoyk
评论
希望对您有所帮助:toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait嗨,非常感谢您提供非常有用的链接。但是,我不了解WebDriverWait是隐式等待还是显式等待。
如果阅读文档,您会发现隐式和显式在功能上是等效的。他们俩每500毫秒轮询一次DOM。
是的。。。但是,我仍然感到困惑:WebDriverWait或FluentWait ...有什么建议吗?大多数时候,我将不得不等待该元素可见
按照这个问题,WebDriverWait是FluentWait的扩展。