1

我使用的是IEdriver(32位),IE(安装版本11)和Selenium 3.3.1, 及以下是我用来切换到新窗口的代码。Selenium IE驱动程序找不到新打开的窗口

 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的驱动程序后,按预期执行,所有的窗户得到处理。

回答

0

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

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

+0

谢谢,实际上我只添加了来自测试的示例代码,我会在我的实际代码中使用return语句。并且只有两个窗口。 当我使用驱动程序,然后IE浏览器,我可以看到两个窗口找到set.While与IE浏览器驱动程序,我只能找到一个父窗口集。 –

+0

所以我想这里的问题是一些IE兼容性设置,而不是代码。 –

+0

你可以在开关后试试这个:driver.switchTo()。defaultContent(); (在两个方向使用它 - 在那里和后面) –

0

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

注意:如果您有一个现有的窗口并且产生一个新的窗口,这确实只能确定性地工作。在其他情况下,它将切换到不是父窗口的第一个窗口,该窗口可能是也可能不是您想要的窗口。