使用 Java 在 Selenium WebDriver (selenium 2) 中处理警报

Posted

技术标签:

【中文标题】使用 Java 在 Selenium WebDriver (selenium 2) 中处理警报【英文标题】:Alert handling in Selenium WebDriver (selenium 2) with Java 【发布时间】:2012-01-04 21:28:15 【问题描述】:

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

    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) 
    

问题是如果网页的当前状态没有警报,它会等待特定的时间,直到达到超时,然后抛出异常,因此性能非常糟糕。

有没有更好的方法,也许是我可以用于动态发生警报的警报事件处理程序?

【问题讨论】:

【参考方案1】:

这对我来说是使用 Explicit Wait from here WebDriver: Advanced Usage

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】:

编写如下方法:

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】: 警报警报 = driver.switchTo().alert(); 警报.accept();

您也可以拒绝提醒框:

警报警报 = driver.switchTo().alert(); alert().dismiss();

【讨论】:

【参考方案4】:
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");
    

【讨论】:

【参考方案5】:

你可以试试

 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.

【讨论】:

遗憾的是,这两种解决方案都不起作用。第一个和我的代码一样慢,因为它在超时时已经创建了异常。第二个不识别警报。 @djangofan - 你没有烦人的延误吗? @Alp - 究竟是由什么引起的?你指的是什么? 如果您使用该代码来验证警报是否存在,如果不存在应该会有延迟。是这样吗?因为我试图尽量减少延迟/超时,但没有运气。 另外,也许尝试更新硒罐。当我使用 Selenium 时,他们几乎每月发布一次新版本,有时每月发布两次。

以上是关于使用 Java 在 Selenium WebDriver (selenium 2) 中处理警报的主要内容,如果未能解决你的问题,请参考以下文章

使用 selenium webdriver 定位由 javascript 创建的元素

selenium模块

selenium模块

selenium介绍

Selenium库

selenium webdriver窗口切换