Selenium期望的能力 - 为PhantomJS驱动程序设置handlesAlerts

12

我正在使用webdriver尝试phantomJS,但在处理javascript警报时遇到了问题。 我注意到phantomjs驱动程序的desired_capabilities有一个字段'handlesAlerts':False,是否有办法将此值设置为true?我尝试了显然的方法,但没有任何效果:

我正在使用webdriver尝试phantomJS,但在处理JavaScript警报时遇到了问题。 我注意到phantomjs驱动器的desired_capabilities中有一个字段'handlesAlerts': False。 是否可以将该值设置为True? 我已经尝试了显而易见的方法,但这没有任何效果:

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,但当我试图切换到警报时,我会收到一个错误消息。

$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"}' 
1个回答

13

API规定必须将所需能力传递给构造函数,但是可能存在驱动程序不支持所请求的某些功能的情况。在这种情况下,驱动程序不会引发任何错误,这是故意的。会话返回一个能力对象,该对象指示会话实际支持哪些功能。

这就是实际上发生的情况。如源代码中所示,PhantomJS驱动程序不支持处理警报,返回的能力对象也表明了这一点。在大多数语言绑定中,此返回的能力对象是只读的;在可能是读写的语言绑定中,修改这些能力对会话没有实际影响。在未来的W3C WebDriver规范中,有一个requiredCapabilities设置,如果服务器无法提供该功能,则会抛出异常,但据我所知,目前还没有任何驱动程序实现它。


1
维基页面误导了。实际上,API 的实现方式是您传递所需的功能,远程端使用其能够创建的内容创建会话。远程端返回会话中实际可用的功能,并且该通信是单向的(本地编辑无法影响远程会话)。在待处理的 W3C WebDriver 规范 中,有一个 requiredCapabilities 设置,如果服务器无法提供该功能,则会引发异常,但据我所知,尚未由任何驱动程序实现。 - JimEvans
1
Downvoter,即使您不喜欢真相,我也不认为对正确答案进行负评有任何意义。 - Andrei Botalov
1
@usmcs 对不起,我的幽默尝试妨碍了事情的进展,看起来像是“讽刺”。那不是我的意图。我已经重新撰写了答案,以更好地表达驱动程序中的情况。此外,请注意,有关此情况的维基页面已更新为更清晰。其他投票者,请注意,此答案描述了事物的方式。仅因为它不是您想听到的,或者不是您想要的方式,并不意味着答案任何不合法或不正确。 - JimEvans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接