【问题标题】:Selenium check if a window is currently openSelenium 检查窗口当前是否打开
【发布时间】:2017-12-29 09:49:55
【问题描述】:

所以我有一个 selenium 网络驱动程序将我登录到一个网站,然后我从那里单击一个按钮,该按钮会打开第二个窗口。我使用下面的代码切换到新窗口

 String winParent = driver.getWindowHandle();

 for (String winHandle : driver.getWindowHandles()) {
        driver.switchTo().window(winHandle);
 }

现在我在第二个窗口运行一些自动化。完成后,我将按下保存按钮,这将关闭当前窗口。如果窗口没有关闭,则表示我在页面上有一些错误,我需要循环返回并修复它。

 driver.findElement(By.id("btnSave")).click();

  if (isAlive(driver) == false) {
      //break and exit
      System.out.println("cic" + name);
      finalString = finalString + "cic: " + name;
      break;

   }


  public Boolean isAlive(WebDriver driver) {
    try {
        driver.getCurrentUrl();//or driver.getTitle();
        return true;
    } catch (Exception ex) {
        return false;
    }
}

程序在捕获错误并且窗口未关闭时按预期工作。但是一旦一切都清楚并且窗口关闭,它就会进入上面的 if 语句并显示此错误。

无法接收来自渲染器的消息。

我相信我没有检查窗口是否已正确关闭。

编辑:经过一些调试后,似乎一旦窗口关闭,程序就无法真正告诉下一步该做什么。 http://i.imgur.com/l8nsPPr.png

【问题讨论】:

标签: java selenium automation


【解决方案1】:

我建议为此使用 windowHandle。 您将初始窗口保存在String winParent = driver.getWindowHandle();

然后你切换到第二个窗口,它会有不同的句柄。 当您需要检查第二个窗口是否仍然打开时,只需使用:

  private boolean isNewWindowOpened(WebDriver driver, String parentWindowHandle) {
    try {
        return !driver.getWindowHandle().equals(parentWindowHandle);
    } catch (Exception ex) {
        driver.switchTo(parentWindowHandle);
        return false;
    }

【讨论】:

  • 我不得不将 catch 更改为 'driver.switchTo().window(parentWindowHandle);'但这不起作用我通过调试器跟踪窗口,即使窗口确实关闭了。 driver.getWindowHandle() 仍然指向那个关闭的窗口。
【解决方案2】:

我遇到了同样的情况,我有一个解决方案给你,点击“保存”按钮后检查窗口计数。理想情况下,如果您提供了所有正确的数据,则会有一个窗口,如果没有,则有两个窗口。

    driver.findElement(By.id("btnSave")).click();
    
      if (driver.getWindowHandled().size() >= 2) {
          // make required changes
          // again click on save button
       } else {
          //break and exit
          System.out.println("cic" + name);
          finalString = finalString + "cic: " + name;
          break;
       }
    }

【讨论】: