7

我正在尝试使用 selenium WebDriver 处理对话框(确定取消类型)。所以我的目标是单击“确定”按钮。

场景是:

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

    button.click();

  2. 尝试接受

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

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

我很抱歉我的英语不好。

4

5 回答 5

9

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

button.click();
WebDriverWait wait = new WebDriverWait(driver, 5);
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
alert.accept();
于 2013-07-19T16:08:31.827 回答
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();
                }
于 2017-02-14T09:56:42.877 回答
0

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

于 2016-06-28T17:14:42.080 回答
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; 
    } 

} 

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

于 2016-02-29T14:30:28.473 回答
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) 可以解决问题。

于 2019-02-25T16:39:47.470 回答