隐式vs显式vs流利等待

时间:2018-01-08 06:16:04

标签: java python selenium selenium-webdriver webdriver

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

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

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

3 个答案:

答案 0 :(得分:0)

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将轮询 {{1} 10 秒。

  • <强>的Python

    HTML DOM
  • <强>爪哇

    driver.implicitly_wait(10)
    

最后,设置 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 后, ImplicitWait 实例即 WebDriver 能够携带这种配置直到它的生命周期。但是,如果您需要更改 driver 实例的粗略时间,即 WebDriver 更改为 driver 然后你可以按如下方式重新配置它:

  • <强>的Python

    wait
  • <强>爪哇

    driver.implicitly_wait(5)
    

如果您想在任何时候取消 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); ,请按以下步骤重新配置:

  • <强>的Python

    ImplicitWait
  • <强>爪哇

    driver.implicitly_wait(0)
    

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

Fluent WaitWait界面的实现,我们可以通过该界面配置 Fluent 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 通常称为WebDriverWait,是FluentWait的专门实现,用户可以通过该实现为 {{1}定义,配置和实施在继续下一行代码之前等待某个条件得到满足的实例实例。有一些方法可以帮助我们实施只需要等待的 ExplicitWait 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(); 之前等待最多10秒,或者如果它找到该元素,那么它将在0内返回到10秒。默认情况下, ExplicitWait 会每隔500毫秒调用 TimeoutException ,直到成功返回。 WebDriverWait 函数类型的成功返回值是 ExpectedCondition 值true或非null对象。

预期条件:

在为ExpectedCondition自动化Web浏览器时,经常会遇到一些情况。 Java,C#和Python绑定包括那些方便的方法,因此我们不必自己编写 Boolean 类,也不必为它们创建自己的实用程序包。一些 Testing Web/Mobile Applications 是:

  • ExpectedCondition
  • Expected Conditions
  • alertIsPresent()
  • elementToBeClickable(locator)
  • elementToBeSelected(WebElement)

您可以在此处找到Expected Conditions支持的所有方法。

此特定查询:

  • 搜索单个元素时,驱动程序将轮询 frameToBeAvailableAndSwitchToIt(locator) ,直到找到元素或配置的超时时间到期,然后再抛出 invisibilityOf(element) < / strong>即可。
  • 搜索多个元素时,驱动程序将轮询 HTML DOM ,直到找到至少一个元素或配置的超时已过期。

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

答案 1 :(得分:0)

如果将“隐式等待”设置为10秒,而将10秒设置为“隐式等待”,则3秒钟之内只能找到元素。

那个时间它将继续进行,而不是等待设置的时间。

答案 2 :(得分:0)

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

显式等待是您定义的代码,用于在继续执行代码之前等待特定条件发生。显式等待将告诉Web驱动程序在引发NoSuchElementException异常之前等待某些条件,如visibleOfElementLocated和最长时间。您可以参考-https://configureselenium.blogspot.com/2019/07/implicit-explicit-fluent-wait-in.html