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); 
     } 
    } 
} 

注意:如果您有一個現有的窗口並且產生一個新的窗口,這確實只能確定性地工作。在其他情況下,它將切換到不是父窗口的第一個窗口,該窗口可能是也可能不是您想要的窗口。

相關問題