【问题标题】:Popup freezes Selenium Webdriver until the popup is manually closed弹出窗口冻结 Selenium Webdriver 直到手动关闭弹出窗口
【发布时间】:2015-11-16 13:37:26
【问题描述】:

我在内部网站上自动执行测试时遇到问题。在某些情况下,弹出窗口会冻结测试,直到我手动关闭弹出窗口。打开弹窗后,没有运行任何代码,甚至 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,然后继续直到完成。

我使用 Selenium Webdriver 2.48.2 和 FireFox 31.0,编程是 Java。有什么想法可以做什么? (无法更改网站)

【问题讨论】:

  • 您使用什么 webdriver 绑定?当我使用 webdriverJS 并且我想将 javascript 注入浏览器时,我使用 executeAsycScript() 而不是 executeScript() - 它需要一个回调 - 你调用它来明确告诉 webdriver - 客户端 JS 已经完成 - 现在继续运行其余的测试
  • 对不起,我忘了说!我正在使用 java
  • 现在尝试使用这个而不是 executeScript(),没有变化:((JavascriptExecutor) driver).executeAsyncScript("return document.getElementById('top_toolbarSALTkA7_Aras_Tbi_promote', 'onClick')");
  • 不是说烦人,而是你试过 driver.switchTo().alert() .accept() ;而不仅仅是 driver.switchTo().alert();
  • 是的,我尝试了很多上述示例的组合,我很绝望:) 现在又试了一次,只是为了确定,但还是不行。

标签: selenium selenium-webdriver


【解决方案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();
}

不过,如果有更好的解决方案,我非常想知道。谢谢!

【讨论】:

    【解决方案2】:

    只需禁用弹出窗口。我的意思是您需要在当前浏览器上下文中调用下一个脚本(executeScript - 我猜在您的 Java 绑定案例中):

    document.alert = window.alert = alert = () => {};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多