隐式vs显式vs流利等待

问题描述 投票:0回答:1

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

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

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

java python selenium selenium-webdriver webdriver
1个回答
0
投票

ImplicitWait

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

在这种情况下,在新加载网页之后,可能/可能在立即搜索中找不到元素。所以你的Automation Script可能面临以下任何例外情况:

  • NoSuchElementException
  • TimeoutException
  • ElementNotVisibleException
  • ElementNotSelectableException

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

  • 蟒蛇: driver.implicitly_wait(10)
  • Java的: driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

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

  • 蟒蛇: driver.implicitly_wait(5)
  • Java的: driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

如果在任何时候您想要使ImplicitWait无效,您可以按如下方式重新配置它:

  • 蟒蛇: 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<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

通常称为ExplicitWaitWebDriverWaitFluentWait的专用实现,用户可以通过该实现为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函数类型的成功返回值是true或非null对象的Boolean值。

预期条件:

在为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秒钟。

© www.soinside.com 2019 - 2024. All rights reserved.