2017-04-10 27 views
0

我不確定getWindowHandles是否是獲取彈出句柄的正確方法,因爲以下內容僅返回父句柄而不是子句柄。Selenium Java:無法獲取彈出的句柄

for (String handle : driver.getWindowHandles()) { 
      driver.switchTo().window(handle); 
} 
WebDriverWait waitforEle = new WebDriverWait(driver, 300); 
waitforEle.until(ExpectedConditions.visibilityOfAllElementsLocatedBy 
(By.xpath("//*[@id='blah']"))); 

任何人都可以告訴我如何處理彈出如果上述方式不正確?

謝謝, Tickbox。

+1

你可以看到如果是彈出一個警告,然後通過做以下事情:'Alert alert = driver.switchTo()。alert(); alert.accept();'如果不是那麼請發佈一些html代碼或網址 – kushal

+0

@kushalツ你可以通過右鍵單擊它來查看彈出窗口是否爲警報。如果上下文菜單顯示爲HTML頁面,那麼它是HTML而不是JS警報。 – JeffC

+0

是的,@Tickbox可能沒有意識到這一點。 – kushal

回答

0

getWindowHandles()方法爲您提供打開的瀏覽器窗口或選項卡的ID。你只需要等待一個WebElement和彈出窗口的定位器。

WebDriverWait wait = new WebDriverWait(driver, 300); 
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='blah']")); 
+0

但它不是一個瀏覽器窗口或選項卡。它是一個彈出窗口。 – Tickbox

+1

這就是我正在談論的。你不需要一個getWindowHandles(),只需等待彈出框中的元素出現。 – SanchelliosProg

+0

大概等待應該可以工作,即使這樣你可以使用'$ x「// * [@ id ='blah']」'檢查chrome的控制檯部分,然後輸入以檢查元素是否出現,然後是同一個html頁面的一部分o/w是一些'iframe'的一部分 – kushal

0

如果彈出警報,然後使用:

Alert alert =driver.switchTo().alert(); alert.accept(); 

,或者如果它是應用程序彈出然後使用:

String parentWinHandle = driver.getWindowHandle(); 
//Click the button or link which populates the window 
driver.findElement(By.id(actionBtn)).click(); 
Thread.sleep(5000); 
Set<?> popupHandles = driver.getWindowHandles(); 
//SOP *popupHandles* 
Iterator<?> iterator = popupHandles.iterator(); 
while(iterator.hasNext()) 
    { 
    String popupHandle = iterator.next().toString(); 
    if(!popupHandle.contains(parentWinHandle)) { 
     driver.switchTo().window(popupHandle); 
     Thread.sleep(3000); 
     //Perform the operation you want to do 
     driver.switchTo().window(parentWinHandle); 
    } 
} 
+1

如果您需要等待,請不要推薦任何人使用Thread類。爲這些需求使用WebDriverWait類會更好。 – SanchelliosProg

+0

@SanchelliosProg我同意,使用'Thread.sleep();'是不好的做法。 – Ashish

+0

但是我的測試案例中的場景不同,我不得不等待5秒鐘,在此期間屏幕執行倒計時五秒鐘。我的壞消息是我沒有刪除就發佈了它。 – Ashish