隐式 vs 显式 vs 流畅等待



隐式、显式、流畅等待之间有什么区别?

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

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

ImplicitWait

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

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

  • NoSuchElementException
  • TimeoutException
  • ElementNotVisibleException
  • ElementNotSelectableException

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

  • 蟒:

    driver.implicitly_wait(10)
    
  • 爪哇岛:

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

最后,一旦你设置了隐式等待WebDriver实例,即驱动程序能够携带这个配置直到它的生存期。但是,如果您需要更改WebDriver实例的粗略时间,即等待驱动程序,则可以按如下方式重新配置它:

  • 蟒:

    driver.implicitly_wait(5)
    
  • 爪哇岛:

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

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

  • 蟒:

    driver.implicitly_wait(0)
    
  • 爪哇岛:

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

流利等待

Fluent Wait 是 Wait 接口的实现,通过该接口我们可以动态配置超时轮询间隔。可以定义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 通常称为 WebDriverWait 是 FluentWait 的专用实现,通过它,用户可以定义、配置和实现WebDriver实例,以等待满足特定条件,然后再继续下一行代码。 有一些方法可以帮助我们实现 ExplicitWait,这些方法只会根据需要等待。WebDriverWait 与 ExpectConditions 结合使用是实现 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 毫秒调用一次ExpectCondition,直到它成功返回。ExpectCondition函数类型的成功返回值是 true 或非 null 对象的Boolean值。


预期条件:

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

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

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


此特定查询:

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

因此,根据第一种情况,驾驶员将仅等待 3 秒

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

那个时候它会继续前进,而不是等待设定的时间。

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

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

相关内容

  • 没有找到相关文章

最新更新