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

Posted

技术标签:

【中文标题】无法在 IE 上使用 Java 中的 Selenium WebDriver 获取新窗口句柄【英文标题】:Unable to get new window handle with Selenium WebDriver in Java on IE 【发布时间】:2016-02-04 06:20:51 【问题描述】:

当我单击页面上的按钮(在 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());

此尝试仅打印基本窗口的句柄,如果第二个打印语句放置在 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的问题吗?有解决方法吗?还是我忽略了代码中的某些内容? (请注意,我忽略了此处包含的代码中的暂停,因此我认为这不是问题所在。)

【问题讨论】:

您使用的是什么版本的硒?这是 Windows 7 IE8 Selenium 2.12 的已知问题。但那是从 2011 年开始的 【参考方案1】:

你需要做两件事:

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

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

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

    调用driver.switchTo().window(windowName);后,需要添加((javascriptExecutor) driver).executeScript("window.focus();");,IE驱动才能对窗口执行任何操作。

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

以下为完整示例:

    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();");

【讨论】:

我已经测试了第一个选项(启用保护模式)=> 就像一个魅力!谢谢 “启用保护模式” - 为所有不适合我的区域启用或禁用此值。有什么想法吗? 更新:条件:现在我已经使用 selenium-java 版本 3.8.0 和 IEDriverServer 3.8.0 进行了尝试,但还需要满足一个条件:您必须加载 html 页面并从此 html 页面你必须用新页面打开新窗口。如果您通过其他方式打开新选项卡/窗口,例如手动作为新页面或通过插件(Flash 和 ActiveX 我没有测试),Selenium 可能不会检测到这个寡妇! (我的情况)所以它实际上是有效的,但要小心你是如何打开新标签/页面/窗口的。【参考方案2】:

请注意 Pop Up 不是一个新窗口,它是一个 Iframe 将其视为 IFrame driver.getWindowHandles(); 用于处理浏览器中的多个选项卡,而不是用于处理 Iframe

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

【讨论】:

嗨,那里。这个答案没有解决问题。我想知道我是否应该更具体。 “弹出”是第二个独立的 IE 窗口。 driver.switchTo().frame(driver.findElement(By.id("id"))) 不成功,输入帧号0或1也不成功。 该页面是否托管在网络上,您可以与我分享链接吗?让我看看我自己

以上是关于无法在 IE 上使用 Java 中的 Selenium WebDriver 获取新窗口句柄的主要内容,如果未能解决你的问题,请参考以下文章

无法在 http://localhost 上启动驱动程序服务

字体无法在 IE8 上加载

loadrunner中的ie浏览器无法使用

IFRAME:在 IE 和 Edge 中的悬停无法按预期工作

Zepto 的哪些功能在 ie9 上无法使用?

IE9 无法播放 MP4 文件