implicitwait()
,explicitwait()
和fluentwait()
之间的确切差异是什么?你能用例子解释一下吗?
答案 0 :(得分:3)
我发布了a blog article about this,我想我提供了一些其他答案遗漏的细节。
隐式等待:在隐式等待期间,如果Web驱动程序由于其可用性而无法立即找到它,则WebDriver将定期轮询DOM(以0.5秒的间隔或依赖于在驱动程序 - 浏览器实现上,直到达到默认的隐式最大等待时间。一旦指定的隐式等待最大时间结束,它将尝试在抛出WebDriverException(如NoSuchElementException)之前最后一次再次搜索该元素。 默认设置为0 ,意味着对driver.findElement的调用不需要轮询DOM,如果元素实际存在,它将立即返回0-999毫秒,或者它将抛出如果NoSuchElementException在同一时间段内不存在,则为NoSuchElementException。要覆盖默认的最长时间,请执行以下操作:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
显式等待:可能存在特定元素加载时间超过一秒或更长时间的情况。在这种情况下,你肯定不想设置一个巨大的隐含等待时间,因为如果你这样做,那么你的浏览器将等待每个驱动程序调用的相同最大时间来查找元素。因此,您可能会发现测试性能略有下降。
为了避免这种情况,您只需在所需元素上定义单独的等待时间。通过遵循此规则,您的浏览器隐式等待时间对于每个查找元素的驱动程序调用都会很短,并且根据具体情况对于某个特定元素可能很大。
显式等待始终首先定义FluentWait,例如WebDriverWait对象,然后通常使用预期条件来解决等待。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id(“aId”)));
流利等待:假设您有一个元素,有时会在1秒内出现,有时需要几分钟才会出现。在这种情况下,最好使用FluentWait定义显式等待,因为这将尝试一次又一次地查找元素,直到找到它或直到最终计时器用完为止。 WebDriverWait是一种FluentWait ,因为WebDriverWait扩展了FluentWait并具有FluentWait类的所有功能,例如能够调整DOM轮询间隔,忽略异常。
FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(timeoutSeconds, TimeUnit.SECONDS)
.pollingEvery(500, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
答案 1 :(得分:0)
显式等待是您定义的代码,用于在继续执行代码之前等待某个条件发生。最糟糕的情况是Thread.sleep()
,它将条件设置为等待的确切时间段。提供了一些便捷方法,可帮助您编写仅在需要时等待的代码。 WebDriverWait
与ExpectedCondition
结合使用是一种可以实现的方法。示例如下:
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
但是,根据语言实现的不同而有所不同。有关ExpectedCondition
界面
隐式等待是指WebDriver
在尝试查找一个或多个元素(如果它们不是立即可用)时,将DOM
轮询一段时间。默认设置为0.设置后,将为WebDriver
对象实例的生命周期设置隐式等待。下面是隐式等待的实现:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
这两个定义都来自seleniumhq和最完美的定义。
流畅等待只是另一种等待元素的机制。它提供了一些不同的机制来轮询DOM
以找到元素。它提供的最大功能之一是等待元素忽略某些exceptions
。见this
答案 2 :(得分:0)
隐含等待
隐式等待是告诉WebDriver在尝试查找元素(如果它们不是立即可用)时将DOM轮询一段时间.WebDriver将等待上述时间,并且它将不会尝试再次查找元素指定的时间段。一旦指定的时间结束,它将在抛出异常之前再次尝试再次搜索元素。主要的缺点是时间很长,因为驱动程序在继续之前等待指定的时间
明确等待
在某种情况下,如果某个特定元素需要超过一分钟才能加载,您可以简单地在所需元素上单独设置一个时间。通过遵循这一点,您的浏览器隐含等待时间对于每个元素都是短的,并且对于特定元素它将是大的。默认轮询周期是500毫秒,即它将检查每500毫秒间隔的元素。
流利等待 如果你有一个元素有时会在1秒内出现,有些时候需要几分钟才会出现。在这种情况下,最好使用流畅的等待,因为这将尝试一次又一次地找到元素,直到找到它或直到最后的计时器用完为止。您可以在流畅的等待中设置轮询时间 用户还可以配置wait以忽略特定类型的异常,例如NosuchElementException
// 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"));
}
})
答案 3 :(得分:-1)
隐式等待:隐式等待告诉Web驱动程序在尝试查找元素时等待每个实例。就像全局等待所有driver.findelement实例一样。它将强制Web驱动程序等待元素出现在页面或定义的时间,无论最早。缺点是,即使在定义的时间跨度内未在页面上加载元素,它也会引发异常。
显式等待:显式等待有两种类型:
都是类和实现Wait接口。
WebDriverWait应用于具有已定义的预期条件和时间的特定元素。此等待仅适用于指定的元素。当找不到元素时,此等待也会抛出异常。
WebDriverWait wait = new WebDriverWait (driver, 20);
wait.until(ExpectedConditions.VisibilityofElementLocated(By.xpath(""//button[@value='Save Changes']"")));
Fluent wait:Fluent wait是另一种显式等待,你可以定义轮询并忽略异常以继续执行脚本,如果找不到元素。
new FluentWait<WebDriver>(driver).withTimeout(30, TimeUnit.SECONDS).pollingevery(10, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
答案 4 :(得分:-1)
ImplicitWait
强> ImplicitWait
是一个实施,用于配置 WebDriver
实例,即driver
以轮询 HTML DOM
一段时间( NANOSECONDS
, MICROSECONDS
, MILLISECONDS
,的中间点SECONDS
, MINUTES
, HOURS
或 DAYS
)时试图找到一个或多个元素,如果它们不是立即可用的。默认设置为 0 ,这意味着driver
在找到查找元素的指令时,搜索开始,结果立即可用。
在这种情况下,在重新加载网页之后,可能会立即搜索/找不到一个或多个元素。因此,Automation Script
可能面临以下任何例外:
NoSuchElementException
强> TimeoutException
强> ElementNotVisibleException
强> ElementNotSelectableException
强> 因此我们引入 ImplicitWait
。通过引入 ImplicitWait
,driver
将轮询 HTML DOM
了解配置的一段时间内的元素。到那时,HTML DOM
可能会提供您一直在寻找的元素。与您的代码一样,您已将 ImplicitWait
设置为 10 秒的值,driver
将轮询 {{1} 10 秒。
<强>的Python 强>:
HTML DOM
<强>爪哇强>:
driver.implicitly_wait(10)
最后,设置 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
后, ImplicitWait
实例即 WebDriver
能够携带这种配置直到它的生命周期。但是,如果您需要更改 driver
实例的粗略时间,即 WebDriver
更改为 driver
然后你可以按如下方式重新配置它:
<强>的Python 强>:
wait
<强>爪哇强>:
driver.implicitly_wait(5)
如果您想在任何时候取消 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
,请按以下步骤重新配置:
<强>的Python 强>:
ImplicitWait
<强>爪哇强>:
driver.implicitly_wait(0)
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
强> Fluent Wait
是Wait
界面的实现,我们可以通过该界面配置 Fluent Wait
和 timeout
在飞行中。可以定义polling interval
的实例来配置等待条件的最大时间量以及必须检查条件的频率。用户还可以在等待页面上的 FluentWait
等元素时将等待配置为忽略特定类型的 exceptions
。
<强> NoSuchElementExceptions
强>
Usage
// 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"));
}
});
强> ExplicitWait
通常称为WebDriverWait
,是FluentWait
的专门实现,用户可以通过该实现为 {{1}定义,配置和实施在继续下一行代码之前等待某个条件得到满足的实例实例。有一些方法可以帮助我们实施只需要等待的 ExplicitWait
。 WebDriver
与 ExplicitWait
相结合,可以实现 WebDriverWait
。
ExpectedCondition
ExplicitWait
的这种实现在投掷 import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
.
.
.
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.click();
之前等待最多10秒,或者如果它找到该元素,那么它将在0内返回到10秒。默认情况下, ExplicitWait
会每隔500毫秒调用 TimeoutException
,直到成功返回。 WebDriverWait
函数类型的成功返回值是 ExpectedCondition
值true或非null对象。
在为ExpectedCondition
自动化Web浏览器时,经常会遇到一些情况。 Java,C#和Python绑定包括那些方便的方法,因此我们不必自己编写 Boolean
类,也不必为它们创建自己的实用程序包。一些 Testing Web/Mobile Applications
是:
ExpectedCondition
强> Expected Conditions
强> alertIsPresent()
强> elementToBeClickable(locator)
强> elementToBeSelected(WebElement)
强> 您可以在此处找到Expected Conditions
支持的所有方法。
答案 5 :(得分:-1)
我在这里没有看到ExplicitWait(WebDriverWait)和FluentWait之间的太大区别。由于WebDriverWait是FluentWait的子类,因此WebDriverWait也可以实现FluentWait的所有功能。
WebDriverWait还可以设置轮询时间,最大等待时间和忽略任何异常。