当前位置: 首页 > 面试题库 >

如何通过Python使用GhostDriver处理警报?

伍嘉
2023-03-14
问题内容

问题: GhostDriver
API尚不支持警报处理。目前有一种可接受的解决方法,即将您自己的javascript注入将处理警报并为您存储其文本的页面。

我在通过python webdriver绑定使用此解决方法时遇到了麻烦。这可能与我的新手对javascript的理解有关。

这是我尝试利用的变通方法的示例:https
:
//github.com/detro/ghostdriver/issues/20#issuecomment-15641983

我正在使用一个公开的站点来演示警报,以使其变得更加简单:http
:
//www.tizag.com/javascriptT/javascriptalert.php

这是我的代码:

from selenium import webdriver

button_xpath = "/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr/td/div[4]/form/input"

js = """
(function () {
var lastAlert = undefined;
window.alert = function (message) {
    lastAlert = message;
};
window.getLastAlert = function () {
    var result = lastAlert;
    lastAlert = undefined;
    return result;
};
}());
"""

driver = webdriver.PhantomJS()
driver.get('http://www.tizag.com/javascriptT/javascriptalert.php')
driver.execute_script("window.alert = %s" % js)
driver.find_element_by_xpath(button_xpath).click()
#exception just occured
driver.execute_script("return window.getLastAlert && window.getLastAlert();")

例外是:

WebDriverException: Message: u'Error Message => \'Click failed: TypeError: \'undefined\' is not a function (evaluating \'alert(\'Are you sure you want to give us the deed to your house?\')\')\'\n caused by Request => {"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:41752","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\\"sessionId\\": \\"0eaf7680-9897-11e2-b375-55b9cb6ceb0f\\", \\"id\\": \\":wdc:1364578560610\\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/0eaf7680-9897-11e2-b375-55b9cb6ceb0f/element/%3Awdc%3A1364578560610/click"}' ; Screenshot: available via screen

我是JS菜鸟。我希望有人可以指出正确的方向。


问题答案:

一个简单的解决方案是重写window.alert方法,以将参数输出到全局变量。

使用覆盖函数定义js注入变量:

js = """
window.alert = function(message) {
lastAlert = message;
}
"""

然后只需通过python中的execute_script调用传递js变量,如下所示:

driver.execute_script("%s" % js)

然后,当它们全部运行后,您可以对全局lastAlert执行返回:

driver.execute_script("return lastAlert")


 类似资料:
  • 我使用硒与Appium和我的测试运行在Android和iOS真正的设备。一组测试运行在Android上,而iOS是空闲的。然后测试切换到iOS。两个设备同时连接。 下面是我使用testNG运行的套件的序列: 这里的问题是,当测试切换到android时,iOS设备显示os更新安装弹出窗口。我想在测试切换回iOS之前禁用弹出窗口。我可以从设置中删除更新

  • 我正在使用Selenium Webdriver来验证一个特定的站点,在进入该站点时,它会通过一个提示窗口提示我输入用户名和密码。我无法右键单击它来检查属性 我已经尝试了driver.switchTo().alert()和Webdriver Wait,但它仍然不能工作。在Chrome和firefox浏览器上都试过 我希望提示窗口将填充用户名和密码,但它没有

  • 问题内容: 我正在Spark中将模型实现为python类,并且每次尝试将类方法映射到RDD时,它都会失败。我的实际代码更加复杂,但是这个简化的版本成为了问题的核心: 现在,如果我像这样运行模型(例如): 我收到以下错误: 例外:看来您试图从广播变量,操作或转换中引用SparkContext。SparkContext只能在驱动程序上使用,而不能在工作程序上运行的代码中使用。有关更多信息,请参见SPA

  • 问题内容: 我想用于一些Web测试,并且遇到了(https://github.com/detro/ghostdriver)。我已经按照自述文件中的说明进行了构建,并且可以在指定的端口上运行它,但是我不确定如何从Java代码访问Web驱动程序。为了澄清,我已经在ruby中看到了这个示例: 我只是不确定如何从java中执行相同操作。 问题答案: 我相信此链接将回答您的问题。您将需要Selenium 2

  • 问题内容: 我能够通过VLC命令行接收/查看UDP h264数据包(即VLC –network-caching 0 –demux h264 udp:// …) 我正计划通过OpenCV算法处理那些帧。但是,我似乎找不到找到将VLC帧发送到我的Python OpenCV脚本的方法。 是否可以在单独的脚本中通过Numpy传递要处理的VLC流输出? 之前,我曾尝试使用其VideoCapture函数直接将

  • 问题内容: 由于弹出窗口 ,Selenium投掷出现问题 警报具有和按钮。我知道两种解决方法 第一种方法是重新打开一个新会话 第二种方法是使用Robot类 但是,这种方法不是省时的。有什么更好的办法吗? 问题答案: 这应该可以解决问题: