我如何恢复“文本"?从发出警报的页面开始,尤其是在人类用户 *点击* [关闭] 页面的**警报** 之后**? [英] 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**?

查看:17
本文介绍了我如何恢复“文本"?从发出警报的页面开始,尤其是在人类用户 *点击* [关闭] 页面的**警报** 之后**?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上,当在 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):

  • 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(); gives UnexpectedAlertPresentException so doesn't work. https://github.com/angular/protractor/issues/1486
  • browser.switch_to.window(browser.window_handles[0]) then body.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:

UnexpectedAlertPresentExceptionNoAlertPresentException 都被抛出之后...

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆