隐式vs显式vs流利等待

隐式,明确,流利等待有什么区别?

如果我们在隐式等待和10秒之前设置10秒,则在3秒内只有元素到达。

那个时候会发生什么? 它将等待10秒或继续进行。

ImplicitWait

ImplicitWait是一个配置WebDriver实例的实现,即driver在尝试查找一个或多个元素时轮询HTML DOM一段时间( NANOSECONDSMICROSECONDSMILLISECONDSSECONDSMINUTESHOURSDAYS MICROSECONDS )没有立即可用。 默认设置为0 ,这意味着driver在找到查找元素的指令时,搜索开始并且结果立即可用。

在这种情况下,在新加载网页之后,可以在立即搜索中找到/不可以找到一个或多个元素。 因此,您的Automation Script可能面临以下任何exception:

  • NoSuchElementException
  • TimeoutException
  • ElementNotVisibleException
  • ElementNotSelectableException

因此我们介绍了ImplicitWait 。 通过引入ImplicitWaitdriver将轮询HTML DOM以查找一个或多个元素的配置时间。 到那时,您一直在寻找的元素可能在HTML DOM可用。 在您的代码中,您已将ImplicitWait设置为10秒的值, driver将轮询HTML DOM 10秒。

  • Python

     driver.implicitly_wait(10) 
  • Java

     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

最后,一旦设置了ImplicitWaitWebDriver实例即driver就能够将此配置带到其生命周期。 但是,如果您需要更改WebDriver实例的粗略时间,即driverwait那么您可以按如下方式重新配置它:

  • 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 WaitWait接口的实现,通过它我们可以动态配置timeoutpolling 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通常称为WebDriverWaitFluentWait一种专用实现,通过该实现,用户可以为WebDriver实例定义,配置和实现等待某个条件得到满足,然后再继续执行下一行代码。 有一些方法可以帮助我们实现只在需要时才会等待的ExplicitWaitWebDriverWaitExpectedCondition结合使用是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秒钟