隐式等待、显式等待、流畅等待

use*_*181 1 selenium selenium-webdriver webdriverwait fluentwait implicitwait

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

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

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

Deb*_*anB 7

隐式等待

\n\n

ImplicitWait是配置WebDriver实例的实现,即驱动程序在尝试查找不立即可用的一个或多个元素时轮询HTML DOM一段时间(以NANOSECONDSMICROSECONDSMILLISECONDSSECONDSMINUTESHOURS为单位)。DAYS默认设置为0,表示驱动程序在找到查找一个或多个元素的指令时,将开始搜索并立即提供结果。

\n\n

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

\n\n
    \n
  • NoSuchElementException
  • \n
  • TimeoutException
  • \n
  • ElementNotVisibleException
  • \n
  • ElementNotSelectableException
  • \n
\n\n

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

\n\n\n\n

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

\n\n\n\n

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

\n\n\n\n
\n\n

流畅等待

\n\n

Fluent Wait是Wait接口的实现,通过它我们可以动态配置超时轮询间隔可以定义FluentWait的实例来配置等待条件的最长时间以及必须检查条件的频率。用户还可以配置等待,以在等待元素时忽略特定类型的异常,例如页面上的NoSuchElementException 。

\n\n
    \n
  • 用法:

    \n\n
       // Waiting 30 seconds for an element to be present on the page, checking\n   // for its presence once every 5 seconds.\n   Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)\n       .withTimeout(30, SECONDS)\n       .pollingEvery(5, SECONDS)\n       .ignoring(NoSuchElementException.class);\n\n   WebElement foo = wait.until(new Function<WebDriver, WebElement>() {\n     public WebElement apply(WebDriver driver) {\n       return driver.findElement(By.id("foo"));\n     }\n   });\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n
\n\n

显式等待

\n\n

ExplicitWait(通常称为WebDriverWait)是FluentWait的专门实现,用户可以通过它定义、配置和实现 WebDriver实例,以等待满足特定条件,然后再继续执行下一行代码。有一些方法可以帮助我们实现ExplicitWait,它只等待需要的时间。WebDriverWait与ExpectedConditions结合是ExplicitWait 的方式之一是实现

\n\n

一个例子:

\n\n
import org.openqa.selenium.WebElement;\nimport org.openqa.selenium.support.ui.ExpectedConditions;\nimport org.openqa.selenium.support.ui.WebDriverWait;\n.\n.\n.\nWebDriverWait wait = new WebDriverWait(driver, 10);\nWebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));\nelement.click();\n
Run Code Online (Sandbox Code Playgroud)\n\n

解释:

\n\n

ExplicitWait的此实现在抛出 a 之前最多等待 10 秒TimeoutException,或者如果找到该元素,则它将在 0 到 10 秒内返回。WebDriverWait默认情况下每 500 毫秒调用一次ExpectedCondition,直到成功返回。ExpectedCondition函数类型的成功返回值为Booleantrue 值或非空对象。

\n\n
\n\n

预期条件:

\n\n

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

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

您可以找到Expected Conditions支持的所有方法

\n\n
\n\n

这个特定的查询:

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

所以按照第一种情况,司机只会等待3秒

\n


归档时间:

查看次数:

4081 次

最近记录:

4 年,2 月 前