【问题标题】:How to wait for the ready state of a newly opened window using selenium-webdriver如何使用 selenium-webdriver 等待新打开的窗口的就绪状态
【发布时间】:2019-01-23 04:28:07
【问题描述】:

我是硒的新手。我的应用程序是 2004-2006 年开发的非常旧的应用程序,其他所有操作都会打开一个新窗口。我正在为 Internet Explorer 使用 selenium Web 驱动程序来编写自动化测试用例。

我使用driver.switchTo().window(windowname);在打开的窗口之间切换

但是,当我的测试在我的应用程序的响应时间不时不同的其他环境中运行时,我的测试用例会失败。因此,有时我的测试用例会通过,而有时它们会失败。目前我正在使用 Thread.sleep(THRESHOLD) ,我知道它的坏习惯。我知道WebDriverWait 和三个等待隐式、显式、流畅。但我的问题是他们都没有无限期地等待我得到回应。每个等待都需要一个阈值,直到它检查页面是否准备好,如果响应不在阈值之内,它将失败。无论如何,我可以在哪里动态等待响应,有时响应会立即响应,有时会延迟。在所有情况下,我都不应该输入任何阈值,并且无论响应时间如何,测试用例都应该等待响应。

【问题讨论】:

  • WebDriverWait 接受 long 作为参数。你为什么不使用 Long.MAX_VALUE - 出于所有实际目的,它是无限的。

标签: selenium selenium-webdriver webdriver window-handles webdriverwait


【解决方案1】:

根据您的问题如何等到打开窗口的就绪状态值得一提的是,AUT(被测应用程序)应该有理想情况下打开一个新窗口/标签需要多长时间的基准。

现在正如@KDM 所指出的,WebDriverWait 构造函数是:

  • WebDriverWait(WebDriver driver, java.time.Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut)
  • WebDriverWait(WebDriver driver, long timeOutInSeconds)
  • WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)

在所有三个构造函数中,timeOutInSeconds 都是 long 类型,其 MAX 值为 9223372036854775807,您也可以使用它。


Long.MAX_VALUE

在以下示例中,WebDriver 实例,即 driver 已成功转换为 MAX_VALUElong 类型:

  • 代码块:

    System.out.println("Long.MAX = " + Long.MAX_VALUE);
    System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    WebDriverWait wait_me = new WebDriverWait(driver, 9223372036854775807L);
    System.out.println("Application Opened");
    
  • 控制台输出:

    Long.MAX = 9223372036854775807
    Application Opened
    

numberOfWindowsToBe()

最后,当你使用定制的显式等待来访问新打开的窗口/标签时,总是使用ExpectedConditions类中的numberOfWindowsToBe()方法,然后收集 windowHandles 如下:

  • 示例代码块(Java):

    driver.get("http://www.google.com");
    System.out.println("Page Title is : "+driver.getTitle());
    String parent_window = driver.getWindowHandle();
    ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
    new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2));
    Set<String> allWindows_1 = driver.getWindowHandles();
    //Now you can initiate switching through windowHandles
    

【讨论】:

    【解决方案2】:

    你可以使用下面的代码 sn-p :

     public boolean softWaitForPageToLoad() {
        try {
            new WebDriverWait(getDriver(), 60).until(
                    webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").toString().matches("interactive|complete"));
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    

    这里的 getDriver() 函数返回现有的驱动程序实例。请用您的实现替换它。

    【讨论】:

      【解决方案3】:

      此代码等待特定 id 可见。并在抛出异常前 30 秒初始化:

      WebDriverWait wait = new WebDriverWait(driver, 30);
      wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ifmail")));
      

      【讨论】: