2016-06-22 12 views
4

Nach dem Upgrade auf Geckodriver kann ich meine Selenium-Sitzungen nicht wiederverwenden. Hier ist mein Setup:Kann nicht an eine vorhandene Selenium-Sitzung über Geckodriver angeschlossen werden

Ich habe einen start_browser.py Skript, das eine Firefox-Instanz startet und druckt einen Port zu verbinden, wie:

firefox_capabilities = DesiredCapabilities.FIREFOX 
firefox_capabilities['marionette'] = True 
browser = webdriver.Firefox(capabilities=firefox_capabilities) 
print browser.service.port 
wait_forever() 

... und ein anderes Skript, das an den bestehenden versucht, eine Verbindung Instanz über Remote-Treiber:

caps = DesiredCapabilities.FIREFOX 
caps['marionette'] = True 
driver = webdriver.Remote(
     command_executor='http://localhost:{port}'.format(port=port), 
     desired_capabilities=caps) 

Aber es scheint, mit einer Botschaft zu versuchen, eine neue Sitzung zu starten, und andernfalls:

selenium.common.exceptions.WebDriverException: Message: Session is already started 

Gibt es eine Möglichkeit, nur an die bestehende Sitzung anzuhängen, wie in früheren Versionen von Selenium? Oder ist dies ein beabsichtigtes Verhalten von Geckodriver (hoffe nicht)?

Antwort

3

In Ordnung, so dass, wenn jemand mit elegantere Lösung kommt, ist hier ein schneller schmutzig Hack:

class SessionRemote(webdriver.Remote): 
    def start_session(self, desired_capabilities, browser_profile=None): 
     # Skip the NEW_SESSION command issued by the original driver 
     # and set only some required attributes 
     self.w3c = True 

driver = SessionRemote(command_executor=url, desired_capabilities=caps) 
driver.session_id = session_id 

Das Schlimme ist, dass es immer noch nicht funktioniert, beschweren, dass es nicht kenne den moveto Befehl, aber zumindest verbindet er sich mit einem gestarteten Browser.

aktualisieren: Nun, geckodriver scheint eine gewisse Funktionalität im Moment fehlt, wenn Sie also Jungs mit Firefox halten wollen, ist es nur auf eine Version herabzustufen, die alte WebDriver (45 Spiele fein) unterstützt und einen halten Augen auf Tickets wie https://github.com/SeleniumHQ/selenium/issues/2285.

+0

was ist jetzt? – Sajuuk

0

Sie können eine Verbindung zu einer Sitzung herstellen, indem Sie die Sitzungs-ID verwenden.

firefox_capabilities = DesiredCapabilities.FIREFOX 
firefox_capabilities['marionette'] = True 
browser = webdriver.Firefox(capabilities=firefox_capabilities) 
print browser.service.port 
wait_forever() 

# get the ID and URL from the browser 
url = browser.command_executor._url 
session_id = browser.session_id 

# Connect to the existing instance 
driver = webdriver.Remote(command_executor=url,desired_capabilities={}) 
driver.session_id = session_id 
+0

Immer noch kein Glück. Es stürzt ab, bevor ich im 'webdriver.Remote()' -Konstruktor sogar die Sitzung zuweisen kann. In der aktuellen Implementierung scheint die neue Sitzungserstellung fest codiert zu sein: https://github.com/SeleniumHQ/selenium/blob/master/py/selenium/webdriver/remote/webdriver.py#L177. Irgendwelche Gedanken? –

+0

@AlexMorozov Das sollte nicht das Problem sein, wie es für mich funktioniert. Der einzige Unterschied ist, dass ich keine "Marionette" benutze. Hast du es mit den 'Fähigkeiten' für den' webdriver.Remote' Aufruf als '{}' versucht oder hast du neue 'Fähigkeiten' hinzugefügt? – RemcoW

+0

Probierte beide "Fähigkeiten" -Optionen. Eigentlich hat es auch für mich funktioniert, bis eine aktuelle Version von Firefox den alten Treiber ablehnte und eine Marionette zur einzigen Interaktion mit dem Browser machte. Die Frage ist also, wie man sich an eine Sitzung unter Berücksichtigung neuer Bedingungen anpasst. –