2012-05-24 93 views
1

我使用Selenium 2 + Java在IE 9上测试应用程序。 单击链接后,弹出窗口打开。我使用switchTo.window方法去弹出窗口。但是当我尝试返回时,我的测试在这个操作上延迟了,并且没有继续。WebDriver + Internet Explorer,switchTo.window问题

一些代码:

link.click(); //Open pop-up window  
Object[] windows = driverIE.getWindowHandles().toArray();  
driverIE.switchTo().defaultContent();  
driverIE.switchTo().window(windows[1].toString()); //Focus on pop-up window  
.....  
mainWindowHandle = driverIE.getWindowHandles().iterator().next(); //Handle of main window  
driverIE.switchTo().window(mainWindowHandle); //Fail!  

请帮我解决这个问题。

+0

尝试 “mainWindowHandle = driverIE.currentWindowHandle;”在切换到弹出窗口之前。 – Anders

+0

操作“mainWindowHandle = driverIE.getWindowHandles()。iterator()。next();”和“mainWindowHandle = driverIE.getWindowHandle;在我切换到弹出窗口之前”返回相同的值。麻烦出现在最后。 – Eiler

回答

2

getWindowHandles()返回的Windows句柄不保证以任何顺序。换句话说,在上面的代码示例中,不能依赖windows[1]来包含打开窗口的窗口句柄。相反,你需要编写代码,看起来像以下(!注:没有经过充分测试的代码前面):

String mainHandle = driver.getWindowHandle(); 

// Do whatever you need to do to open a new window, 
// and properly wait for the new window to appear... 

Set<String> allHandles = driver.getWindowHandles(); 
for(String currentHandle : allHandles) { 
    // Note that this is cheating a bit. It will only 
    // work with a total of two windows. If you have 
    // more than two windows total, your logic here 
    // will have to be a little more sophisticated. 
    if (!currentHandle.equals(mainHandle)) { 
    driver.switchTo().window(currentHandle); 
    break; 
    } 
} 

// Work with popup window... 
// Close the popup window and switch context back 
// to the main window. 
driver.close(); 
driver.switchTo().window(mainHandle); 
+0

我明白这一刻。但是,如果我正确识别主窗口并尝试切换到该窗口,则会出现问题。不会出现异常! – Eiler

+0

你如何定义“弹出窗口”?它是由'alert()','confirm()'或'prompt()'函数产生的JavaScript对话框吗?它是一个常规的浏览器窗口,可以调整大小,并允许您将焦点手动设置回原始窗口?它是由JavaScript showModalDialog()函数打开的浏览器窗口吗? – JimEvans

+0

这是一个常规的浏览器窗口,可以调整大小,并允许您手动将焦点设置回原始窗口。 – Eiler

0

由于JimEvans指出,driver.getWindowHandles()有时把窗户不正确的顺序,因此for循环并不总是有效。

上述类似的工作对我来说(我只有两个窗口办理):

String winHandleBefore = driver.getWindowHandle(); 

    driver.findElement(By.cssSelector("a")).click(); 

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

    winHandle.remove(winHandleBefore); 

    String winHandleNew = winHandle.toString(); 

    String winHandleFinal = winHandleNew.replaceAll("\\[", "").replaceAll("\\]",""); 

    driver.switchTo().window(winHandleFinal);