2017-04-10 28 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