如何使用WebDriver检查警报是否存在?


77

我需要检查WebDriver中是否存在Alert。

有时会弹出警报,但有时不会弹出。我需要先检查警报是否存在,然后才能接受或关闭它,否则它将说:未找到警报。

Answers:


85
public boolean isAlertPresent() 
{ 
    try 
    { 
        driver.switchTo().alert(); 
        return true; 
    }   // try 
    catch (NoAlertPresentException Ex) 
    { 
        return false; 
    }   // catch 
}   // isAlertPresent()

在此处查看链接https://groups.google.com/forum/?fromgroups#!topic/webdriver/1GaSXFK76zY


2
在链接中,您可以看到hos接受或关闭警报窗口
VinnyG

3
下面的稍微错误的答案以及stackoverflow.com/questions/8244723/…上的答案是一种更好的方法。尝试/捕获模型以及笨拙的模型都会记录一条有关没有警报的消息。
Don Willis 2013年

4
ExpectedConditions.alertIsPresent()给您完全一样的东西,但是用一种更好的方式,而且只用一行:)
nilesh 2014年

与简单的try catch相比,ExpectedConditions不会保存更多的代码。
sinisterrook

1
这种方法的一个问题是,在检查警报是否存在的同时,上下文已切换到警报。如果您不期望这样做,可能会出现问题。
JeffC

26

以下内容(C#实现,但在Java中类似)使您能够确定是否存在没有异常且没有创建WebDriverWait对象的警报。

boolean isDialogPresent(WebDriver driver) {
    IAlert alert = ExpectedConditions.AlertIsPresent().Invoke(driver);
    return (alert != null);
}

12

我建议使用ExpectedConditionsalertIsPresent()。ExpectedConditions是一个包装器类,它实现在ExpectedCondition接口中定义的有用条件。

WebDriverWait wait = new WebDriverWait(driver, 300 /*timeout in seconds*/);
if(wait.until(ExpectedConditions.alertIsPresent())==null)
    System.out.println("alert was not present");
else
    System.out.println("alert was present");

在“ alertIsPresent()”之后添加“ .apply(driver)”或正确执行并使用等待
Don Willis

我发现这引发了TimeoutException。
文斯·鲍德伦

在给定的超时时间内未满足预期条件的TimeoutException。警报完全存在吗?
nilesh

@nilesh链接已损坏
Dev

7

我发现(FF V20和selenium-java-2.32.0)的捕获异常driver.switchTo().alert();是如此缓慢。Firefox

所以我选择了另一种方式:

    private static boolean isDialogPresent(WebDriver driver) {
        try {
            driver.getTitle();
            return false;
        } catch (UnhandledAlertException e) {
            // Modal dialog showed
            return true;
        }
    }

当大多数测试用例都没有对话框出现时(这是抛出异常的代价很高),这是一种更好的方法。


当我调用函数的C#实现时,它会引发异常,但也会关闭警报。
RMK

1
尽管它也关闭了警报,但到目前为止,我发现这种方法在处理警报检测时最快,甚至比ExpectedConditions.alertIsPresent
Thariq Nugrohotomo

这种方法的主要问题是它吃了警报。当没有警报时,driver.switchTo()。alert()在FF 62中花费约6-10毫秒
Pranoy Sarkar

6

我建议使用ExpectedConditionsalertIsPresent()。ExpectedConditions是一个包装器类,它实现在ExpectedCondition接口中定义的有用条件。

public boolean isAlertPresent(){
    boolean foundAlert = false;
    WebDriverWait wait = new WebDriverWait(driver, 0 /*timeout in seconds*/);
    try {
        wait.until(ExpectedConditions.alertIsPresent());
        foundAlert = true;
    } catch (TimeoutException eTO) {
        foundAlert = false;
    }
    return foundAlert;
}

注意:这基于nilesh的答案,但适用于捕获由wait.until()方法引发的TimeoutException。


另一个注意事项:在C#中,这是WebDriverTimeoutException。我想那是因为有一个System.TimeoutException类可以很容易地与之混淆。
John Chesshir

2

此代码将检查警报是否存在。

public static void isAlertPresent(){
    try{
    Alert alert = driver.switchTo().alert();
    System.out.println(alert.getText()+" Alert is Displayed"); 
    }
    catch(NoAlertPresentException ex){
    System.out.println("Alert is NOT Displayed");
    }
    }


1

public boolean isAlertPresent(){

try 
{ 
    driver.switchTo().alert(); 
    system.out.println(" Alert Present");
}  
catch (NoAlertPresentException e) 
{ 
    system.out.println("No Alert Present");
}    

}


添加一些更详细的描述。
马修斯阳光明媚

1
public static void handleAlert(){
    if(isAlertPresent()){
        Alert alert = driver.switchTo().alert();
        System.out.println(alert.getText());
        alert.accept();
    }
}
public static boolean isAlertPresent(){
      try{
          driver.switchTo().alert();
          return true;
      }catch(NoAlertPresentException ex){
          return false;
      }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.