如何使用Selenium切换到新窗口?

时间:2013-09-12 14:31:22

标签: java selenium

在我的代码中,我已经使用selenium到达了一个页面,有一个链接在同一页面上作为弹出窗口打开,但该链接正在使用,所以它就像一个在新窗口中打开的新页面。

我能够点击该链接并打开页面,但是当我正在执行driver.getWindowHandles()时,它返回的大小仅为1而不是2,因为我无法切换到新窗口。

以下是我正在使用的代码:

    String parent = driver.getWindowHandle();
    driver.findElement(By.xpath("//a[@id='abc']")).click();
    // after clicking on the link
    try{
    Thread.sleep(1000);

    Set<String> availableWindows = driver.getWindowHandles();//this set size is
   // returned as 1 and not 2
    String newWindow = null;
    for (String window : availableWindows) {
        if (!parent.equals(window)) {
            newWindow = window;
        }
    }
    assertNotNull(newWindow);

    // switch to new window
    driver.switchTo().window(newWindow);
    // do assert the elements in the new window
    // and then close the new window
    driver.close();
    // switch to parent
    driver.switchTo().window(parent);
    // close main window
    driver.close();}
    catch(Exception e){

由于弹出窗口是主窗口本身的一部分,即,为什么我无法通过执行getWindowHandle()得到正确的大小;

但我的要求是仅保存弹出页面。 现在,每次调用母版页驱动程序时,保存代码都会保存母版页详细信息以及弹出内容。

我是否可以采取任何解决方法来获取弹出页面的驱动程序?

保存代码是通用的,在此参考中并不重要。 我想要的只是获取弹出页面的驱动程序

1 个答案:

答案 0 :(得分:0)

点击链接后,你需要等到Selenium意识到现在共有2个窗口。

String parent = driver.getWindowHandle();
    driver.findElement(By.xpath("//a[@id='alertHistoryLink']")).click();
    // after clicking on the link
    // call the method numberOfWindowsToBe as follows
    WebDriverWait wait = new WebDriverWait(driver, 15, 100);
    wait.until(numberOfWindowsToBe(2));

public static ExpectedCondition<Boolean> numberOfWindowsToBe(final int numberOfWindows) {
    return new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
                driver.getWindowHandles();
        return driver.getWindowHandles().size() == numberOfWindows;
      }
    };
}
  

我想要的只是获取弹出页面的驱动程序

编辑:主窗口的驱动程序是弹出窗口的驱动程序,因为弹出窗口本身是主窗口的一部分。唯一的例外是,如果弹出窗口存在于框架中,则需要切换到框架,然后您可以对弹出窗口中的元素执行操作。

编辑:如果我理解正确,你想获得弹出窗口的页面源代码。由于弹出窗口是主窗口的一部分。我会做的是

popup.getAttribute( “innerHTML的”); 弹出窗口的类型为WebElement。

例如,如果主窗口的HTML类似于

 <html>
<head>
.....
</head>
<body>
...
...
..
<div id = popup> 
//html elements present in popup
</div>
...
..
</head>
</html>

然后

WebElement popup = driver.findElement(By.xpath("//div[@id='popup']"));

String htmlInsidePopup = popup.getAttribute("innerHTML");
System.out.println(htmlInsidePopup);

将解决问题。