用显式等待替换隐式等待(selenium webdriver& java)

时间:2017-08-16 11:32:22

标签: java selenium selenium-webdriver webdriverwait implicitwait

如何用明确的等待替换此隐式等待?

  

driver = new ChromeDriver(功能);

     

driver.manage()deleteAllCookies();

     

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

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

5 个答案:

答案 0 :(得分:1)

隐含等待是在driver生命周期的driver初始化后立即定义的,它设置了driver看待对方WebElement的最长时间。

明确等待用于等待WebElement处于克里汀状态的给定时间,并且每次等待条件满足时都需要使用。

你无法替换"带有显式等待的隐式等待定义,因为它们是不同的东西,并且在这一点上没有条件等待。

答案 1 :(得分:0)

一旦声明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

答案 2 :(得分:0)

什么是ExplicitWait

根据documentation here ExplicitWait 是您为 WebDriver 实例定义,配置和实施的代码块在继续下一行代码之前等待某个条件得到满足。有一些方法可以帮助我们实施只需要等待的 ExplicitWait WebDriverWait ExpectedCondition 相结合,可以实现 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或非null对象。

预期条件:

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

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

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

诱导ExplicitWait

要诱导 ExplicitWait ,首先您必须删除 implicitlyWait() <中 Test Framework 的所有来电/ strong>即可。开始一个新的执行,并观察您面对元素属性的异常。我们将面临的例外情况之一是:

  • NoSuchElementException
  • ElementNotVisibleException
  • ElementNotSelectableException

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

  

Element is Clickable - 在元素显示并启用时实施。

  

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

答案 3 :(得分:0)

使用隐式和显式等待。

尽管我们认为显式等待是更明智的选择,但您应该检查适合您的情况。

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

 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();

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

答案 4 :(得分:-1)

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

  

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

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