【问题标题】:Using while loop for wait instead of Selenium webdriver waits使用 while 循环等待而不是 Selenium webdriver 等待
【发布时间】:2019-01-29 13:34:57
【问题描述】:

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

  1. 我尝试使用 selenium 等到 URL 更改为第二个屏幕。虽然由于无法在给定时间内找到它而出现错误。
  2. 我尝试过使用 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&lt;WebElement&gt;), .presenceOfAllElementsLocatedBy(By.Xpath("xpath selector")) 等等..

      【讨论】:

        猜你喜欢
        • 2015-07-18
        • 1970-01-01
        • 2012-05-20
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-26
        相关资源
        最近更新 更多