2015-11-03 70 views
0

當我點擊頁面上的按鈕(IE瀏覽器),打開一個新的彈出頁面。我試圖讓這個彈出窗口句柄失敗。這是我第一次嘗試:只有無法在Java中獲得新的窗口句柄與硒的webdriver在IE

String baseWin = driver.getWindowHandle(); 
System.out.println(baseWin); 
Set<String>s = driver.getWindowHandles(); 
Iterator<String> ite = s.iterator(); 
while (ite.hasNext()) { 
    String popUpHandle = ite.next(); 
    if(!baseWin.equals(popUpHandle)) { 
     driver.switchTo().window(popUpHandle); 
     System.out.println(driver.switchTo().window(popUpHandle).getTitle()); 

這種嘗試版畫基地窗口的句柄,如果第二個print語句放在if()語句之外,但同時()語句中和後,如果()聲明,它只是輸出基本窗口的標題。所以這組手柄似乎只包含基本的窗口句柄。

這裏是我的第二次嘗試:

String baseWin = driver.getWindowHandle(); 
System.out.println(baseWin); 
ArrayList<String> popUpWin = new ArrayList<String>(driver.getWindowHandles()); 
popUpWin.remove(baseWin); 
driver.switchTo().window(popUpWin.get(0)); 
System.out.println(driver.switchTo().window(popUpWin.get(0))); 

這種嘗試返回一個錯誤,它說,該陣列popUpWin是空的,即大小== 0。所以,在彈出的窗口的句柄不被檢索時我叫driver.getWindowHandles(),只包含基本的窗口的句柄。這是一個IE問題?有沒有解決方法?或者我忽略了我的代碼中的某些內容? (請注意,我忽略了代碼中的暫停,因此我不認爲這是問題所在。)

+1

您正在使用什麼版本的硒?這是Windows 7 IE8 Selenium 2.12的已知問題。但是,這是從2011 lilke喜 – bpgeck

回答

7

有兩件事情你需要做的:

  1. 更改安全在IE瀏覽器中設置:

    打開IE瀏覽器,點擊「Internet選項」=>「安全」=>勾選「啓用保護模式」爲「Internet」,「本地內部網」,「可信站點」和「受限站點」。

    這讓IE驅動程序以獲取新的窗口句柄的控制,這樣,當你調用 driver.getWindowHandles();driver.getWindowHandles().size(); 你會得到所有的手柄,包括原來的窗口和新的Windows的能力。爲了更準確,你只需要設置安全設置的所有4個領域是,這意味着你可以取消選中相同的「啓用保護模式」的所有4個域,但它顯然是不鼓勵。

  2. 在您撥打driver.switchTo().window(windowName);之後,您需要在IE驅動程序可以在窗口上執行任何操作之前添加((JavascriptExecutor) driver).executeScript("window.focus();");

    這是因爲IE司機需要,它正在爲在前臺窗口,這條線可以幫助駕駛員獲得窗口的焦點,以便它可以執行你想在窗口中的任何行動。

下面是一個完整的示例:

String baseWin = driver.getWindowHandle(); 
    //Some methods to open new window, e.g. 
    driver.findElementBy("home-button").click(); 

    //loop through all open windows to find out the new window 
    for(String winHandle : driver.getWindowHandles()){ 
     if(!winHandle.equals(baseWin)){ 
      driver.switchTo().window(winHandle); 
      //your actions with the new window, e.g. 
      String newURL = driver.getCurrentUrl(); 
     } 
    } 

    //switch back to the main window after your actions with the new window 
    driver.close(); 
    driver.switchTo().window(baseWin); 

    //let the driver focus on the base window again to continue your testing 
    ((JavascriptExecutor) driver).executeScript("window.focus();"); 
+0

我已經測試了第一個選項(啓用保護模式)=>就像一個魅力!謝謝 –

+0

「啓用保護模式」 - 爲所有不適用於我的區域啓用或禁用此值。有任何想法嗎? –

+0

更新:條件:現在我已經試過這與硒-java版本3.8.0和IEDriverServer 3.8.0,但需要滿足一個更多的條件:你必須加載HTML頁面,並從這個HTML頁面,你必須打開新窗口新一頁。如果你通過其他方式打開新標籤頁/窗口,例如手動新頁面或通過插件(Flash和ActiveX,我沒有測試),這個窗口可能不會被Selenium檢測到! (我的情況)所以這是實際工作,但要小心你如何打開新的標籤頁/頁面/窗口。 –

2

請注意彈出窗口不是一個新窗口,它的Iframe將其視爲IFrame driver.getWindowHandles();是處理瀏覽器多標籤它不是用於處理I幀

你應該使用driver.switchTo().frame()切換成彈出

+1

有。這個答案沒有解決問題。我想知道我是否應該更具體。 「彈出」是另一個獨立的IE窗口。 driver.switchTo().frame(driver.findElement(By.id(「id」)))不成功,並輸入幀號0或1也不成功。 – Daniel

+0

是託管在網頁該頁面你能與我分享鏈接?讓我看看我的自我 – fahad