Selenium NoAlertPresentException

时间:2013-07-19 14:46:52

标签: selenium selenium-webdriver

我正在尝试使用selenium WebDriver处理对话框(Ok Cancel type)。所以我的目标是点击“确定”按钮。

情景是:

  1. 点击按钮以调用对话框

    button.click();

  2. 尝试接受

    webDriver.switchTo().alert().accept();

  3. 但我总是得到NoAlertPresentException并且看到该对话框几乎立即关闭。 在我看来,Selenium自动关闭对话框,当我想接受时,没有什么可以接受的。

    我很抱歉我的英语不好。

5 个答案:

答案 0 :(得分:6)

此问题的常见原因是Selenium太快并且尝试接受浏览器尚未打开的警报。这可以通过明确的等待来简单地解决:

button.click();
WebDriverWait wait = new WebDriverWait(driver, 5);
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
alert.accept();

答案 1 :(得分:1)

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

Step 2:
public boolean tocheck_POP_Dialog()
    {   Alert alert;
        try
        {   
            alert=driver.switchTo().alert();


        }
        catch(NoSuchElementException elementException)
        {   
            return false;
        }

        alert.accept(); //Close Alert popup


        return true;
    }




Step 3 :
if(dummyPage.isAlertPresent())
                {
                    dummyPage.tocheck_POP_Dialog();
                }

答案 2 :(得分:0)

public boolean isAlertPresent(){ 
    try{ 
        Alert a = new WebDriverWait(driver, 10).until(ExpectedConditions.alertIsPresent());
        if(a!=null){
            System.out.println("Alert is present");
            driver.switchTo().alert().accept();
            return true;
        }else{
            throw new Throwable();
        }
    } 
    catch (Throwable e) {
        System.err.println("Alert isn't present!!");
        return false; 
    } 

} 

使用显式等待检查警报,然后执行操作。这可能对你有帮助。 :)

答案 3 :(得分:0)

通常会发生这种情况,因为Selenium命令运行得太快,它会在打开之前尝试关闭警报。因此,在点击事件后添加延迟应该可以解决问题。此外,如果您使用Safari浏览器进行测试,SafariDriver在处理警报时会遇到一些问题。 SafariDriver cannot handle alerts应该为您提供更多详细信息。

答案 4 :(得分:0)

一些其他信息。对于该线程的未来读者:

如果即使在解决了等待方面之后该异常仍然存在,请检查以下步骤序列在测试脚本中是否有效:

  1. 出于某些目的(例如查找表单错误)查询/解析了基本HTML页面的DOM

  2. (在driver.switch_to.alert被尝试之前)

在“ HTML”页面上显示警报时,如果忽略了该警报,并且首先查询了“ HTML”页面下面的DOM,则Webdriver似乎会松动警报并导致异常。

使用以下工具观察到该问题:geckodriver 0.21.0,Firefox 66.0b10(64位); python 3.6.1 Selenium驱动程序3.14(适用于Python)。

在发现(1)之前执行(2)即可解决问题。