2013-04-15 57 views
12

我試圖用webdriver phantomJS,我在處理JavaScript警報時遇到了麻煩。我注意到phantomjs驅動程序desired_capabilities有一個字段'handlesAlerts': False有沒有辦法將這個值設置爲true?我已經嘗試了明顯的方法,但不具有任何影響:Selenium所需功能 - 爲PhantomJS驅動程序設置handlesAlerts

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"}' 

回答

13

該API指定將所需的功能傳遞給構造函數。但是,可能出現這樣的情況,即驅動程序不支持以所需功能請求的功能。在這種情況下,司機不會拋出任何錯誤,這是故意的。功能對象由會話返回,指示會話實際支持的功能。

這就是在這種情況下實際發生的情況。 PhantomJS驅動程序不支持處理警報,如the source code所示,返回的功能對象表示同樣多。在大多數語言綁定中,此返回的功能對象是隻讀的;在返回對象可以讀寫的語言綁定中,修改這些功能對會話沒有實際影響。在待處理的W3C WebDriver specification中,有一個requiredCapabilities設置,如果服務器無法提供該功能,該設置將引發異常,但是據我所知,尚未由任何驅動程序實現。

+1

維基頁面誤導您。 API實際上是爲了傳遞所需的功能而實現的,而遠程端使用它能夠創建的內容創建會話。遠程端返回會話中實際可用的功能,並且該通信是單向的(本地編輯不會影響遠程會話)。在待定的[W3C WebDriver規範](http://www.w3.org/TR/webdriver/)中,有一個'requiredCapabilities'設置,如果服務器無法提供該功能,則會引發異常,據我所知,任何驅動程序都已實施。 – JimEvans

+1

Downvoter,即使你不喜歡真相,我也沒有看到正確答案的一個觀點 –

+1

@usmcs我很抱歉,我對幽默的嘗試阻礙了我,並且看起來像「snark」。這不是意圖。爲了更好地表達駕駛員的情況,我重寫了答案。還請注意,有關這個維基頁面已更新爲更清楚。其他downvoters,這個答案描述事情的方式。僅僅因爲它不是你想要聽到的,或者它不是你想要的那樣,並不能使答案更加有效或者正確。 – JimEvans

相關問題