Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在IE上使用Java中的Selenium WebDriver获取新窗口句柄_Java_Selenium_Selenium Webdriver_Popup_Webdriver - Fatal编程技术网

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

无法在IE上使用Java中的Selenium WebDriver获取新窗口句柄,java,selenium,selenium-webdriver,popup,webdriver,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() ) {

当我单击页面上的按钮(在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());
String baseWin=driver.getWindowHandle();
System.out.println(baseWin);
set=driver.getWindowHandles();
迭代器ite=s.Iterator();
while(ite.hasNext()){
字符串popUpHandle=ite.next();
如果(!baseWin.equals(popUpHandle)){
driver.switchTo()窗口(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)));
String baseWin=driver.getWindowHandle();
System.out.println(baseWin);
ArrayList popUpWin=新的ArrayList(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问题吗?是否有解决方法?还是我忽略了代码中的某些内容?(请注意,我忽略了此处包含的代码中的暂停,因此我不认为这是问题所在。)

请注意,弹出窗口不是一个新窗口,而是一个Iframe,将其视为Iframe
驱动程序。getWindowHandles();
用于处理浏览器中的多个选项卡,而不是处理Iframe


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

您需要做两件事:

  • 更改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?这是Windows 7 IE8 selenium 2.12的一个已知问题。但这是lilke 2011Hi的问题。这个答案并没有解决问题。我想知道是否应该更具体一些。“弹出”是第二个独立的IE窗口。driver.switchTo().frame(driver.findElement(By.id(“id”))未成功,并且输入帧号0或1也不成功。该页面是否托管在web上?您可以与我共享链接吗?请让我查看我的自我我已测试了第一个选项(启用保护模式)=>效果非常好!感谢“启用保护模式”-对所有不适用于我的区域启用或禁用此值。有什么想法吗?更新:条件:现在我已经用selenium java 3.8.0版和IEDriverServer 3.8.0尝试了此方法,但还需要满足一个条件:您必须加载html页面,并且从该html页面中,您必须用新页面打开新窗口。如果您按此方式打开新选项卡/窗口另一种方式,例如手动作为新页面或通过插件(我没有测试Flash和ActiveX),Selenium可能不会检测到这个寡妇!(我的案例)因此它实际上是工作的,但请注意如何打开新选项卡/页面/窗口。