66

我正在尝试用 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

5 回答 5

109

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

于 2013-09-26T04:19:41.440 回答
12

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

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

  • 姜戈 1.8
  • 蟒蛇 2.7
  • 硒 2.46.0

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

出现意外警报时抛出。

通常在预期模式阻止 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")出线了。

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

于 2015-07-19T18:55:16.593 回答
2

在java中我们这样做

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

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

希望能帮助到你。

于 2013-09-26T05:31:51.067 回答
0
alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()
于 2019-06-21T21:04:37.673 回答
0

使用显式等待方法尝试这个简短的解决方案。

try:
    wait.until(EC.alert_is_present())
    driver.switch_to.alert.accept()
    print("Alert accepted")
except:
    print("no Alert found")
于 2022-02-15T10:12:40.477 回答