Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.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
Java Selenium IE驱动程序找不到新打开的窗口_Java_Selenium_Internet Explorer_Selenium Webdriver_Selenium Iedriver - Fatal编程技术网

Java Selenium IE驱动程序找不到新打开的窗口

Java Selenium IE驱动程序找不到新打开的窗口,java,selenium,internet-explorer,selenium-webdriver,selenium-iedriver,Java,Selenium,Internet Explorer,Selenium Webdriver,Selenium Iedriver,我使用的是IEdriver(32位)、IE(安装了11版)和Selenium 3.3.1, 下面是我用来切换到新窗口的代码 String parentWin = driver.getWindowHandle(); click(By.cssSelector("#linkID_OpenNewWin")); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

我使用的是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 
            }
        }
String parentWin=driver.getWindowHandle();
单击(By.cssSelector(#linkID_OpenNewWin”);
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
设置winList=driver.getWindowHandles();
用于(字符串winHandle:winList)
{   
如果(!winHandle.equals(parentWin))
{
driver.switchTo().window(winHandle);//将WebDriver的焦点切换到下一个找到的窗口句柄
}
}
当我尝试使用IE驱动程序执行上述代码时,它无法找到新打开的窗口,
但是使用Chrome驱动程序,它会按预期执行,所有窗口都会得到处理。

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


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

首先,不要使用隐式等待。。。更喜欢显式等待,例如
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);
        }
    }
}

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

谢谢,实际上我只添加了测试中的示例代码,我会在实际代码中使用return语句。并且只有两个窗口。当我使用除IE之外的驱动程序时,我可以在集合中看到两个窗口。而使用IE驱动程序时,我只能在集合中找到一个父窗口。因此,我认为这里的问题在于某些IE兼容性设置,而不是代码。您可以在切换后尝试此操作:driver.switchTo().defaultContent();(在两个方向上使用-在那里和后面)