使用 while 循环等待而不是 Selenium webdriver 等待
Using while loop for wait instead of Selenium webdriver waits
我正在自动化发生重定向并导致页面更改的场景(意味着用户将从一个页面导航到另一个页面),尽管重定向发生在同一屏幕中,但不会打开其他 window .我想执行一些操作,一旦用户将重定向到下一个屏幕。如果不等待,就不可能在这种情况下工作。有两种方法:
- 我正在尝试使用 selenium 等到 URL 更改为第二个屏幕。尽管出现错误,因为无法在给定时间内找到它。
我尝试使用 java while 循环并使用
等到 URL 发生变化
while(getDriver().getCurrentUrl().contains("Fraction of URL")) {
}
这个对我有用。
我只是想知道 #2 是否会被认为是正确的方法,还是我应该深入挖掘并采用 #1 方法
我们的应用程序使用 AJAX 并且我们的框架基于 BDD+Selenium
如果您知道下一页的 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 循环如果新页面未加载,将 运行 无限期地
如果您等到重定向页面中的某些元素可点击或出现或其他什么,该怎么办?
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"))
等等..
我正在自动化发生重定向并导致页面更改的场景(意味着用户将从一个页面导航到另一个页面),尽管重定向发生在同一屏幕中,但不会打开其他 window .我想执行一些操作,一旦用户将重定向到下一个屏幕。如果不等待,就不可能在这种情况下工作。有两种方法:
- 我正在尝试使用 selenium 等到 URL 更改为第二个屏幕。尽管出现错误,因为无法在给定时间内找到它。
我尝试使用 java while 循环并使用
等到 URL 发生变化while(getDriver().getCurrentUrl().contains("Fraction of URL")) { }
这个对我有用。
我只是想知道 #2 是否会被认为是正确的方法,还是我应该深入挖掘并采用 #1 方法
我们的应用程序使用 AJAX 并且我们的框架基于 BDD+Selenium
如果您知道下一页的 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 循环如果新页面未加载,将 运行 无限期地
如果您等到重定向页面中的某些元素可点击或出现或其他什么,该怎么办?
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"))
等等..