如何用显式替换这个隐式等待?
driver = new ChromeDriver(功能);
。driver.manage()deleteAllCookies();
driver.manage()。timeouts()。implicitlyWait(10,TimeUnit.SECONDS);
这在Before Method中使用。我能够替换代码中的所有Thread.sleep(),但我不知道该怎么做。
隐含等待是在driver
初始化driver
生命时间后立即定义的,它设置了driver
看起来foe WebElement
的最大时间。
显式等待用于等待WebElement
处于克里汀状态的给定时间量,并且每次等待条件时都需要使用。
你不能用显式等待“替换”隐式等待定义,因为它们是不同的东西,并且在这一点上没有条件等待。
一旦你宣布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
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
函数类型的成功返回值是true或非null对象的Boolean
值。
在为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
的调用。开始一个新的执行,并观察您面对元素属性的异常。我们将面临的例外情况将是以下任何一种情况:
NoSuchElementException
ElementNotVisibleException
ElementNotSelectableException
现在,我们需要确认我们需要等待的WebElement
的特定属性。如果要点击WebElement
,我们会将Expected Conditions
视为elementToBeClickable(locator)
Element is Clickable
- 在元素显示和启用时实现。
Note
:不要混合implicit and explicit waits
。这样做会导致unpredictable wait times
。例如,设置10秒的隐式等待和15秒的显式等待可能导致20秒后发生超时。
使用隐式和显式等待。
虽然我们称明显等待更合适,但您应该检查您正在迎合的情景。
例如,在您的代码中,您正在调用等待以获取完成删除调用的时间。这可以在不使用任何等待的情况下进行改进。
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();
因此,如果您可以验证执行条件,请不要等待,并在知道要等待的内容时使用显式等待。希望这个对你有帮助。
隐式等待设置一次并在驱动程序实例的整个生命周期中应用,因此该行没有真正的替代品。你应该删除它,因为你不想混合隐式和显式等待according to the official docs。
警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。
删除该行后,您将需要运行脚本并在需要等待的区域中添加显式等待。