【问题标题】:Using while loop for wait instead of Selenium webdriver waits使用 while 循环等待而不是 Selenium webdriver 等待
【发布时间】:2019-01-29 13:34:57
【问题描述】:
我正在自动化一个发生重定向并导致页面更改的场景(意味着用户将从一个页面导航到另一个页面),尽管重定向发生在同一屏幕上,但不会打开其他窗口。一旦用户重定向到下一个屏幕,我想执行一些操作。如果没有等待,就不可能在这种情况下工作。有两种方法:
- 我尝试使用 selenium 等到 URL 更改为第二个屏幕。虽然由于无法在给定时间内找到它而出现错误。
-
我尝试过使用 java while 循环并让它等到 URL 更改使用
while(getDriver().getCurrentUrl().contains("URL 的分数")) {
}
这个对我有用。
我只是想知道#2 是否会被认为是正确的方法,还是我应该挖掘更多并采用#1 方法
我们的应用程序使用 AJAX,我们的框架基于 BDD+Selenium
【问题讨论】:
标签:
selenium-webdriver
webdriverwait
【解决方案1】:
如果您知道下一页的 URL 是什么,或者其中一些与第一页不同,那么最好的选择是使用 FluentWait 而不是循环。示例:
FluentWait<WebDriver> webDriverWait = new WebDriverWait(driver, 60).pollingEvery(Duration.ofSeconds(2));
webDriverWait.until(ExpectedConditions.urlContains("Fraction of new URL"));
或者如果你的新 URL 是完全随机的,你可以使用:
webDriverWait.until(ExpectedConditions.not(ExpectedConditions.urlContains("Fragment of URL")));
但是这会不太可靠,因为它可能会在某个中间点验证它,并且实际上并不能验证您是否到达了正确的页面,只是您离开了最后一个页面。
这将创建一个最长持续时间为 60 秒的等待,但它每 2 秒检查一次条件。您可以将最大时间调整为响应时间所需的任何时间,但轮询确保它只需要它需要的时间,同时还确保它有一个失败的路径,如果有一个真正的错误,而不是 while 循环,它如果新页面未加载,将无限期运行
【解决方案2】:
如果您等到重定向页面中的某些元素可点击或出现或其他什么?
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(Duration.ofSeconds(4))
.pollingEvery(Duration.ofMillis(500));
以及您需要等待的地方:
wait.until(ExpectedConditions.elementToBeClickable(WebElement));
有很多不同的等待:.toBeClickabe(WebElement), .visibilityOfAllElements(List<WebElement>), .presenceOfAllElementsLocatedBy(By.Xpath("xpath selector"))
等等..