[ChromeDriver] 連接到已經開啟的 Chrome Sessions

如果 Google Chrome/Chromium 已經執行起來,language binding 要如何連接已經開啟的 Chrome session,而非重新開一個?

首先回顧一下 ChromeDriver 的架構:

chromedriver/architecture.png

由於 ChromeDriver 是走 remote debugging protocol 跟 Chrome/Chromium 上的 debugger server 溝通,這個問題可以分兩部份來看:

  1. 已經開啟的 Chrome/Chromium 必須要啟用 remote debugging。
  2. Language binding 要能告訴 ChromeDriver Server 要連往哪個 debugger server,而不開啟一個新的 Chrome session。

第一個問題點出了一點重點 – 並非已經開啟的 Google session 就可以連接,前提是 remote session 要在約定好的 port 啟用,因為預設是停用的。

如果是 Google Chrome/Chromium,啟動時在 command line 加上 –remote-debugging-port=<PORT> 就會在 PORT 啟用 remote debugging。例如:(下面以 Python interpreter + Google Chrome + Mac OS X 做說明)

$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
Caution

用這種方式自行啟動的 Google Chrome/Chromium,並不會自動安裝 Chrome Automation Extension,所以有些操作不支援,例如取得視窗大小。

Note

這裡所講的做法,除了啟用 remote debugging 的方式之外,同樣適用內嵌 CEF (Chromium Embedded Framework) 的桌面應用程式 – CEF-based applications。

這類型的應用程式,通常要經過一些 UI 操作之後 (例如完成登入) 才會帶出內嵌 CEF 的視窗,這時候如果有啟用 remote debugging 的話,language binding 就可以中途跟已經開啟的 Google session 連接上,進而操作 CEF 的網頁內容。

另一方面,language binding 則可以透過 debuggerAddress capability 來指定 Chrome/Chromium 上 debugger server 的位置,一旦指定了這個 capability,ChromeDriver Server 就不會建立新的 Chrome session,而是直接建立連線。

假設 Google Chrome 已經事先執行起來,而且在 9222 port 服務。以 Python 為例:(這裡假設 ChromeDriver Server 已經執行起來)

>>> from selenium.webdriver import Remote, ChromeOptions
>>> options = ChromeOptions()
>>> options.debugger_address='127.0.0.1:9222' # 1
>>> driver = Remote(command_executor='http://127.0.0.1:9515', desired_capabilities=options.to_capabilities())
>>> driver.get('http://www.wikipedia.org')
>>> driver.quit() # 2
1 透過 debugger_address 這個 option 告訴 ChromeDriver Server 連接到現有的 Chrome session,格式為 <HOST>:<IP> (沒有開頭的 http://)。

Python binding 在 2015-02-27 的 v2.45.0 才加入 debugger_address,在這之前可以用 .add_experimental_option()

>>> options.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
2 跟其他兩種狀況不同,關閉 driver 時原有的 Chrome session 還是會保持開啟,之後還可以重新連接上。
廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s