2016-06-22 3 views
4

geckodriverにアップグレードした後、Seleniumのセッションを再利用できません。私はFirefoxのインスタンスを起動し、ポートを出力start_browser.pyスクリプトは、同じように接続する必要がgeckodriver経由で既存のSeleniumセッションに接続できません

:ここに私のセットアップです

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

...と試みる別のスクリプトは、既存に接続するために、リモートドライバを経由して、インスタンス:

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

しかし、それは新しいセッションを起動しようとすると、メッセージで失敗しているように見える:

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

以前のバージョンのSeleniumのように、既存のセッションにアタッチする機能はありますか?または、これはgeckodriverの意図された振る舞いですか(希望ではありません)?

答えて

3

さてさて、誰もがよりエレガントな解決策を思い付くていない限り、ここで迅速な汚いハックですので:

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 

悪い事は、それはまだ動作しないことがある、そうでないことを訴えてmovetoコマンドを知っていますが、少なくとも起動されたブラウザに接続してください。

更新:まあ、geckodriverは、あなたたちは、Firefoxを使用して維持しようとしている場合は、単に古いwebdriverを(罰金45芝居)をサポートするバージョンにダウングレードし、維持するため、現時点では一部の機能が欠けているようですチケットの目はhttps://github.com/SeleniumHQ/selenium/issues/2285です。

+0

今、それは何ですか? – Sajuuk

0

セッションIDを使用してセッションに再接続できます。

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

まだ運がありません。 'webdriver.Remote()'コンストラクタでセッションを割り当てることもできます。現在の実装では、新しいセッション作成がハードコードされているようです:https://github.com/SeleniumHQ/selenium/blob/master/py/selenium/webdriver/remote/webdriver.py#L177何かご意見は? –

+0

@AlexMorozovそれは私のために働くので、問題ではありません。唯一の違いは、私が 'marionette 'を使っていないことです。 'webdriver.Remote'呼び出しの' capabilities 'を '{}'として試しましたか、新しい 'capabilities'を追加しましたか? – RemcoW

+0

両方の 'capabilities'オプションを試しました。実際には、Firefoxの最新バージョンが古いドライバを廃止し、ブラウザとのやりとりの唯一の方法である 'marionette 'を作るまで、私のために働いています。ですから、新しい条件を考慮してセッションに再接続する方法が問題です。 –

関連する問題