隐式vs显式vs流利等待
隐式,明确,流利等待有什么区别?
如果我们在隐式等待和10秒之前设置10秒,则在3秒内只有元素到达。
那个时候会发生什么? 它将等待10秒或继续进行。
ImplicitWait
ImplicitWait
是一个配置WebDriver
实例的实现,即driver
在尝试查找一个或多个元素时轮询HTML DOM
一段时间( NANOSECONDS
, MICROSECONDS
, MILLISECONDS
, SECONDS
, MINUTES
, HOURS
或DAYS
MICROSECONDS
)没有立即可用。 默认设置为0 ,这意味着driver
在找到查找元素的指令时,搜索开始并且结果立即可用。
在这种情况下,在新加载网页之后,可以在立即搜索中找到/不可以找到一个或多个元素。 因此,您的Automation Script
可能面临以下任何exception:
-
NoSuchElementException
-
TimeoutException
-
ElementNotVisibleException
-
ElementNotSelectableException
因此我们介绍了ImplicitWait
。 通过引入ImplicitWait
, driver
将轮询HTML DOM
以查找一个或多个元素的配置时间。 到那时,您一直在寻找的元素可能在HTML DOM
可用。 在您的代码中,您已将ImplicitWait
设置为10秒的值, driver
将轮询HTML DOM
10秒。
-
Python :
driver.implicitly_wait(10)
-
Java :
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
最后,一旦设置了ImplicitWait
, WebDriver
实例即driver
就能够将此配置带到其生命周期。 但是,如果您需要更改WebDriver
实例的粗略时间,即driver
要wait
那么您可以按如下方式重新配置它:
-
Python :
driver.implicitly_wait(5)
-
Java :
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
如果在任何时候您想要使ImplicitWait
无效,您可以按如下方式重新配置它:
-
Python :
driver.implicitly_wait(0)
-
Java :
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
Fluent Wait
Fluent Wait
是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
wait = new FluentWait (driver) .withTimeout(30, SECONDS) .pollingEvery(5, SECONDS) .ignoring(NoSuchElementException.class); WebElement foo = wait.until(new Function () { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("foo")); } });
ExplicitWait
ExplicitWait
通常称为WebDriverWait
是FluentWait
一种专用实现,通过该实现,用户可以为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();
说明:
ExplicitWait
这个实现在抛出TimeoutException
之前等待最多10秒,或者如果它找到该元素,那么它将在0到10秒内返回。 默认情况下, WebDriverWait
每500毫秒调用一次ExpectedCondition
直到它成功返回。 ExpectedCondition
函数类型的成功返回值是Boolean
值true或非null对象。
预期条件:
在自动化用于Testing Web/Mobile Applications
Web浏览器时,会遇到一些经常遇到的情况。 Java,C#和Python绑定包括那些方便的方法,因此我们不必自己编写ExpectedCondition
类或为它们创建我们自己的实用程序包。 一些Expected Conditions
是:
-
alertIsPresent()
-
elementToBeClickable(locator)
-
elementToBeSelected(WebElement)
-
frameToBeAvailableAndSwitchToIt(locator)
-
invisibilityOf(element)
您可以在此处找到Expected Conditions
支持的所有方法。
这个特殊的查询:
- 搜索单个元素时,驱动程序将轮询
HTML DOM
直到找到该元素或配置的超时到期,然后再抛出NoSuchElementException
。 - 搜索多个元素时,驱动程序将轮询
HTML DOM
直到找到至少一个元素或配置的超时已过期。
因此,根据第一种情况,驾驶员只会等待3秒钟 。