1

隐式,显式,流利的等待有什么区别?

如果我们在隐式等待中设置 10 秒并且在 10 秒之前,则在 3 秒内只有元素被定位。

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

4

3 回答 3

3

隐式等待

ImplicitWait是一种配置WebDriver实例的实现,即驱动程序在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询HTML DOM一定时间(中间是NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS,或)。默认设置为0,这意味着驱动程序在找到查找一个或多个元素的指令时,将开始搜索并立即获得结果。MINUTESHOURSDAYS

在这种情况下,在重新加载网页后,一个或多个元素可能会/可能不会在立即搜索中找到。因此,您的自动化框架可能面临以下任何异常:

  • NoSuchElementException
  • TimeoutException
  • ElementNotVisibleException
  • ElementNotSelectableException

因此,您需要诱导ImplicitWait。通过引入ImplicitWait驱动程序将在配置的时间内轮询DOM 树,以查找一个或多个元素。到那时,您一直在寻找的一个或多个元素可能在 DOM 中可用。在您的代码中,您已经将ImplicitWait设置为10秒的值,驱动程序将轮询 DOM 10秒。

  • Python:

    driver.implicitly_wait(10)
    
  • 爪哇:

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

最后,一旦您设置了ImplicitWaitWebDriver实例(即驱动程序)就能够携带此配置直到其生命周期。但是,如果您需要更改WebDriver实例的粗略时间,即驱动程序等待,那么您可以重新配置它,如下所示:

  • Python:

    driver.implicitly_wait(5)
    
  • 爪哇:

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

如果您想在任何时候取消ImplicitWait,您可以按如下方式重新配置它:

  • Python:

    driver.implicitly_wait(0)
    
  • 爪哇:

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

流利的等待

Fluent WaitWait接口的实现,通过它我们可以动态配置超时轮询间隔可以定义FluentWait的实例来配置等待条件的最长时间以及必须检查条件的频率。用户还可以配置等待以在等待元素时忽略特定类型的异常,例如页面上的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"));
         }
       });
    

显式等待

ExplicitWait俗称WebDriverWaitFl​​uentWait的一种特殊实现,用户可以通过它定义、配置和实现WebDriver实例,等待满足一定条件后再进行下一行代码。有一些方法可以帮助我们实现ExplicitWait,它只会在需要的时候等待。WebDriverWaitExpectedConditions的结合是可以实现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的这种实现在抛出 a 之前最多等待 10 秒,TimeoutException或者如果它找到元素,那么它将在 0 到 10 秒内返回。默认情况下, WebDriverWait每 500 毫秒调用一次ExpectedCondition,直到它成功返回。ExpectedCondition函数类型的成功返回值是Booleantrue 值或非空对象。


预期条件:

在自动化 Web 浏览器以测试 Web/移动应用程序时,经常会遇到一些情况。Java、C# 和 Python 绑定包括那些方便的方法,因此我们不必自己编写ExpectedCondition类或为它们创建自己的实用程序包。一些预期的条件是:

  • alertIsPresent()
  • elementToBeClickable(locator)
  • elementToBeSelected(WebElement)
  • frameToBeAvailableAndSwitchToIt(locator)
  • invisibilityOf(element)

您可以在此处找到有关预期条件支持的所有方法。


这个特定的查询:

  • 搜索单个元素时,驱动程序将轮询 OM,直到找到该元素或配置的超时到期,然后再抛出NoSuchElementException.
  • 当搜索多个元素时,驱动程序将轮询 DOM,直到找到至少一个元素或配置的超时已过期。

因此,根据第一种情况,司机只会等待3 秒

于 2018-01-09T07:04:27.737 回答
1

如果我们在隐式等待中设置 10 秒并且在 10 秒之前,则在 3 秒内只有元素被定位。

到时候它将继续进行而不是等待设定的时间..

于 2020-01-27T11:43:10.727 回答
0

隐式等待将告诉 Web 驱动程序在抛出“NoSuchElementException”之前等待一定的时间。默认设置为 0。一旦我们设置了时间,Web 驱动程序将在抛出异常之前等待该时间。如果您给定 10 秒作为等待时间,但在 3 秒时识别出元素,则它将在 3 秒后进入下一步。

显式等待是您定义的代码,用于在继续执行代码之前等待某个条件发生。显式等待将告诉 Web 驱动程序在抛出 NoSuchElementException 异常之前等待某些条件,例如 visibilityOfElementLocated 和最长时间。你可以参考这个 - https://qaautomation.expert/2019/07/18/implicit-explicit-fluent-wait-in-selenium-webdriver/

于 2020-02-07T17:06:56.280 回答