【问题标题】:How exactly explicit wait is different from implicit except(Conditional wait) as both wait execute next step before specified time completes?显式等待与隐式除(条件等待)有何不同,因为两者在指定时间完成之前都等待执行下一步?
【发布时间】:2018-12-12 06:57:57
【问题描述】:

据我所知,显式等待是有条件的等待,如果在指定时间之前找到元素,它将继续执行下一步。如代码所示,即使在 10 秒之前找到元素,隐式等待也不应该执行下一步,而是立即执行下一步,即在 2 秒内。它不会在整个 10 秒内继续轮询 DOM。还请建议如何根据示例决定使用哪个等待?我经历了很多问题,但都是复制粘贴,期待架构级别的答案。

WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
String appUrl = "https://www.facebook.com/";
driver.get(appUrl);
driver.manage().window().maximize();
WebElement username = driver.findElement(By.xpath("//input[@id='email']"));

【问题讨论】:

标签: selenium-webdriver webdriver webdriverwait


【解决方案1】:

隐式等待

ImplicitWait 用于指定 WebDriver 实例,即 驱动程序 在搜索元素时应等待的时间量,如果它没有立即出现在 @987654322 中@ 就NANOSECONDSMICROSECONDSMILLISECONDSSECONDSMINUTESHOURSDAYS 而言,在尝试查找一个或多个元素(如果它们不是立即可用)时。默认设置为0,这意味着driver 当找到查找一个或多个元素的指令时,搜索开始并且结果立即可用。

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

因此我们引入 ImplicitWait。通过引入ImplicitWait驱动程序将轮询DOM Tree,直到在配置的时间内找到元素,然后在抛出NoSuchElementException之前寻找元素或元素.到那时,您一直在寻找的一个或多个元素可能在 HTML DOM 中可用。在您的代码中,您已经将 ImplicitWait 设置为 10 秒的值,驱动程序 将轮询 HTML DOM 10 秒。

  • Java

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

最后,一旦你设置了 ImplicitWaitWebDriver 实例,即 driver 就可以承载这个配置了直到它的一生。但是,如果您需要更改 WebDriver 实例的粗略时间,即 driverwait,那么您可以重新配置如下:

  • Java

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

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

  • Java

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

您可以在Using implicit wait in selenium找到详细讨论


显式等待

ExplicitWait 是您为 WebDriver 实例定义、配置和实现的代码块,以等待满足特定条件,然后再继续执行下一行代码。有一些方法可以帮助我们实现 ExplicitWait,它只会在需要时等待。 WebDriverWait 结合 ExpectedCondition 是实现 ExplicitWait 的方式之一。

一个例子:

  • Java

    driver.get("http://www.example.com/");
    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("element_css"))).click();
    

解释:

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

预期条件:

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

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

这里你可以找到Expected Conditions支持的所有方法。

您可以在Replace implicit wait with explicit wait (selenium webdriver & java)找到详细讨论。


Note请勿混用 implicit and explicit waits。这样做会导致 unpredictable wait times。例如,设置 10 秒的隐式等待和 15 秒的显式等待,可能会导致 20 秒后发生超时。

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 2017-04-19
    • 2020-10-04
    • 1970-01-01
    • 2021-04-05
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多