繁体   English   中英

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

[英]Replace implicit wait with explicit wait (selenium webdriver & java)

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

驱动程序 = 新的 ChromeDriver(功能);

driver.manage().deleteAllCookies();

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

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

隐式等待在driver初始化后立即定义为driver生命周期,它设置driver查找敌人WebElement的最长时间。

显式等待用于等待WebElement处于 cretin 条件的给定时间量,并且需要在每次等待条件满足时使用。

你不能用显式等待“替换”隐式等待定义,因为它们是不同的东西,在这一点上没有条件等待。

显式等待

根据文档ExplicitWait是您为WebDriver实例定义、配置和实现的代码块,以在继续执行下一行代码之前等待满足特定条件。 有一些方法可以帮助我们实现ExplicitWait只在需要时等待。 WebDriverWaitExpectedConditions相结合是可以实现ExplicitWait的方法之一。


一个例子

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

说明

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


预期条件

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

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

在这里您可以找到有关预期条件支持的所有方法。


诱导显式等待

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

  • NoSuchElementException
  • ElementNotVisibleException
  • ElementNotSelectableException

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

Element is Clickable意味着Element is Displayed and Enabled


奥特罗

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

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

隐式等待设置一次并在驱动程序实例的整个生命周期中应用,因此该行没有真正的替代品。 您应该删除它,因为您不想根据官方文档混合隐式和显式等待。

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

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

使用隐式和显式等待。

虽然我们权衡了显式等待更可取,但您应该检查您正在迎合的场景。

例如,在您的代码中,您调用等待只是为了获得完成删除调用的时间。 可以在不使用任何等待的情况下进行改进。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM