我在内部网站上自动化测试时遇到了问题。在某些情况下,弹出窗口会冻结测试,直到我手动关闭弹出窗口。打开弹出窗口后,不会运行任何代码,甚至不会运行System.out.println。
driver.findElement(By.id("top_toolbarSALTkA7_Aras_Tbi_promote")).click();
System.out.println("test");
我尝试了多种处理弹出窗口的方法,但是在click()之后根本没有代码运行,而且它似乎永远不会超时。
尝试:
1
((JavascriptExecutor) driver).executeScript("return document.getElementById('top_toolbarSALTkA7_Aras_Tbi_promote', 'onClick')");
2
Set<String> windowHandles = driver.getWindowHandles();
for(String handle : windowHandles)
{
driver.switchTo().window(handle);
if (driver.getTitle().contains(title))
{
System.out.println("- (Page title is: " + driver.getTitle() + ")");
break;
}
}
3
driver.switchTo().alert();
4
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
如果我关闭弹出窗口,测试将继续使用System.out.println,然后继续直到finshed。
我正在使用Selenium Webdriver 2.48.2和FireFox 31.0,编程是Java。有什么想法可以做些什么? (无法更改网站)
答案 0 :(得分:1)
终于找到了解决方案!!!在Selenium官方用户组中找到它:https://groups.google.com/forum/#!searchin/selenium-users/popup%7Csort:relevance/selenium-users/eDqPiYoJ9-Q/kRI67cCVe5wJ
解决方案是启动一个等待几秒钟的新线程,然后按回车键(或者在我的情况下,首先按下“确定”按钮)。只需在弹出窗口打开之前调用该函数。
public static final void prepareToPressEnterKey(int seconds, int tabs) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(new Runnable() {
public void run() {
try {
Robot robot = new Robot();
for (int i=0; i<tabs; i++)
{
robot.keyPress(KeyEvent.VK_TAB);
TimeUnit.SECONDS.sleep(1);
robot.keyRelease(KeyEvent.VK_TAB);
}
robot.keyPress(KeyEvent.VK_ENTER);
TimeUnit.SECONDS.sleep(1); //press for 1 sec
robot.keyRelease(KeyEvent.VK_ENTER);
} catch (AWTException | InterruptedException e) {
System.out.println("Prepare to Press Enter Exception");
}
}
},
seconds,
TimeUnit.SECONDS);
scheduledExecutorService.shutdown();
}
不过,如果有更好的解决方案,我非常想知道。谢谢!
答案 1 :(得分:0)
仅禁用弹出窗口。我的意思是您需要在当前浏览器上下文中调用下一个脚本(executeScript
-我想是在您的Java绑定情况下):
document.alert = window.alert = alert = () => {};