Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用selenium和python检查是否存在任何警报_Python_Selenium_Testing_Alert_Window Handles - Fatal编程技术网

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

使用selenium和python检查是否存在任何警报,python,selenium,testing,alert,window-handles,Python,Selenium,Testing,Alert,Window Handles,我正试图用python语言为管理用户的网页编写一个使用selenium的测试。在此页面中,有人可以为用户添加角色,如果添加角色时存在角色,则会发出警报。我不知道该警报是javascript警报还是网页元素。我想自动检查警报是否存在,因为检查列表中的角色既浪费时间,又有巨大的负载。我试过这个: browser = webdriver.Firefox() browser.get("url") browser.find_the_element_by_id("add_button").click() t

我正试图用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"
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()) 
但它不起作用,我得到了“意想不到的AlertPresentException”。 我也试过:

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"
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访问警报,以检查是否可以访问其属性,但右键单击被禁用。 我需要一个非常快速的解决方案,即使是其他语言。无论如何,我能理解这种方法。
我将非常感谢您的帮助。

我要做的是在我希望看到警报的时间点之前设置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(浏览器,
3
将至少等待3秒钟,以显示支持的警报。

在java中,我们是这样做的

WebDriverWait wait3 = new WebDriverWait(driver, 7000);
wait3.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
它将隐式等待警报,如果警报不存在,它将抛出“警报不存在例外”,我们可以捕获并继续


希望能有所帮助。

我知道这是一个太晚的答案,你在几年前就解决了这个问题,但我仍然想发表我的分析和发现,供未来可能的读者参考

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

  • Django 1.8
  • Python 2.7
  • 硒2.46.0
我读了关于“意外的AlertPresentException”的文档,它说:

出现意外警报时引发

通常在预期模式阻止webdriver窗体执行任何其他命令时引发

我在我的项目中进行了测试,结果如下:

  • 当警报框打开时,
    find\u element\u by\u 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()
换句话说,可能有一个隐藏在更深层次的问题,导致页面一打开警报框就出现。您可能需要先解决该问题

另一件事是:假设警告框显示在这一行之后:

browser.get("url")
browser.find_the_element_by_id("add_button").click()
然后,
alert=browser.switch_to_alert()
应该可以正常工作,不会引发异常,这与您在这里描述的内容相矛盾。这也让我觉得问题早在
browser.get(“url”)
行就出现了


我不太确定选择的解决方案是如何帮助您解决问题的,因为我的分析显示问题位于不同的位置无论如何,我不是要求重新选择接受的解决方案。我只想与未来的读者分享我的想法。如果我忽略或误解了这个问题中的某些内容,导致我的分析错误(这浪费了您阅读本文的时间:-),请道歉。

您是否尝试过在单击和切换到警报之间进行短暂延迟?还没有,谢谢您的建议@Richard。我想我可以用A.R.给我的密码me@Richard从
切换到\u alert()
accept()
之间必须有延迟吗?否则可能会有问题,你认为?@begueradj,我认为@Richard的意思是我应该在元素上的
click()
switch_to_alert()
。只需关闭它:D self.execute_script('window.alert=function(){};')谢谢@a.R。它对我完全有效。我陷入这个问题已经有10个小时了。如何检测网页上可能存在的所有警报(自动弹出,无需点击按钮)?只需一小段信息-switch_to_alert()现已被弃用,并已被switch_to替换。警报“timeout”将是
switch_to_alert()上的一个很好的附加参数
浏览器。切换到.alert()
应该是
浏览器。切换到.alert
--(Abhishek Singh)在“警报”谢谢之后没有括号。我在Python中做了同样的处理。它是解决方案。欢迎回答堆栈溢出。一般来说欢迎回答,请考虑将上下文添加到代码中,以便其他人理解您的解决方案。