基本上,当在 javascript 中弹出警报时,我可以dismiss()
通过调用selenium.webdriver.common.alert.Alert(browser).dismiss()
.
但是,如果“浏览器用户”通过[OK]
用鼠标单击(在屏幕上)解除警报,则浏览器警报将“迷失在空间”,body.text
无法再从 python 访问。
那么...如何从发出警报的页面中恢复“文本”,尤其是在人类用户单击页面警报上的 [关闭] 之后?
以下是演示问题的提示和脚本...
供参考:始发码的目标是它允许浏览器用户干预在屏幕上在测试和手动响应特定警报。
#!/usr/bin/env python
import os,sys,time
import selenium.webdriver
import selenium.webdriver.support.expected_conditions
print dict(python=sys.version,selenium=selenium.__version__)
path=os.path.join(os.getcwd(),"hello_worlds.html")
url="file:///"+path
open(path,"w").write("""<HTML>
<HEAD><TITLE>Head Title</TITLE></HEAD>
<BODY><H1>Hello, worlds!</H1></BODY>
</HTML> """)
browser=selenium.webdriver.Firefox()
browser.get(url)
body=browser.find_element_by_tag_name("body")
print "BODY:",body.text
try:
for enum,world in enumerate("Mercury Venus Earth Mars Asteroids Jupiter Saturn Uranus Neptune".split()):
if "Earth" in world: world+=": So do MANUALLY dismiss! {Click [OK] now!!!}"
else: world+=": AUTO PILOT... please DONT dismiss! {done via selenium.dismiss()!}"
browser.execute_script('alert("Hello, %s!")'%world)
if selenium.webdriver.support.expected_conditions.alert_is_present():
print selenium.webdriver.common.alert.Alert(browser).text
time.sleep(enum+5)
if "Earth" not in world: selenium.webdriver.common.alert.Alert(browser).dismiss()
print "BODY:",body.text
finally:
browser.quit()
输出:(地球坠毁)
{'python': '2.6.6 (r266:84292, Aug 18 2016, 15:13:37) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]', 'selenium': '2.53.2'}
BODY: Hello, worlds!
Hello, Mercury: AUTO PILOT... please DONT dismiss! {done via selenium.dismiss()!}!
BODY: Hello, worlds!
Hello, Venus: AUTO PILOT... please DONT dismiss! {done via selenium.dismiss()!}!
BODY: Hello, worlds!
Hello, Earth: So do MANUALLY dismiss! {Click [OK] now!!!}!
BODY:
Traceback (most recent call last):
File "./js_alert.py", line 37, in <module>
print "BODY:",body.text
...
selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: Hello, Earth: So do MANUALLY dismiss! {Click [OK] now!!!}!
Message: Unexpected modal dialog (text: Hello, Earth: So do MANUALLY dismiss! {Click [OK] now!!!}!) The alert disappeared before it could be closed.
奇怪的是,如果浏览器用户触发另一个警报(甚至在另一个页面上!),那么 a selenium.dismiss()
willbody.text
从 limbo 和 selenium with from then 中拉回,将按(我的)期望运行。
关于如何让浏览器回到page.body
? (并逃脱警报)
附录:以下是类似的问题(通过大量搜索找到):
- 下载 -使用 Selenium + Firefox 下载文件时出现问题
- java alert - Selenium WebDriver - 意外的模态对话框警报
- UnexpectedAlertPresentException - Webdriver 错误:抛出 UnexpectedAlertPresentException 后“不存在警报”
- DesiredCapabilities -如何在 Selenium 中处理具有“UnexpectedAlertBehaviour”功能的警报?
- java&javascript - org.openqa.selenium.UnhandledAlertException:意外警报打开
- 禁用异常或 DesiredCapabilities - org.openqa.selenium.UnhandledAlertException:意外警报打开
- 非点击建议 -当我显示对话框时,抛出异常“UnhandledAlertException: Modal dialog present”
- IE 和野外 - https://github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/4839
- java错误报告?https://groups.google.com/forum/#!topic/webdriver/aNyOfEjMENg
- “还是不行。” 捕获异常不会重置问题 - (但是几乎完全相同的问题) -如何使用 python 处理 selenium 中的 javascript 警报
- 建议做一个
driver.findElement(By.id("myAlert"));
但抛出相同的异常 - https://sqa.stackexchange.com/questions/22482/why-my-alert-is-not-popping-up browser.refresh();
给UnexpectedAlertPresentException
所以不起作用。https://github.com/angular/protractor/issues/1486browser.switch_to.window(browser.window_handles[0])
然后body.text
给出:UnexpectedAlertPresentException
- 类似 - Python webdriver 处理弹出的浏览器窗口,这不是警报