【问题标题】:Selenium NoAlertPresentExceptionSelenium NoAlertPresentException
【发布时间】:2019-02-26 00:39:47
【问题描述】:

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

场景是:

  1. 点击按钮调用对话框

    button.click();

  2. 尝试接受

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

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

对不起,我的英语不好。

【问题讨论】:

  • 是时间问题吗?
  • 您使用的是哪个驱动程序?例如 SafariDriver 将自动关闭所有警报,因为它无法处理它们。
  • 你解决过这个问题吗?我有完全相同的问题。谷歌考古似乎没有任何帮助:)
  • @JacobR:也许你可以尝试增加一些额外的等待时间,就像the answer 建议的那样。

标签: selenium selenium-webdriver


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    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();
                    }
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • 第一个函数返回是否有alert。
    • 第二个函数点击警报确定按钮
    【解决方案3】:
    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; 
        } 
    
    } 
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        一些附加信息。对于此线程的未来读者:

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

        1. 出于某种目的(例如,查找表单错误)查询/解析底层 Html 页面的 DOM

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

        当警报显示在 Html 页面上时,如果忽略警报并且首先查询 Html 页面下的 DOM,则 Webdriver 似乎无法跟踪警报并导致异常。

        这是在 geckodriver 0.21.0, Firefox 66.0b10 (64-bit) 中观察到的; python 3.6.1 Selenium 驱动程序 3.14(用于 Python)。

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

        【讨论】:

          猜你喜欢
          • 2019-07-03
          • 2020-12-05
          • 2012-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-21
          • 2011-08-07
          相关资源
          最近更新 更多