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

弹出窗口冻结Selenium Webdriver,直到手动关闭弹出窗口,selenium,selenium-webdriver,Selenium,Selenium Webdriver,我在内部网站上自动测试时遇到问题。在某些情况下,弹出窗口将冻结测试,直到我手动关闭弹出窗口。打开弹出窗口后,不会运行任何代码,甚至不会运行System.out.println driver.findElement(By.id("top_toolbarSALTkA7_Aras_Tbi_promote")).click(); System.out.println("test"); 我尝试了多种处理弹出窗口的方法,但在click()之后根本没有运行任何代码,而且它似乎永远不会超时 尝试: 一, 二,

我在内部网站上自动测试时遇到问题。在某些情况下,弹出窗口将冻结测试,直到我手动关闭弹出窗口。打开弹出窗口后,不会运行任何代码,甚至不会运行System.out.println

driver.findElement(By.id("top_toolbarSALTkA7_Aras_Tbi_promote")).click();
System.out.println("test");
我尝试了多种处理弹出窗口的方法,但在click()之后根本没有运行任何代码,而且它似乎永远不会超时

尝试:

一,

二,

四,

如果关闭弹出窗口,测试将继续使用System.out.println,然后继续,直到完成


我在Firefox31.0中使用SeleniumWebDriver 2.48.2,编程是Java。有什么办法吗?(无法更改网站)

终于找到了解决方案!!!在Selenium官方用户组中找到它:

解决方案是启动一个新线程,等待几秒钟,然后按enter键(或者在我的例子中,先按tabs键到“OK”按钮)。只需在弹出窗口打开之前调用该函数

    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();
}
public static final void prepare按回车键(整数秒,整数选项卡){
ScheduledExecutorService ScheduledExecutorService=执行者。newScheduledThreadPool(1);
ScheduledFuture ScheduledFuture=scheduledExecutorService.schedule(new Runnable()){
公开募捐{
试试{
机器人=新机器人();

对于(int i=0;i只需禁用弹出窗口。我的意思是您需要在当前浏览器上下文中调用下一个脚本(
executeScript
-我猜在您的Java绑定情况下):

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

您使用的是什么webdriver绑定?当我使用WebDriverJ并希望将javascript注入浏览器时,我使用
executeAsycScript()
而不是
executeScript()
-它需要一个回调-您调用该回调来显式地告诉webdriver-客户端JS已经完成-现在继续运行其余的测试我很抱歉,我忘了提到!我正在使用JavaTest,尝试使用它而不是executeScript(),没有更改:
((JavascriptExecutor)driver)。executeAsyncScript(“return document.getElementById('top_toolbarSALTkA7_Aras_Tbi_promote','onClick');
不想惹人烦,但是你试过driver.switchTo().alert().accept();而不仅仅是driver.switchTo().alert();是的,我试过上面例子的很多组合,我很绝望:)现在再试一次,只是为了确定一下,但还是不起作用。
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;  
        }  
    }
driver.switchTo().alert();
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
    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();
}