5

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

驱动程序=新的C​​hromeDriver(功能);

driver.manage().deleteAllCookies();

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

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

4

5 回答 5

3

Implicit wait is defined once right after the driver initialization for the driver life time, and it sets the maximum amount of time for the driver to look foe WebElement.

Explicit wait is used to wait up to the given amount of time for the WebElement to be in cretin condition, and need to be used each time you are waiting for condition to met.

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

于 2017-08-16T11:50:26.897 回答
2

显式等待

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


一个例子

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

解释

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


预期条件

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

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

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


诱导显式等待

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

  • NoSuchElementException
  • ElementNotVisibleException
  • ElementNotSelectableException

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

Element is Clickable意味着Element is Displayed 和 Enabled


奥特罗

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

于 2017-08-16T14:05:17.983 回答
1

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

现在,如果存在需要显式等待的元素,那么只需在执行某些操作之前声明它或使用相同的引用。显式等待不适用于 out like 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

于 2017-08-16T11:41:20.263 回答
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();

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

于 2019-03-11T17:25:14.147 回答
0

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

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

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

于 2017-08-16T14:52:33.543 回答