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

时间:2013-09-25 10:56:10

标签: python testing selenium alertdialog window-handles

我试图用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访问警报以检查我是否可以访问其属性,但右键单击已禁用。 即使在其他语言中,我也需要非常快速的解决方案。无论如何我能理解这种方法。 我将不胜感激。

4 个答案:

答案 0 :(得分:70)

我所做的是在我希望看到警报的点之前使用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秒钟才能显示支持的提醒。

答案 1 :(得分:6)

我知道这是一个太迟的答案,你已经在几年前解决了这个问题,但我仍然想发表我的分析和发现,以供将来读者参考。

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

  • Django 1.8
  • Python 2.7
  • Selenium 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")行。

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

答案 2 :(得分:1)

在java中我们这样做

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

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

希望它有所帮助。

答案 3 :(得分:0)

alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()