2013-04-15 3 views
12

Ich versuche PhantomJS mit Webdriver und ich habe Probleme mit der Handhabung von Javascript-Warnungen. Ich bemerke, dass der phantomjs Treiber sined_capabilities ein Feld hat 'handlesAlerts': False Gibt es eine Möglichkeit, diesen Wert auf wahr zu setzen? Ich habe die offensichtliche Art und Weise versucht, aber das hat keine Wirkung:Selen Gewünschte Fähigkeiten - set handlesAlerts für PhantomJS Treiber

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,...} 

Ich kann den Wert im Wörterbuch ändern drv.desired_capabilities['handlesAlerts'] = True, aber wenn ich versuche, auf eine Warnung zu wechseln, bekomme ich eine Fehlermeldung.

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

Antwort

13

Die API gibt an, dass die gewünschten Funktionen an den Konstruktor übergeben werden. Es kann jedoch der Fall eintreten, dass ein Treiber eine in den gewünschten Funktionen angeforderte Funktion nicht unterstützt. In diesem Fall wird vom Treiber kein Fehler ausgelöst, und dies ist beabsichtigt. Von der Sitzung wird ein Capabilities-Objekt zurückgegeben, das die von der Sitzung tatsächlich unterstützten Funktionen angibt.

Das ist tatsächlich in diesem Fall passiert. Der PhantomJS-Treiber unterstützt nicht die Behandlung von Alarmen, wie in the source code zu sehen ist, das zurückgegebene Capabilities-Objekt zeigt dies an. In den meisten Sprachbindungen ist dieses zurückgegebene Funktionsobjekt schreibgeschützt. In Sprachbindungen, in denen das zurückgegebene Objekt schreibgeschützt sein kann, hat die Änderung dieser Funktionen keine Auswirkungen auf die Sitzung. In der ausstehenden W3C WebDriver specification gibt es eine requiredCapabilities Einstellung, die eine Ausnahme auslösen würde, wenn der Server die Fähigkeit nicht zur Verfügung stellen kann, aber das wurde von keinem Treiber noch implementiert, soweit ich weiß.

+1

Die Wiki-Seite ist irreführend. Die API ist tatsächlich so implementiert, dass Sie die gewünschten Funktionen übergeben und das Remote-Ende erstellt die Sitzung mit dem, was sie erstellen kann. Das Remote-End gibt die Funktionen zurück, die tatsächlich in der Sitzung verfügbar sind, und die Kommunikation erfolgt nur in eine Richtung (lokale Änderungen können die Remote-Sitzung nicht beeinträchtigen). In der ausstehenden [W3C WebDriver-Spezifikation] (http://www.w3.org/TR/webdriver/) gibt es eine 'requiredCapabilities'-Einstellung, die eine Ausnahme auslöst, wenn der Server die Fähigkeit nicht bereitstellen kann, aber nicht Soweit ich weiß, wurde es von jedem Fahrer implementiert. – JimEvans

+1

Downvoter, ich sehe keinen Sinn darin, richtige Antworten zu verwerfen, selbst wenn Sie die Wahrheit nicht mögen –

+1

@usmcs Es tut mir leid, dass mein Versuch, Humor in die Quere gekommen ist und wie "Snark" zu sein schien. Das war nicht die Absicht. Ich habe die Antwort umgeschrieben, um die Situation im Fahrer besser auszudrücken. Beachten Sie auch, dass die betreffende Wiki-Seite aktualisiert wurde, um diese Situation zu verdeutlichen. Andere Downvoter beschreibt diese Antwort, wie die Dinge sind. Nur weil es nicht das ist, was du hören willst, oder es nicht so ist, wie du es haben willst, macht die Antwort nicht weniger gültig oder korrekt. – JimEvans

Verwandte Themen