brm*_*rma 7 javascript python selenium webdriver ghostdriver
问题: 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();")
Run Code Online (Sandbox Code Playgroud)
例外是:
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
Run Code Online (Sandbox Code Playgroud)
我是JS菜鸟.我希望有人能指出我正确的方向.
ale*_*ss3 10
一个简单的解决方案是重写window.alert方法以将参数输出到全局变量.
使用覆盖函数定义js注入变量:
js = """
window.alert = function(message) {
lastAlert = message;
}
"""
Run Code Online (Sandbox Code Playgroud)
然后只需通过python中的execute_script调用传递js变量,如下所示:
driver.execute_script("%s" % js)
Run Code Online (Sandbox Code Playgroud)
然后,当它全部运行时,您可以在全局lastAlert上执行返回:
driver.execute_script("return lastAlert")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5108 次 |
| 最近记录: |