Selenium Desired Capabilities - установить дескрипторыAlerts для драйвера PhantomJS

Я пытаюсь использовать phantomJS с webdriver, и у меня возникают проблемы с обработкой предупреждений javascript. Я заметил, что у драйвера phantomjs wish_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

API указывает, что желаемые возможности передаются в конструктор. Однако может случиться так, что драйвер не поддерживает функцию, запрошенную в желаемых возможностях. В этом случае драйвер не вызывает ошибки, и это преднамеренно. Объект возможностей возвращается сеансом, который указывает возможности, которые фактически поддерживает сеанс.

Это то, что на самом деле происходит в этом случае. Драйвер PhantomJS не поддерживает обработку предупреждений, как показано в исходный код, объект возвращаемых возможностей указывает столько же. В большинстве привязок к языку этот объект возвращаемых возможностей доступен только для чтения; в языковых привязках, где возвращаемый объект может быть прочитан-записан, изменение этих возможностей не оказывает реального эффекта на сеанс. В ожидающей спецификации W3C WebDriver существует параметр requiredCapabilities, который генерирует исключение, если сервер не может предоставить возможность, но это hasn ' t был реализован любым драйвером, насколько мне известно.