我如何恢复“文本"?从发出警报的页面开始,尤其是在人类用户 *点击* [关闭] 页面的**警报** 之后**? [英] How do I recover the "text" from the page originating the alert, esp **after** the human user has *clicked* [dismiss] on the page's **alert**?
问题描述
基本上,当在 javascript 中弹出警报时,我可以通过调用 selenium.webdriver.common.alert.Alert(browser) 从 python 中
.dismiss()
它完全可以.解雇()
Basically, when an alert is popped up in javascript, I can dismiss()
it from python perfectly OK, by calling selenium.webdriver.common.alert.Alert(browser).dismiss()
.
但是,如果浏览器用户"通过用鼠标单击[OK]
(在屏幕上)来解除警报,则浏览器警报将在 正文中显示Lost in Space".文本
不能再从python访问.
However, if the "browser user" dismisses the alert by clicking [OK]
(on screen) with their mouse, then the browser alert gets "Lost in Space" the body.text
can no longer be accessed from python.
所以......我如何从发出警报的页面中恢复文本",尤其是之后人类用户点击 [关闭]页面的<强>警报?
So... How do I recover the "text" from the page originating the alert, esp after the human user has clicked [dismiss] on the page's alert?
以下是演示问题的提示和脚本...
Here are the hints and a script to demonstrate the problem...
仅供参考:原始代码的目的是允许浏览器用户在测试中在屏幕上干预并手动响应特定警报.
FYI: The objective of the originating code is it allow the browser user intervene on screen in testing and manually response to specific alerts.
#!/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)
[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.
奇怪的是,如果浏览器用户触发另一个警报(甚至在另一个页面上!),然后selenium.dismiss()
将 body.text
从 limbo 和 selenium 中拉回来,从那时起 将按照(我的)期望运行.
The strange thing is that if the browser user triggers another alert (on another page even!), then a selenium.dismiss()
will pull body.text
back from limbo and selenium with from then will operate as per (my) expectations.
关于如何让浏览器返回到 page.body
的任何建议?(并逃脱警报)
Any suggestions on how to get the browser back to the page.body
? (And escape the alert)
附录:以下是类似问题(通过大量搜索找到):
Addendum: Here are similar questions (found with intense searching):
- 下载 - 使用 Selenium + Firefox 下载文件的问题
- java 警报 - Selenium WebDriver - 意外模式对话框警报
- UnexpectedAlertPresentException - 网络驱动程序错误:不存在警报";抛出 UnexpectedAlertPresentException 之后
- DesiredCapabilities - 如何使用 " 处理警报;意外警报行为"Selenium 的能力?
- 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
- 类似 - Pythonwebdriver 处理弹出的浏览器窗口,这不是警报
- downloading - Issues downloading file using Selenium + Firefox
- java alert - Selenium WebDriver - Unexpected modal dialog Alert
- UnexpectedAlertPresentException - Webdriver error: "No alert is present" after UnexpectedAlertPresentException is thrown
- DesiredCapabilities - How to handle an Alert with "UnexpectedAlertBehaviour" capability in Selenium?
- java&javascript - org.openqa.selenium.UnhandledAlertException: unexpected alert open
- disables exception or DesiredCapabilities - org.openqa.selenium.UnhandledAlertException: unexpected alert open
- non-click suggestion - When I show a dialog, an exception "UnhandledAlertException: Modal dialog present" is thrown
- IE and in the wild - https://github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/4839
- java bug report? https://groups.google.com/forum/#!topic/webdriver/aNyOfEjMENg
- "still doesn't work." catching exception does not reset the problem - (However almost exactly the same problem) - how to handle javascript alerts in selenium using python
- suggested doing a
driver.findElement(By.id("myAlert"));
but that throws same exception - https://sqa.stackexchange.com/questions/22482/why-my-alert-is-not-popping-up browser.refresh();
givesUnexpectedAlertPresentException
so doesn't work. https://github.com/angular/protractor/issues/1486browser.switch_to.window(browser.window_handles[0])
thenbody.text
gives:UnexpectedAlertPresentException
- Similar - Python webdriver to handle pop up browser windows which is not an alert
推荐答案
我已经为这个问题断断续续地挣扎了很长时间;您对问题的评论为我解决了问题:
I have been struggling with this issue off and on for a long time; your comment on your question solved the problem for me:
在 UnexpectedAlertPresentException
和 NoAlertPresentException
都被抛出之后...
After both UnexpectedAlertPresentException
and NoAlertPresentException
are thrown...
browser.execute_script('alert("Clearing out past dialogs.")')
browser.switch_to.alert.accept()
正如您在回答中所说,当出现警报时,webdriver 正在创建一个对话框".手动关闭警报会导致其引用丢失,但仍会阻止对 body.text
的访问.创建新警报似乎允许 webdriver 清除旧的对话框",并(在接受后)再次授予对该页面的访问权限.
As you said in your answer, webdriver is creating a 'dialog' when the alert is present. Closing the alert by hand causes its reference to get lost in limbo, but it's still blocking access to body.text
. Creating a new alert seems to allow webdriver to clear out that old 'dialog' and (after accepting) grants access to the page again.
这篇关于我如何恢复“文本"?从发出警报的页面开始,尤其是在人类用户 *点击* [关闭] 页面的**警报** 之后**?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!