2012-05-24 118 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);