使用 selenium 和 python 检查是不是存在任何警报

Posted

技术标签:

【中文标题】使用 selenium 和 python 检查是不是存在任何警报【英文标题】:Check if any alert exists using selenium with python使用 selenium 和 python 检查是否存在任何警报 【发布时间】:2013-09-30 22:22:03 【问题描述】:

我正在尝试用 python 语言为管理用户的网页编写一个带有 selenium 的测试。在此页面中,有人可以为用户添加角色,如果在添加角色时存在角色,则会发出警报。我不知道警报是 javascript 警报还是网页的元素。我想自动检查警报的存在,因为检查列表中的角色会浪费时间并且负载很大。我试过这个:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
try:
    alert = browser.switch_to_alert()
    alert.accept()
    print "alert accepted"
except:
    print "no alert"

但它不起作用,我得到了“UnexpectedAlertPresentException”。 我也试过这个:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
s = set(browser.window_handles)
s.remove(browser.current_window_handle)
browser.switch_to_window(s.pop()) 

但我遇到了同样的例外。 此外,我尝试使用 firebug 访问警报以检查是否可以访问其属性,但右键单击被禁用。 我很快就需要一个解决方案,即使是其他语言。无论如何,我可以理解这种方法。 我将不胜感激。

【问题讨论】:

您是否尝试过在点击和 switch_to_alert 之间有短暂的延迟? 还没有,谢谢@Richard 的这个建议。我想我可以使用 A.R. 的代码。给了我 @Richard 在switch_to_alert()accept() 之间一定有延迟吗?否则可能会有问题,你认为? @begueradj,我认为@Richard 的意思是我应该在元素上的click()switch_to_alert() 之间放置一个延迟。 把它关掉 :D self.execute_script('window.alert = function();') 【参考方案1】:
alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()

【讨论】:

欢迎来到 Stack Overflow!虽然通常欢迎回答,但请考虑在您的代码中添加上下文,以便其他人理解您的解决方案。 ``` if alert.is_displayed(): AttributeError: 'Alert' object has no attribute 'is_displayed'```【参考方案2】:

在java中我们这样做

WebDriverWait wait3 = new WebDriverWait(driver, 7000);
wait3.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();

如果警报不存在,它将隐式等待警报,它会抛出“警报不存在异常”,我们可以捕获并继续前进。

希望对你有帮助。

【讨论】:

谢谢@Abhishek Singh。我在 python 中做了同样的事情,这就是解决方案。【参考方案3】:

我所做的是在我希望看到警报的点之前使用 WebDriverWait 设置条件延迟,然后切换到它,如下所示:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

browser = webdriver.Firefox()
browser.get("url")
browser.find_element_by_id("add_button").click()

try:
    WebDriverWait(browser, 3).until(EC.alert_is_present(),
                                   'Timed out waiting for PA creation ' +
                                   'confirmation popup to appear.')

    alert = browser.switch_to.alert
    alert.accept()
    print("alert accepted")
except TimeoutException:
    print("no alert")

WebDriverWait(browser,3) 将等待至少 3 秒以显示支持的警报。

【讨论】:

谢谢@A.R.它完全适合我。我已经被这个问题困扰了大约 10 个小时。 如何检测网页上可能存在的所有警报(自动弹出,无需点击按钮)? 只是一小部分信息- switch_to_alert( ) 现在已弃用,并已替换为 switch_to.alert "timeout" 将是switch_to_alert() 上的一个很好的附加参数 browser.switch_to.alert() 应该是 browser.switch_to.alert --('alert' 后面没有括号【参考方案4】:

我知道这是一个为时已晚的答案,而且您在几年前就已经解决了这个问题,但我仍然想发布我的分析和发现,以供将来可能的读者参考。

我正在做一个 Django 网站开发项目,目前存在一个错误,即一旦打开特定网页,就会弹出一个错误消息框。我的环境是:

Django 1.8 Python 2.7 硒 2.46.0

我阅读了有关“UnexpectedAlertPresentException”的文档here,它说:

出现意外警报时抛出。

通常在预期模式阻止 webdriver 表单执行更多命令时引发。

我在我的项目中进行了测试,我的发现是:

当警报框出现时,find_element_by_X 方法可以成功。 click() 或 send_keys() 将失败并出现“UnexpectedAlertPresentException”。

因此,我认为try...catch 块不起作用,因为“UnexpectedAlertPresentException”被抛出

browser.find_the_element_by_id("add_button").click()

这也意味着只要网页被这一行打开,警告框就可能出现:

browser.get("url")

换句话说,可能存在更深层次的问题,导致页面一打开就弹出警告框。您可能需要先解决该问题。

另一件事是:假设警报框出现在这一行之后:

browser.find_the_element_by_id("add_button").click()

那么alert = browser.switch_to_alert() 应该可以正常工作,不会抛出异常,这与您在此处描述的内容相矛盾。这也让我觉得问题早在browser.get("url")那一行。

我不太确定所选解决方案如何帮助您解决问题,因为我的分析表明问题出在不同的地方。 无论如何,我并不是要求重新选择已接受的解决方案。我只是想为未来的读者分享我的想法。道歉,以防我忽略或误解了这个问题中的某些内容,导致我的分析错误(这会浪费你阅读本文的时间:-)。

【讨论】:

以上是关于使用 selenium 和 python 检查是不是存在任何警报的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python Selenium 检查元素是不是存在

如何使用 Python 在 Selenium WD 中检查变量的值是不是为整数? [复制]

如何检查 Selenium Python 中是不是选中/取消选中复选框? [复制]

在 Python 中,如何检查 Selenium WebDriver 是不是已退出?

Selenium Webdriver Python - 检查元素是不是可见/检测到/存在[重复]

Selenium Python 检查变量值是不是不为空。我得到 False 但有一个价值