弹出窗口冻结Selenium Webdriver,直到手动关闭弹出窗口

时间:2015-11-16 13:37:27

标签: selenium selenium-webdriver

我在内部网站上自动化测试时遇到了问题。在某些情况下,弹出窗口会冻结测试,直到我手动关闭弹出窗口。打开弹出窗口后,不会运行任何代码,甚至不会运行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。有什么想法可以做些什么? (无法更改网站)

2 个答案:

答案 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 = () => {};