Selenium WebDriver(selenium 2)中Java的警报处理

40

我想检测是否弹出了警报框。目前我正在使用以下代码:

    try {
        Alert alert = webDriver.switchTo().alert();

        // check if alert exists
        // TODO find better way
        alert.getText();

        // alert handling
        log().info("Alert detected: {}" + alert.getText());
        alert.accept();
    } catch (Exception e) {
    }

问题是,如果当前网页没有警报,脚本会等待特定的时间直到超时,之后抛出异常,导致性能非常糟糕。

是否有更好的方法,例如可以用于动态发生的警报的警报事件处理程序?

5个回答

79

这是我使用来自WebDriver:高级用法的显示等待时有效的方法。

public void checkAlert() {
    try {
        WebDriverWait wait = new WebDriverWait(driver, 2);
        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert();
        alert.accept();
    } catch (Exception e) {
        //exception handling
    }
}

2
很有趣,可能会奏效。将等待方法的超时设置为零是否可行? - Alp

16

请写出以下方法:

public boolean isAlertPresent() {
    try {
        driver.switchTo().alert();
        return true;
    } // try
    catch (Exception e) {
        return false;
    } // catch
}

现在,您可以使用上面写的方法来检查警报是否存在,如下所示:

if (isAlertPresent()) {
    driver.switchTo().alert();
    driver.switchTo().alert().accept();
    driver.switchTo().defaultContent();
}

3
警告框 alert = driver.switchTo().alert();
alert.accept();

您也可以拒绝弹出框:

警告框 alert = driver.switchTo().alert();
alert().dismiss();

2
try 
    {
        //Handle the alert pop-up using seithTO alert statement
        Alert alert = driver.switchTo().alert();

        //Print alert is present
        System.out.println("Alert is present");

        //get the message which is present on pop-up
        String message = alert.getText();

        //print the pop-up message
        System.out.println(message);

        alert.sendKeys("");
        //Click on OK button on pop-up
        alert.accept();
    } 
    catch (NoAlertPresentException e) 
    {
        //if alert is not present print message
        System.out.println("alert is not present");
    }

0

你可以尝试一下

 try{
        if(webDriver.switchTo().alert() != null){
           Alert alert = webDriver.switchTo().alert();
           alert.getText();
           //etc.
        }
    }catch(Exception e){}

如果那不起作用,您可以尝试循环遍历所有窗口句柄,看看警报是否存在。我不确定警报是否会使用Selenium作为新窗口打开。
for(String s: webDriver.getWindowHandles()){
 //see if alert exists here.
}

遗憾的是,这两种解决方案都不起作用。第一种方案与我的代码一样慢,因为它在超时时已经创建了异常。第二种方案无法识别警报。 - Alp
@djangofan - 你是不是有烦人的延迟问题? - Alp
@Alp - 究竟是由什么引起的?你指的是什么? - djangofan
如果您使用该代码来验证警报是否存在,如果不存在,则应该有延迟。是这样吗?因为我尝试最小化该延迟/超时,但没有成功。 - Alp
另外,也许尝试更新Selenium jars。当我使用Selenium时,他们几乎每个月都会发布新版本,有时甚至两次。 - Reid Mac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接