隐式,明确,流利等待有什么区别?
如果我们在隐式等待和10秒之前设置10秒,则在3秒内只有元素到达。
那个时候会发生什么?它将等待10秒或继续进行。
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
将轮询HTML DOM
10秒。
driver.implicitly_wait(10)
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
最后,一旦你设置了ImplicitWait
,WebDriver
实例,即driver
能够携带这种配置直到它的生命周期。但是如果您需要更改WebDriver
实例的时间粗略,即driver
到wait
,那么您可以按如下方式重新配置它:
driver.implicitly_wait(5)
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
如果在任何时候您想要使ImplicitWait
无效,您可以按如下方式重新配置它:
driver.implicitly_wait(0)
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<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
通常称为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
函数类型的成功返回值是true或非null对象的Boolean
值。
在为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秒钟。