【问题标题】:Replace implicit wait with explicit wait (selenium webdriver & java)用显式等待替换隐式等待(selenium webdriver 和 java)
【发布时间】:2018-01-24 12:43:26
【问题描述】:

如何用显式等待替换这种隐式等待?

driver = new ChromeDriver(capabilities);

driver.manage().deleteAllCookies();

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

这在 Before 方法中使用。我能够替换代码中的所有 Thread.sleep(),但我不确定该怎么做。

【问题讨论】:

  • 这样做的原因是什么?在大多数情况下,隐式等待比显式等待要好。
  • 我明白,作为最佳实践,建议不要混合使用隐式等待和显式等待。我还选择使用显式等待,因为它可以节省 Maven 运行测试的时间
  • @AbhishekSingh 使用隐式等待不是一个好的做法(应该避免),而使用显式等待是一个最佳做法。
  • @JeffC 我真的很奇怪有些人说我们应该使用 explict others 隐式,你们在哪里找到你的参考资料?
  • @eusoubrasileiro 其中一些来自阅读大量文章等,但我不记得有什么是我脑海中浮现的。我确实记得几年前在 seleniumconf 上看到 Simon Stewart 在他的主题演讲中说不要使用它。 Simon Stewart 是 Selenium 项目的负责人。您可以在youtu.be/gyfUpOysIF8?t=2200 找到他的主题演讲。那是排队到他在隐式等待而不使用它的地方。那年我在 seleniumconf 上看到了其他一些贡献者对它的评论,但我不记得是哪些视频。

标签: java selenium selenium-webdriver webdriverwait implicitwait


【解决方案1】:

一旦您声明了implicitlyWait,它将在整个脚本运行过程中应用于您的所有元素。所以首先声明它以防止脚本失败。

现在如果有元素需要显式等待,那么只需在执行某些操作之前声明它或使用相同的引用。像implicitlyWait 一样,不会完全应用显式等待。

例子:-

WebElement seleniumlink;
seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='add_files_btn']")));
seleniumlink.click();

更多详情请参考以下链接:-

https://www.guru99.com/implicit-explicit-waits-selenium.html

【讨论】:

  • 听起来你说的是在同一个脚本中同时存在隐式和显式等待,不推荐。
  • 我想知道在同一个脚本中使用两者的复杂性...请提供一些链接,以便我更好地理解
  • 在我的回答中查看链接(以及该链接中的文本)。还有其他来源,但来自官方文档。您还可以参考 DebanjanB 的答案中的一些链接,以获取 Selenium 贡献者完全不建议使用隐式等待的视频链接。
【解决方案2】:

隐式等待在driver 初始化之后立即定义一次,用于driver 生命周期,它设置driver 与WebElement 对抗的最长时间。

显式等待用于在给定的时间内等待WebElement 处于白痴状态,并且需要在每次等待满足条件时使用。

您不能用显式等待“替换”隐式等待定义,因为它们是不同的东西,此时没有条件等待。

【讨论】:

    【解决方案3】:

    显式等待

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


    一个例子

    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 或非空对象。


    预期条件

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

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

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


    诱导显式等待

    要诱导ExplicitWait,首先你必须在你的Test Framework中删除所有对implicitlyWait()的调用。重新开始执行并观察您在哪里面临元素属性的异常。我们将面临的异常将是以下之一:

    • NoSuchElementException
    • ElementNotVisibleException
    • ElementNotSelectableException

    现在,我们需要确认我们需要等待的WebElement 的特定属性。如果要点击考虑中的 WebElement,我们会将 Expected Conditions 视为elementToBeClickable(locator)。

    元素可点击意味着元素已显示并启用。


    结尾

    不要混用隐式等待和显式等待。这样做会导致无法预测的等待时间。例如,设置 10 秒的隐式等待和 15 秒的显式等待,可能会导致 20 秒后发生超时。

    【讨论】:

      【解决方案4】:

      隐式等待设置一次并在驱动程序实例的整个生命周期中应用,因此该行没有真正的替代品。你应该删除它,因为你不想混合隐式和显式等待according to the official docs。

      警告:不要混合隐式和显式等待。这样做可能会导致无法预测的等待时间。

      删除该行后,您需要运行脚本并在需要等待的区域添加显式等待。

      【讨论】:

        【解决方案5】:

        使用隐式和显式等待。

        虽然我们认为显式等待更可取,但您应该检查您正在满足的场景。

        例如,在您的代码中,您调用等待只是为了获得完成删除调用的时间。无需等待即可改进。

         Set<Cookie> cookies = driver.manage().getCookies();
         for(;cookies.size() != 0;){
           driver.manage().deleteAllCookies();
         }
        

        **我想你可以使用 While 循环 **

        话虽如此,使用显式等待。我已经使用它来对应用程序测试期间获得的弹出窗口执行操作。

        WebDriverWait wait = new WebDriverWait(appDriver, 10);
        wait.until(ExpectedConditions.alertIsPresent());
        appDriver.switchTo().alert().dismiss();
        

        因此,如果您可以验证执行条件,请使用无等待,并在您知道要等待什么时使用显式等待。希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2017-04-19
          • 1970-01-01
          • 2013-12-03
          • 1970-01-01
          • 2012-05-11
          • 1970-01-01
          • 2013-05-28
          相关资源
          最近更新 更多