【问题标题】:Webdriver error: "No alert is present" after UnexpectedAlertPresentException is thrownWebdriver 错误:抛出 UnexpectedAlertPresentException 后“不存在警报”
【发布时间】:2013-07-10 16:35:05
【问题描述】:

我正在尝试测试我正在开发的 web 应用程序。我正在使用针对 Firefox 22.0 的 Firefox 驱动程序。

在某一时刻,可能会弹出一个模式对话框(Javascript prompt())。如果是这样,我想输入一些文本,然后将其关闭(单击确定)。

以下是相关代码:

try:
    if button.text == "Run":
        button.click()
except UnexpectedAlertPresentException:
    alert = self.driver.switch_to_alert()
    print alert.text
    alert.send_keys('8080')
    alert.dismiss()

UnexpectedAlertPresentException 正在被抛出。但是,一旦它尝试执行print alert.text,我就会得到:

`NoAlertPresentException: Message: u'No alert is present'`.

如果我删除打印语句,它会在alert.send_keys 爆炸:

`WebDriverException: Message: u'fxdriver.modals.find_(...) is null'`

我不明白。根据定义,NoAlertPresentException 是否与引发的 UnexpectedAlertPresentException 相矛盾并导致 except 块首先被执行?

编辑:另外,我终生无法在 http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html#documentation 中的 UnexpectedAlertPresentException 上找到任何文档

编辑 2:这就是我现在所拥有的:

try:
    if button.text == "Run":
        button.click()

        alert = self.driver.switch_to_alert()

        alert.send_keys('1111')
        alert.dismiss()

 except NoAlertPresentException:
     pass

但是,我仍然看到这个:

WebDriverException: Message: u'fxdriver.modals.find_(...) is null' 

在线alert.send_keys('8080')。我想我不明白为什么 switch_to_alert() 在没有警报的情况下不会抛出 NoAlertPresent ......这就是我假设 WebDriverException 所指示的内容。

【问题讨论】:

  • 我可以对你说的是,你会得到更多,而不仅仅是一种类型的错误。因此,要让更多的道路勇士,您必须尝试处理 2 或 3 个最常见的问题,例如超时、不存在或意外。您必须从 selenium.common.exceptions 导入它们中的每一个,并添加一个 Except NameOfError 块然后处理它。我今天看到我可以放不止一个 except ,并且还从你的代码示例中学会了 pass :) 热爱 python 并且每天都在学习它。
  • 你必须用 Try 块包围`alert = self.driver.switch_to_alert()`。您正在强制脚本更改为可能不在这里的警报。试试这个:pastebin.com/02RALuGp
  • 我认为这个问题是异常处理程序从浏览器中删除了警报。这有点违反直觉。
  • 这可能是根本原因吗?绕过调用 fxdriver.modals.clearFlag_ ... cf。 stackoverflow.com/questions/44568402/…

标签: python selenium webdriver selenium-webdriver


【解决方案1】:

我认为 Selenium 会关闭意外警报。显然,您可以更改 Firefox 驱动程序处理意外警报的方式: How to handle an Alert with "UnexpectedAlertBehaviour" capability in Selenium?

作为替代方案,您可以在采取行动之前检查是否有警报(毕竟,如果您想处理警报,这并不意外),就像这样(Java):

try {
  Alert alert = _driver.switchTo().alert();
  //do stuff with alert
} catch (final NoAlertPresentException e) {
  //do non-alert stuff
}

【讨论】:

    【解决方案2】:

    我可能不是最好的 Python 程序员,因为我是在 1 周前开始使用它的。 我已经设法创建了一个可以接受任何警报的小函数,并且还会发出更多警报。

    在第 -2 行(从尾部开始的第二个)将 IF 更改为 WHILE,我们还可以处理连续的确认/警报。 使用 IF 你可以处理 confirm() 的回复 使用 WHILE 你可以处理所有的alerts()。 如果警报超时,您必须在正确的时刻尝试“绕过”警报()。

    我设法添加了 2 个异常处理程序,以绕过 uknown alerts() 并在不存在 alert() 时停止。

    import selenium
    from selenium import webdriver
    import os
    import time
    from selenium.common.exceptions import UnexpectedAlertPresentException
    from selenium.common.exceptions import NoAlertPresentException
    
    os.system("pkill php")
    os.system("php -S localhost:2222 alert.html &")
    
    fire = webdriver.Firefox()
    fire.get("http://localhost:2222")
    global alert
    
    def alert_accept():
      try:
        alert = fire.switch_to_alert()
        print "Aler text:" + alert.text
        alert.accept()
        print "Alert detected, accept it"
        return True
      except UnexpectedAlertPresentException:
        print "Hum..., continue?"
        return False
      except NoAlertPresentException:
        print "No alert here"
        return False
    
    while alert_accept() == True:
      alert_accept()
    

    您无法在任何网站上对其进行测试。我已经制作了一个带有一些不同警报的本地 html,以便对此进行一些研究。

    HTML 代码:

    <script type="text/javascript">
    var c = confirm("Do you like kidding yourself?")
    if (c == true) {
      alert("true")
    } else {
      alert("You're the kidding master, another alert!")
    }
    </script>
    
    <script type="text/javascript">
    var c = confirm("Do you like kidding yourself?")
    if (c == true) {
      alert("true")
    } else {
      alert("You're the kidding master, another alert!")
    }
    </script>
    
    <script type="text/javascript">
    console.log("Running test with timeout")
    </script>
    
    <script type="text/javascript">
    setTimeout(function(){ 
      var c = confirm("Do you like kidding yourself?")
    if (c == true) {
      alert("true")
    } else {
      alert("You're the kidding master, another alert!")
    }
     }, 5000)
    </script>
    

    实际上,WHILE 和 IF 处理整个页面,我猜是因为超时。如果你把所有的东西都放在一次就可以了。

    我很确定这可以使用隐式等待和最短代码的预期条件来完成。如果您查看 alert_is_present 的来源,您只会看到一个 try:block 并返回 true/false。

    【讨论】:

      【解决方案3】:

      对于我的情况,我需要在不选择文件的情况下单击上传按钮并检查是否有警报消息出现。 但在我的情况下,当点击上传按钮时,下面的异常即将到来 selenium.common.exceptions.UnexpectedAlertPresentException:警报文本: 消息:存在模态对话框 在我的情况下 alert.accept 或 alert.dismiss 不起作用 所以,我确实按 Tab 并选择 Upload 按钮,然后通过 Python Code 按 Enter 键。它的工作完美。

      【讨论】:

        猜你喜欢
        • 2022-09-29
        • 2019-09-25
        • 2021-11-23
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        相关资源
        最近更新 更多