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

Javascript 如何通过Python使用GhostDriver处理警报?,javascript,python,selenium,webdriver,ghostdriver,Javascript,Python,Selenium,Webdriver,Ghostdriver,问题: GhostDriver API尚不支持警报处理。目前有一个可接受的解决方法,就是将您自己的javascript注入到页面中,该页面将处理警报并为您存储其文本 通过python webdriver绑定使用此解决方案时遇到问题。这可能与我对javascript的初级理解有关 下面是我试图利用的变通方法的一个示例: 我正在使用一个演示警报的公共站点,以使这一点更加直观: 这是我的密码: 从selenium导入webdriver 按钮xpath=“/html/body/table[3]/tbo

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

通过python webdriver绑定使用此解决方案时遇到问题。这可能与我对javascript的初级理解有关

下面是我试图利用的变通方法的一个示例:

我正在使用一个演示警报的公共站点,以使这一点更加直观:

这是我的密码:

从selenium导入webdriver
按钮xpath=“/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr/td/div[4]/form/input”
js=”“”
(功能(){
var lastAlert=未定义;
window.alert=功能(消息){
lastAlert=消息;
};
window.getLastAlert=函数(){
var结果=上次警报;
lastAlert=未定义;
返回结果;
};
}());
"""
driver=webdriver.PhantomJS()
司机,上车http://www.tizag.com/javascriptT/javascriptalert.php')
驱动程序。执行_脚本(“window.alert=%s”%js)
驱动程序。通过xpath(按钮xpath)查找元素。单击()
#例外情况刚刚发生
执行脚本(“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 

我是个笨蛋。我希望有人能给我指出正确的方向。

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

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

js = """
window.alert = function(message) {
lastAlert = message;
}
"""
然后通过python中的execute_脚本调用传递js变量,如下所示:

driver.execute_script("%s" % js)
然后,运行完后,您可以在全局lastAlert上执行返回:

driver.execute_script("return lastAlert")

这是一些变通办法

对于以后可能出现警报的每个重新加载的页面,请使用此选项

driver.execute_script("window.confirm = function(){return true;}");
这适用于Selenium/Splitter中的PhantomJS


请参阅更多参考资料。

是的!工作完美。谢谢这可能是显而易见的,但我花了相当长的时间才意识到,您需要在单击按钮之前(或在生成警报之前)执行javascript