我正在尝试使用webdriver尝试phantomJS,但在处理JavaScript警报时遇到了麻烦。我注意到phantomjs驱动程序desired_capabilities有一个字段。'handlesAlerts': False 有没有办法将此值设置为true?我已经尝试了明显的方法,但是没有任何效果:
'handlesAlerts': False
drv = webdriver.PhantomJS(desired_capabilities={'handlesAlerts': True}) print drv.desired_capabilities {u'browserName': u'phantomjs', u'driverName': u'ghostdriver', u'driverVersion': u'1.0.3', u'handlesAlerts': False, u'javascriptEnabled': True,...}
我可以更改字典中的值drv.desired_capabilities['handlesAlerts'] = True,但是当我尝试切换到警报时,会收到错误消息。
drv.desired_capabilities['handlesAlerts'] = True
$cat index.html <html> <body> <script type="text/javascript"> alert('FOO!'); </script> Hello World. </body> </html> >>> from selenium import webdriver >>> driver = webdriver.PhantomJS() >>> driver.desired_capabilities['handlesAlerts'] = True >>> driver.get('index.html') >>> alert = driver.switch_to_alert() >>> alert.text Traceback (most recent call last): <snip> selenium.common.exceptions.WebDriverException: Message: 'Invalid Command Method - Request => {"headers":{"Accept":"application/json", "Accept- Encoding":"identity", "Connection":"close", "Content-Type":"application/json;charset=UTF- 8", "Host":"127.0.0.1:56009", "User-Agent":"Python- urllib/2.7"}, "httpVersion":"1.1", "method":"GET", "url":"/alert_text", "urlParsed": {"anchor":"", "query":"", "file":"alert_text", "directory":"/", "path":"/alert_text", "relative":"/ alert_text", "port":"", "host":"", "password":"", "user":"", "userInfo":"", "authority":"", "protocol ":"", "source":"/alert_text", "queryKey":{}, "chunks":["alert_text"]}, "urlOriginal":"/session/cd31ed90-a5f8-11e2-856d-5783db9f5342/alert_text"}'
API指定了将所需功能传递给构造函数。但是,可能是驱动程序不支持所需功能中要求的功能。在这种情况下,驱动程序不会抛出任何错误,这是有意的。会话返回一个功能对象,该对象指示该会话实际支持的功能。
这就是这种情况下实际发生的情况。PhantomJS驱动程序不支持处理警报,如源代码中所示,返回的功能对象表明了很多。在大多数语言绑定中,此返回的功能对象是只读的。在返回的对象可能是读写的语言绑定中,修改这些功能对会话没有实际影响。在未完成的W3C WebDriver规范中,有一个requiredCapabilities设置,如果服务器无法提供该功能,则会抛出异常,但是据我所知,尚未由任何驱动程序实现。
requiredCapabilities