当前位置: 首页 > 面试题库 >

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

况谦
2023-03-14
问题内容

当我单击页面上的按钮(在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问题吗?有解决方法吗?还是我忽略了代码中的某些内容?(请注意,我忽略了此处包含的代码中的暂停,所以我不认为这是问题所在。)


问题答案:

您需要做两件事:

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

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

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

  1. 调用之后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();");


 类似资料:
  • 问题内容: 当我单击页面上的按钮(在IE浏览器中)时,将打开一个新的弹出页面。我尝试获取此弹出窗口的窗口句柄失败。这是我的第一次尝试: 此尝试仅打印基本窗口的句柄,并且如果第二个print语句放置在if()语句之外,但在while()语句内以及if()语句之后,则仅输出基本窗口的标题。因此,这组句柄似乎只包含基本窗口句柄。 这是我的第二次尝试: 尝试返回一个错误,该错误表明数组popUpWin为空

  • 我正在使用Selenium Java进行自动化测试。对于我的场景,首先打开登录页面,在提供凭据并单击登录按钮后,当前浏览器(带有登录页面)关闭,并打开一个带有主页的新IE窗口。在java代码中,我用登录页面url获得驱动程序,然后提供用户名和pwd,然后单击登录页面工作正常,但之后,当页面关闭和新的IE窗口打开时,我试图在主页上工作,我得到了noSuchWindowException或Null句柄

  • 问题内容: 我是JNA的新手。我试图获取所有窗口的句柄,包括最小化的窗口。我需要所有的窗户。我遇到了Windows问题:如何获取所有可见窗口的列表?这帮助我获得了Windows列表,但是它的类型为int。我不能与要求type的函数一起使用。那么,有什么方法可以获取类型而不是int指针的所有窗口句柄?最后,为什么和?它如何接受两者?我有点困惑。谢谢。 我有以下代码(从Hovercreft的答案中编辑

  • 使用Inspect.exe我可以看到应用程序组件的树结构中存在一个按钮,但我找不到获取该按钮句柄的方法。这是控件的Inspect.exe输出: 这个按钮的特殊之处在于它没有hwnd值。(hwnd: 0x0)。这是我试图获得对该按钮的引用的内容: 在本例中,hwnd变量是包含按钮的应用程序主窗口的句柄。 在阅读FindWindowEx的留档时,看起来似乎有多种方法可以使用不同的参数,我觉得我已经尝试

  • 问题内容: 在Java 1.4中,您可以使用(((SunToolkit)Toolkit.getDefaultToolkit())。getNativeWindowHandleFromComponent(),但这已被删除。 看来您现在必须使用JNI来执行此操作。您是否有JNI代码和示例Java代码来执行此操作? 我需要它来调用Win32 GetWindowLong和SetWindowLong API调

  • 我试图在IE11中通过点击一个链接打开一个新的标签,但它会在点击一个链接时打开一个新的窗口。我在谷歌上寻找合适的方法,但不知道如何实现这一点。有人能帮忙吗? 当手动单击时,link会在一个选项卡中打开,但当通过selenium单击时,它会打开一个新窗口。 我没有添加任何代码,因为没有太多要添加的。我使用webelement.click()单击了link元素,并且在驱动程序功能中禁用了persist