【问题标题】:Selenium IE driver can not find newly opened windowSelenium IE 驱动找不到新打开的窗口
【发布时间】:2017-04-12 16:16:58
【问题描述】:

我正在使用 IEdriver(32 位)、IE(安装版本 11)和 Selenium 3.3.1, 下面是我用来切换到新窗口的代码。

        String parentWin = driver.getWindowHandle();

        click(By.cssSelector("#linkID_OpenNewWin"));

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        Set<String> winList = driver.getWindowHandles();

        for (String winHandle : winList)
        {   
            if (!winHandle.equals(parentWin))
            {
                driver.switchTo().window(winHandle); // switch focus of WebDriver to the next found window handle 
            }
        }

当我尝试使用 IE 驱动程序执行上述代码时,它无法找到新打开的窗口, 但是使用 Chrome 驱动程序,它会按预期执行,并且所有窗口都会得到处理。

【问题讨论】:

    标签: java selenium internet-explorer selenium-webdriver selenium-iedriver


    【解决方案1】:

    我可以看到这段代码存在一些问题。

    首先,您可能应该在单击链接之前设置隐式等待,否则至少理论上可以在新窗口完全打开之前继续。其次,虽然测试用例中可能只有两个窗口,父窗口加上新窗口,但循环应该可以正常工作,但如果由于某种原因有额外的窗口(选项卡),则不会中断;声明,因此您的循环将继续。这很可能是您隐式等待的位置,但是当您找到匹配项时退出循环是一种很好的编程习惯。

    【讨论】:

    • 谢谢,实际上我只添加了测试中的示例代码,我会在我的实际代码中使用 return 语句。而且只有两个窗口。当我使用除 IE 以外的驱动程序时,我可以在 set 中看到两个窗口。而使用 IE 驱动程序时,我只能在 set 中找到一个父窗口。
    • 所以我想这里的问题是一些 IE 兼容性设置而不是代码。
    • 你可以在切换后试试这个:driver.switchTo().defaultContent(); (双向使用 - 那里和后面)
    【解决方案2】:

    首先,不要使用隐式等待...更喜欢显式等待,例如WebDriverWait。它将帮助您以更确定的方式控制脚本的流程。

    我的猜测是,您的脚本在 IE 窗口实际出现之前就已经开始运行了。我建议您计算窗口句柄的数量,然后单击生成新窗口的链接,然后等待窗口句柄计数增加 1。现在您知道窗口已打开,您可以继续抓住新的窗口句柄并切换到它。

    int expectedNumberOfWindows = driver.getWindowHandles().size() + 1; // or you can hardcode 2 if it should always be 2
    String parentWin = driver.getWindowHandle();
    click(By.cssSelector("#linkID_OpenNewWin"));
    new WebDriverWait(driver, 3).until(ExpectedConditions.numberOfWindowsToBe(expectedNumberOfWindows));
    switchToNewWindow(parentWin);
    // do stuff in new window
    

    我通常将我计划重用的代码放入函数中。这是一个切换到新窗口的窗口,即不是父窗口的窗口。

    public void switchToNewWindow(String currentWindow)
    {
        for (String winHandle : driver.getWindowHandles())
        {
            if (!winHandle.equals(currentWindow))
            {
                driver.switchTo().window(winHandle);
            }
        }
    }
    

    注意:这实际上只在您有一个现有窗口并且您生成一个新窗口的情况下确定性地起作用。在其他情况下,它只会切换到不是父窗口的第一个窗口,它可能是也可能不是您想要的窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多