无法在IE上使用Java中的Selenium WebDriver获取新的窗口句柄

时间:2015-11-03 22:27:05

标签: java selenium selenium-webdriver popup webdriver

单击页面上的按钮(在IE浏览器中)时,将打开一个新的弹出页面。我尝试获取此弹出窗口的窗口句柄失败了。这是我的第一次尝试:

String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
Set<String>s = driver.getWindowHandles();
Iterator<String> ite = s.iterator();
while ( ite.hasNext() ) {
    String popUpHandle = ite.next();
    if(!baseWin.equals(popUpHandle)) {
        driver.switchTo().window(popUpHandle);
        System.out.println(driver.switchTo().window(popUpHandle).getTitle());

此尝试仅打印基本窗口的句柄,如果第二个print语句位于if()语句之外,但在while()语句之内和if()语句之后,它只是输出基本窗口的标题。所以句柄集似乎只包含基本窗口句柄。

这是我的第二次尝试:

String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
ArrayList<String> popUpWin = new ArrayList<String>(driver.getWindowHandles());
popUpWin.remove(baseWin);
driver.switchTo().window(popUpWin.get(0));
System.out.println(driver.switchTo().window(popUpWin.get(0)));

此尝试返回一个错误,表示数组popUpWin为空,即size == 0.因此,当我调用driver.getWindowHandles()时,弹出窗口的句柄不被检索仅包含基本窗口的句柄。这是IE问题吗?有解决方法吗?或者我在代码中忽略了什么? (请注意,我在此处包含的代码中忽略了暂停,因此我不相信这是问题所在。)

2 个答案:

答案 0 :(得分:8)

您需要做两件事:

  1. 更改IE浏览器中的安全设置:

    打开IE浏览器,点击“Internet Options”=&gt; “安全”=&gt;勾选“Internet”,“本地Intranet”,“受信任的站点”和“受限制的站点”的“启用保护模式”。

    这使IE驱动程序能够控制新窗口句柄,以便在您调用时 driver.getWindowHandles();driver.getWindowHandles().size(); 您将获得所有句柄,包括原始窗口和新窗口。为了更准确,您只需要将所有4个域的安全设置设置为相同,这意味着您可以取消选中所有4个域的“启用保护模式”,但显然不鼓励这样做。

  2. 致电driver.switchTo().window(windowName);后,您需要在IE驱动程序可以对窗口执行任何操作之前添加((JavascriptExecutor) driver).executeScript("window.focus();");

    这是因为IE驱动程序需要它正在处理的窗口位于前台,这一行有助于驱动程序获得窗口的焦点,以便它可以在您想要的窗口上执行任何操作。

  3. 以下是完整的示例:

        String baseWin = driver.getWindowHandle();
        //Some methods to open new window, e.g.
        driver.findElementBy("home-button").click();
    
        //loop through all open windows to find out the new window
        for(String winHandle : driver.getWindowHandles()){
            if(!winHandle.equals(baseWin)){
                driver.switchTo().window(winHandle);
                //your actions with the new window, e.g.
                String newURL = driver.getCurrentUrl();
            }
        }
    
        //switch back to the main window after your actions with the new window
        driver.close();
        driver.switchTo().window(baseWin);
    
        //let the driver focus on the base window again to continue your testing
        ((JavascriptExecutor) driver).executeScript("window.focus();");
    

答案 1 :(得分:2)

请注意弹出窗口不是新窗口,其iframe将其视为IFrame driver.getWindowHandles();用于处理浏览器中的多个标签,而不是用于处理iframe

您应该使用driver.switchTo().frame()切换到弹出窗口