使用while循环等待而不是Selenium Webdriver等待

时间:2019-01-29 13:34:57

标签: selenium-webdriver webdriverwait

我正在自动进行重定向并导致页面更改的情况(这意味着用户将从一个页面导航到另一页面),尽管重定向发生在同一屏幕上,但不会打开其他窗口。我要执行一些操作,一旦用户将重定向到下一个屏幕。没有等待,就不可能在这种情况下工作。有两种方法:

  1. 我一直在尝试使用硒,直到URL更改为第二个屏幕。尽管由于在给定时间内找不到它而出现错误。
  2. 我尝试使用java while循环,并使其等待直到URL更改为止

    while(getDriver()。getCurrentUrl()。contains(“ URL的分数”)){ }

这个正在为我工​​作。

我只是想知道#2是否会被认为是正确的方法,还是我应该继续研究#1?

我们的应用程序使用AJAX,我们的框架基于BDD + Selenium

2 个答案:

答案 0 :(得分: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循环相反如果新页面未加载,则将无限期运行

答案 1 :(得分:0)

如果您等到重定向页面中的某些元素可单击或存在,或者该怎么办?

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")) 等等。