Selenium Manager (Beta)
動機
重點摘要: Selenium Manager 是 Selenium 專案的官方驅動程式管理器,並且隨附於每個 Selenium 版本中。
Selenium 使用每個瀏覽器實作的原生支援來執行自動化流程。因此,Selenium 使用者需要在使用 Selenium API 的腳本和瀏覽器之間放置一個稱為驅動程式(chromedriver、geckodriver、msedgedriver 等)的組件。多年來,管理這些驅動程式對於 Selenium 使用者來說是一個手動過程。透過這種方式,他們必須下載瀏覽器所需的驅動程式(Chrome 的 chromedriver、Firefox 的 geckodriver 等),並將其放置在 PATH
中,或將驅動程式路徑匯出為系統屬性(Java、JavaScript 等)。但這個過程既繁瑣又導致維護性問題。
讓我們考慮一個範例。假設您手動下載了所需的 chromedriver,以便使用 Selenium 驅動您的 Chrome。當您執行此過程時,Chrome 的穩定版本為 113,因此您下載了 chromedriver 113 並將其放入您的 PATH
中。在那一刻,您的 Selenium 腳本正確執行。但問題是 Chrome 是 evergreen(常青)。這個名稱指的是 Chrome 在可用時自動且靜默地升級到下一個穩定版本的能力。此功能對於終端使用者來說非常棒,但對於瀏覽器自動化來說可能很危險。讓我們回到範例來發現它。您的本機 Chrome 最終更新到版本 115。在那一刻,由於手動下載的驅動程式 (113) 和 Chrome 版本 (115) 之間的不相容,您的 Selenium 腳本會被中斷。因此,您的 Selenium 腳本會失敗,並顯示以下錯誤訊息:“session not created: This version of ChromeDriver only supports Chrome version 113”(工作階段未建立:此版本的 ChromeDriver 僅支援 Chrome 版本 113)。
這個問題是所謂的驅動程式管理器存在的主要原因(例如 Java 的 WebDriverManager、Python 的 webdriver-manager、JavaScript 的 webdriver-manager、C# 的 WebDriverManager.Net 和 Ruby 的 webdrivers)。所有這些專案都是一種啟發,也是社群需要將此功能建置到 Selenium 中的明確訊號。因此,Selenium 專案建立了 Selenium Manager,這是 Selenium 的官方驅動程式管理器,自 4.6 版起隨附於每個 Selenium 版本中。
用法
重點摘要: 當驅動程式(chromedriver、geckodriver 等)不可用時,Selenium binding 會使用 Selenium Manager。
透過 Selenium Manager 進行驅動程式管理對於 Selenium binding 來說是選擇性加入的。因此,使用者可以繼續手動管理他們的驅動程式(將驅動程式放在 PATH
中或使用系統屬性),或依賴第三方驅動程式管理器來自動執行此操作。Selenium Manager 僅作為後備機制運作:如果沒有提供驅動程式,Selenium Manager 將會出手救援。
Selenium Manager 是一個以 Rust 實作的 CLI(命令列介面)工具,允許跨平台執行,並為 Windows、Linux 和 macOS 編譯。Selenium Manager 二進位檔隨附於每個 Selenium 版本。透過這種方式,每個 Selenium binding 語言都會調用 Selenium Manager,以執行以下章節中說明的自動化驅動程式和瀏覽器管理。
自動化驅動程式管理
重點摘要: 當驅動程式不可用時,Selenium Manager 會自動探索、下載和快取 Selenium 所需的驅動程式。
Selenium Manager 的主要功能稱為自動化驅動程式管理。讓我們考慮一個範例來理解它。假設我們想要使用 Selenium 驅動 Chrome(請參閱關於如何使用 Selenium 啟動工作階段的文件)。在工作階段開始之前,以及當驅動程式不可用時,Selenium Manager 會為我們管理 chromedriver。我們將此功能稱為管理(而不僅僅是下載),因為此過程更廣泛,並且包含不同的步驟
- 瀏覽器版本探索。Selenium Manager 會探索執行 Selenium 的機器上安裝的瀏覽器版本(例如 Chrome、Firefox、Edge)。此步驟使用 shell 命令(例如
google-chrome --version
)。 - 驅動程式版本探索。透過探索到的瀏覽器版本,可以解析出適當的驅動程式版本。在此步驟中,會使用瀏覽器供應商維護的線上中繼資料/端點(例如 chromedriver、geckodriver 或 msedgedriver)。
- 驅動程式下載。驅動程式 URL 是透過解析出的驅動程式版本取得;透過該 URL,驅動程式成品會被下載、解壓縮並在本機儲存。
- 驅動程式快取。解壓縮後的驅動程式二進位檔儲存在本機快取資料夾 (
~/.cache/selenium
) 中。下次需要相同的驅動程式時,如果快取中已存在該驅動程式,則會從那裡使用。
自動化瀏覽器管理
重點摘要: 當瀏覽器未安裝在本機系統中時,Selenium Manager 會自動探索、下載和快取 Selenium 驅動的瀏覽器(Chrome、Firefox 和 Edge)。
自 Selenium 4.11.0 起,Selenium Manager 也實作了自動化瀏覽器管理。透過此功能,Selenium Manager 允許我們探索、下載和快取不同的瀏覽器發行版本,使其無縫地適用於 Selenium。在內部,Selenium Manager 使用與先前章節中說明的等效管理程序,但這次是針對瀏覽器發行版本。
由 Selenium Manager 自動管理的瀏覽器為
- Chrome。基於 Chrome for Testing (CfT),自 Selenium 4.11.0 起。
- Firefox。基於 公開 Firefox 發行版本,自 Selenium 4.12.0 起。
- Edge。基於 Edge 下載,自 Selenium 4.14.0 起。
讓我們再次考慮使用 Selenium 驅動 Chrome 的典型範例。這次,假設在啟動新工作階段時,本機電腦上未安裝 Chrome。在這種情況下,目前的穩定 CfT 發行版本將由 Selenium Manager 探索、下載和快取(在 ~/.cache/selenium/chrome
中)。
但還有更多。除了穩定的瀏覽器版本外,Selenium Manager 也允許下載較舊的瀏覽器版本(在 CfT 的情況下,從版本 113 開始,這是第一個以 CfT 發布的版本)。若要使用 Selenium 設定瀏覽器版本,我們可以使用稱為 browserVersion 的瀏覽器選項。
讓我們考慮另一個簡單的範例。假設我們使用 Chrome 選項將 browserVersion
設定為 114
。在這種情況下,Selenium Manager 將檢查是否已安裝 Chrome 114。如果已安裝,則將使用它。如果沒有,Selenium Manager 將管理(即探索、下載和快取)CfT 114。在任一種情況下,chromedriver 也會被管理。最後,Selenium 將啟動 Chrome 以進行程式化驅動,與平常一樣。
但還有更多。除了固定的瀏覽器版本(例如 113
、114
、115
等)之外,我們還可以使用以下標籤作為 browserVersion
stable
:目前的 CfT 版本。beta
:下一個穩定版本。dev
:目前正在開發中的版本。canary
:開發人員的每夜建置版本。esr
:Extended Support Release(僅適用於 Firefox)。
當指定這些標籤時,Selenium Manager 會先檢查是否已安裝給定的瀏覽器(beta
、dev
等),如果未偵測到,則會自動管理瀏覽器。
Windows 中的 Edge
Selenium Manager 在 Windows 中自動管理 Edge 的方式與其他瀏覽器不同。Chrome 和 Firefox(以及 macOS 和 Linux 中的 Edge)都由 Selenium Manager 自動下載到本機快取 (~/.cache/selenium
)。然而,在 Windows 中無法對 Edge 執行相同的操作。原因是 Windows 版 Edge 安裝程式是以 Microsoft Installer (MSI) 檔案的形式發布,旨在以管理員權限執行。透過這種方式,當嘗試在 Windows 中使用非管理員工作階段透過 Selenium Manager 安裝 Edge 時,Selenium Manager 將顯示以下警告訊息
edge can only be installed in Windows with administrator permissions
因此,需要管理員權限才能透過 Selenium Manager 在 Windows 中自動安裝 Edge,並且 Edge 最終會安裝在常用的程式檔案資料夾中(例如 C:\Program Files (x86)\Microsoft\Edge
)。
資料收集
Selenium Manager 將向 Plausible 報告匿名化的使用情況統計資料。這讓 Selenium 團隊更了解 Selenium 的使用方式,以便我們能夠更好地專注於我們的開發工作。正在收集的資料為
資料 | 目的 |
---|---|
Selenium 版本 | 這讓 Selenium 開發人員可以安全地棄用和移除功能,並判斷哪些新功能可能對您可用 |
語言繫結 | 用於執行 Selenium 腳本的程式設計語言(Java、JavaScript、Python、.Net、Ruby) |
Selenium Manager 運作所在的作業系統和架構 | Selenium 開發人員可以使用此資訊來協助優先處理錯誤報告,並識別是否存在與作業系統相關的系統性問題 |
瀏覽器和瀏覽器版本 | 協助優先處理錯誤報告 |
粗略的地理位置 | 從您連線的 IP 位址衍生而來。這對於判斷我們需要在何處專注於文件工作非常有用 |
Selenium Manager 每天將這些資料傳送給 Plausible 一次。此期間基於 TTL 值(請參閱組態)。
選擇退出資料收集
資料收集預設為開啟。 若要停用它,請將 SE_AVOID_STATS
環境變數設定為 true
。您也可以在組態檔(請參閱下文)中設定 avoid-stats = true
來停用資料收集。
組態
重點摘要: Selenium Manager 對於大多數使用者來說應該靜默且透明地運作。然而,在某些情況下(例如,指定自訂快取路徑或全域設定 Proxy),可能需要自訂組態。
Selenium Manager 是一個 CLI 工具。因此,在底層,Selenium binding 透過調用 shell 命令來呼叫 Selenium Manager。與任何其他 CLI 工具一樣,可以使用引數來指定 Selenium Manager 中的特定功能。可以透過執行以下命令來檢查 Selenium Manager 支援的不同引數
$ ./selenium-manager --help
除了 CLI 引數之外,Selenium Manager 還允許兩種額外的組態機制
- 組態檔。Selenium Manager 使用名為
se-config.toml
的檔案,該檔案位於 Selenium 快取中(預設位於~/.cache/selenium
),用於自訂組態值。此 TOML 檔案包含用於自訂組態的鍵值集合。 - 環境變數。每個組態鍵在環境變數中都有其等效項,方法是將每個鍵名稱轉換為大寫,將破折號符號 (
-
) 替換為底線 (_
),並新增字首SE_
。
當組態檔存在且未指定對應的 CLI 參數時,Selenium Manager 會採用組態檔。此外,當未指定先前的選項(CLI 引數和組態檔)時,會使用環境變數。換句話說,Selenium Manager 自訂組態的優先順序如下
- CLI 引數。
- 組態檔。
- 環境變數。
請注意,Selenium binding 使用 CLI 引數來指定組態值,這些值又在使用 瀏覽器選項 的每個 binding 中定義。
下表總結了 Selenium Manager 支援的所有引數,以及它們在組態檔和環境變數中的對應鍵。
CLI 引數 | 組態檔 | 環境變數 | 描述 |
---|---|---|---|
--browser BROWSER | browser = "BROWSER" | SE_BROWSER=BROWSER | 瀏覽器名稱:chrome 、firefox 、edge 、iexplorer 、safari 、safaritp 或 webview2 |
--driver <DRIVER> | driver = "DRIVER" | SE_DRIVER=DRIVER | 驅動程式名稱:chromedriver 、geckodriver 、msedgedriver 、IEDriverServer 或 safaridriver |
--browser-version <BROWSER_VERSION> | browser-version = "BROWSER_VERSION" | SE_BROWSER_VERSION=BROWSER_VERSION | 主要瀏覽器版本(例如 105 、106 等。也接受:beta 、dev 、canary -或 nightly - 和 esr -在 Firefox 中-) |
--driver-version <DRIVER_VERSION> | driver-version = "DRIVER_VERSION" | SE_DRIVER_VERSION=DRIVER_VERSION | 驅動程式版本(例如 106.0.5249.61, 0.31.0 等) |
--browser-path <BROWSER_PATH> | browser-path = "BROWSER_PATH" | SE_BROWSER_PATH=BROWSER_PATH | 用於瀏覽器版本偵測的瀏覽器路徑(絕對路徑)(例如 /usr/bin/google-chrome 、/Applications/Google Chrome.app/Contents/MacOS/Google Chrome 、C:\Program Files\Google\Chrome\Application\chrome.exe ) |
--driver-mirror-url <DRIVER_MIRROR_URL> | driver-mirror-url = "DRIVER_MIRROR_URL" | SE_DRIVER_MIRROR_URL=DRIVER_MIRROR_URL | 驅動程式儲存庫的鏡像 URL |
--browser-mirror-url <BROWSER_MIRROR_URL> | browser-mirror-url = "BROWSER_MIRROR_URL" | SE_BROWSER_MIRROR_URL=BROWSER_MIRROR_URL | 瀏覽器儲存庫的鏡像 URL |
--output <OUTPUT> | output = "OUTPUT" | SE_OUTPUT=OUTPUT | 輸出類型:LOGGER (使用 INFO 、WARN 等)、JSON (自訂 JSON 標記法)、SHELL (類 Unix)或 MIXED (INFO 、WARN 、DEBUG 等到 stderr,以及最小的 JSON 到 stdout)。預設值:LOGGER |
--os <OS> | os = "OS" | SE_OS=OS | 驅動程式和瀏覽器的作業系統(即 windows 、linux 或 macos ) |
--arch <ARCH> | arch = "ARCH" | SE_ARCH=ARCH | 驅動程式和瀏覽器的系統架構(即 x32 、x64 或 arm64 ) |
--proxy <PROXY> | proxy = "PROXY" | SE_PROXY=PROXY | 網路連線的 HTTP Proxy(例如 myproxy:port 、myuser:mypass@myproxy:port ) |
--timeout <TIMEOUT> | timeout = TIMEOUT | SE_TIMEOUT=TIMEOUT | 網路請求的逾時時間(以秒為單位)。預設值:300 |
--offline | offline = true | SE_OFFLINE=true | 離線模式(即停用網路請求和下載) |
--force-browser-download | force-browser-download = true | SE_FORCE_BROWSER_DOWNLOAD=true | 強制下載瀏覽器,例如,當系統中已安裝瀏覽器,但您希望 Selenium Manager 下載並使用它時 |
--avoid-browser-download | avoid-browser-download = true | SE_AVOID_BROWSER_DOWNLOAD=true | 避免下載瀏覽器,例如,當瀏覽器應該由 Selenium Manager 下載,但您希望避免下載時 |
--debug | debug = true | SE_DEBUG=true | 顯示 DEBUG 訊息 |
--trace | trace = true | SE_TRACE=true | 顯示 TRACE 訊息 |
--cache-path <CACHE_PATH> | cache-path="CACHE_PATH" | SE_CACHE_PATH=CACHE_PATH | 用於儲存下載的資產(驅動程式和瀏覽器)、本機中繼資料和組態檔的本機資料夾。請參閱下一節以取得詳細資訊。預設值:~/.cache/selenium 。對於 TOML 組態檔中的 Windows 路徑,需要使用雙反斜線(例如 C:\\custom\\cache )。 |
--ttl <TTL> | ttl = TTL | SE_TTL=TTL | 存活時間(以秒為單位)。請參閱下一節以取得詳細資訊。預設值:3600 (1 小時) |
--language-binding <LANGUAGE> | language-binding = "LANGUAGE" | SE_LANGUAGE_BINDING=LANGUAGE | 調用 Selenium Manager 的語言(例如 Java、JavaScript、Python、DotNet、Ruby) |
--avoid-stats | avoid-stats = true | SE_AVOID_STATS=true | 避免將使用情況統計資料傳送至 plausible.io。預設值:false |
除了上表中指定的組態鍵之外,還有一些特殊情況,即
- 瀏覽器版本。除了
browser-version
之外,我們還可以使用特定的組態鍵來指定每個支援瀏覽器的自訂版本。透過這種方式,支援鍵chrome-version
、firefox-version
、edge-version
等。這同樣適用於環境變數(即SE_CHROME_VERSION
、SE_FIREFOX_VERSION
、SE_EDGE_VERSION
等)。 - 驅動程式版本。依照相同的模式,我們可以使用
chromedriver-version
、geckodriver-version
、msedgedriver-version
等(在組態檔中),以及SE_CHROMEDRIVER_VERSION
、SE_GECKODRIVER_VERSION
、SE_MSEDGEDRIVER_VERSION
等(作為環境變數)。 - 瀏覽器路徑。依照相同的模式,我們可以使用
chrome-path
、firefox-path
、edge-path
等(在組態檔中),以及SE_CHROME_PATH
、SE_FIREFOX_PATH
、SE_EDGE_PATH
等(作為環境變數)。Selenium binding 也允許使用選項指定瀏覽器路徑的自訂位置,即:Chrome)、Edge 或 Firefox。 - 驅動程式鏡像。依照相同的模式,我們可以使用
chromedriver-mirror-url
、geckodriver-mirror-url
、msedgedriver-mirror-url
等(在組態檔中),以及SE_CHROMEDRIVER_MIRROR_URL
、SE_GECKODRIVER_MIRROR_URL
、SE_MSEDGEDRIVER_MIRROR_URL
等(作為環境變數)。 - 瀏覽器鏡像。依照相同的模式,我們可以使用
chrome-mirror-url
、firefox-mirror-url
、edge-mirror-url
等(在組態檔中),以及SE_CHROME_MIRROR_URL
、SE_FIREFOX_MIRROR_URL
、SE_EDGE_MIRROR_URL
等(作為環境變數)。
se-config.toml 範例
browser = "chrome" # --browser BROWSER
driver = "chromedriver" # --driver DRIVER
browser-version = "106" # --browser-version BROWSER_VERSION
driver-version = "106.0.5249.61" # --driver-version DRIVER_VERSION
browser-path = "/usr/bin/google-chrome" # --browser-path BROWSER_PATH
driver-mirror-url = "https://custom-driver-mirror.com" # --driver-mirror-url DRIVER_MIRROR_URL
browser-mirror-url = "https://custom-browser-mirror.com" # --browser-mirror-url BROWSER_MIRROR_URL
output = "LOGGER" # --output OUTPUT
os = "linux" # --os OS
arch = "x64" # --arch ARCH
proxy = "myproxy:8080" # --proxy PROXY
timeout = 300 # --timeout TIMEOUT
offline = true # --offline
force-browser-download = true # --force-browser-download
avoid-browser-download = false # --avoid-browser-download
debug = true # --debug
trace = true # --trace
cache-path = "/custom/cache/path" # --cache-path CACHE_PATH
ttl = 3600 # --ttl TTL
language-binding = "Python" # --language-binding LANGUAGE
avoid-stats = true # --avoid-stats
快取
重點摘要: 由 Selenium Manager 管理的驅動程式和瀏覽器儲存在本機資料夾 (~/.cache/selenium
) 中。
Selenium Manager 中的快取是一個本機資料夾(預設為 ~/.cache/selenium
),其中儲存下載的資產(驅動程式和瀏覽器)。為了效能考量,當驅動程式或瀏覽器已在快取中時(即,存在快取提示),Selenium Manager 會從那裡使用它。
除了下載的驅動程式和瀏覽器之外,還有兩個額外的檔案位於快取的根目錄中
- 組態檔 (
se-config.toml
)。此檔案是選用的,如上一節所述,它允許儲存 Selenium Manager 的自訂組態值。此檔案由終端使用者維護,並由 Selenium Manager 讀取。 - 中繼資料檔 (
se-metadata.json
)。此檔案包含 Selenium Manager 透過發出網路請求(例如,使用 CfT JSON 端點)探索到的版本,以及它們有效的存活時間 (TTL)。Selenium Manager 會自動維護此檔案。
Selenium Manager 中的 TTL 靈感來自 DNS 的 TTL,這是一種眾所周知的機制,指的是某些值在自動重新整理之前快取的時間長度。在 Selenium Manager 的情況下,這些值是透過發出網路請求以探索驅動程式和瀏覽器版本而找到的版本。預設情況下,TTL 為 3600
秒(即 1 小時),並且可以使用組態值進行調整,或透過將此組態值設定為 0
來停用。
TTL 機制是一種提高 Selenium 整體效能的方法。它基於以下事實:探索到的驅動程式和瀏覽器版本(例如,Chrome 115 的正確 chromedriver 版本是 115.0.5790.170)在短期內可能保持不變。因此,探索到的版本會寫入中繼資料檔並從那裡讀取,而不是發出相同的連續網路請求。透過這種方式,在驅動程式版本探索期間(先前介紹的自動化驅動程式管理流程的步驟 2),Selenium Manager 首先讀取檔案中繼資料。當找到新的解析結果(即在 TTL 期間有效的驅動程式/瀏覽器版本)時,將使用該版本(節省發出新網路請求的時間)。如果找不到或 TTL 已過期,則會發出網路請求,並且結果會儲存在中繼資料檔中。
讓我們考慮一個範例。Selenium binding 要求 Selenium Manager 解析 chromedriver。Selenium Manager 偵測到已安裝 Chrome 115,因此它會向 CfT 端點發出網路請求,以探索正確的 chromedriver 版本(當時為 115.0.5790.170)。此版本儲存在中繼資料檔中,並在接下來的一小時內(TTL)被視為有效。如果在該時間內要求 Selenium Manager 解析 chromedriver(這很可能在執行測試套件時發生),則會透過讀取中繼資料檔來探索 chromedriver 版本,而不是向 CfT 端點發出新的請求。一小時後,快取中儲存的 chromedriver 版本將被視為過時,並且 Selenium Manager 將透過向對應的端點發出新的網路請求來重新整理它。
Selenium Manager 包含兩個額外的引數來處理快取,即
--clear-cache
:移除快取資料夾(相當於環境變數SE_CLEAR_CACHE=true
)。--clear-metadata
:移除中繼資料檔(相當於環境變數SE_CLEAR_METADATA=true
)。
版本控制
Selenium Manager 遵循與 Selenium 相同的版本控制架構。然而,我們對 Selenium Manager 發行版本使用主要版本 0,因為它仍處於 Beta 階段。例如,隨附於 Selenium 4.12.0 的 Selenium Manager 二進位檔對應於版本 0.4.12。
取得 Selenium Manager
對於大多數使用者來說,由於 Selenium binding 在內部使用 Selenium Manager,因此不需要直接與 Selenium Manager 互動。然而,如果您想玩玩 Selenium Manager,或將其用於涉及驅動程式或瀏覽器管理的用例,您可以透過不同的方式取得 Selenium Manager 二進位檔
- 從 Selenium 儲存庫取得。Selenium Manager 原始碼儲存在主要 Selenium 儲存庫的 rust 資料夾下。此外,您可以在 Selenium Manager Artifacts 儲存庫中找到 Windows、Linux 和 macOS 的編譯版本。穩定的 Selenium Manager 二進位檔(即在最新的穩定 Selenium 版本中發布的二進位檔)連結在此檔案中。
- 從建置工作流程。GitHub Actions 工作流程編譯 Selenium Manager。此工作流程會為 Windows、Linux 和 macOS 建立二進制檔案。您可以從這些工作流程執行下載這些二進制檔案。
- 從快取。從 Selenium Java 綁定版本 4.15.0 開始,Selenium Manager 二進制檔案會被解壓縮並複製到快取資料夾。例如,Selenium 4.15.0 隨附的 Selenium Manager 二進制檔案儲存在
~/.cache/selenium/manager/0.4.15
資料夾中。
範例
讓我們考慮一個典型的範例:我們想要自動管理 chromedriver。為此,我們依以下方式調用 Selenium Manager(請注意,--debug
標誌是選填的,但它有助於我們了解 Selenium Manager 正在做什麼)
$ ./selenium-manager --browser chrome --debug
DEBUG chromedriver not found in PATH
DEBUG chrome detected at C:\Program Files\Google\Chrome\Application\chrome.exe
DEBUG Running command: wmic datafile where name='C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' get Version /value
DEBUG Output: "\r\r\n\r\r\nVersion=116.0.5845.111\r\r\n\r\r\n\r\r\n\r"
DEBUG Detected browser: chrome 116.0.5845.111
DEBUG Discovering versions from https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
DEBUG Required driver: chromedriver 116.0.5845.96
DEBUG Downloading chromedriver 116.0.5845.96 from https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.96/win64/chromedriver-win64.zip
INFO Driver path: C:\Users\boni\.cache\selenium\chromedriver\win64\116.0.5845.96\chromedriver.exe
INFO Browser path: C:\Program Files\Google\Chrome\Application\chrome.exe
在這種情況下,Selenium Manager 會偵測到本機 Chrome (在 Windows 中)。然後,使用其版本和 CfT 端點,將適當的 chromedriver 版本 (在此範例中為 115) 下載到本機快取。最後,Selenium Manager 提供兩個結果:i) 驅動程式路徑 (已下載) 和 ii) 瀏覽器路徑 (本機)。
讓我們考慮另一個範例。現在我們想要使用 Chrome beta。因此,我們依以下方式調用 Selenium Manager,指定該版本標籤 (請注意,CfT beta 會被發現、下載並儲存在本機快取中)
$ ./selenium-manager --browser chrome --browser-version beta --debug
DEBUG chromedriver not found in PATH
DEBUG chrome not found in PATH
DEBUG chrome beta not found in the system
DEBUG Discovering versions from https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json
DEBUG Required browser: chrome 117.0.5938.22
DEBUG Downloading chrome 117.0.5938.22 from https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/117.0.5938.22/win64/chrome-win64.zip
DEBUG chrome 117.0.5938.22 has been downloaded at C:\Users\boni\.cache\selenium\chrome\win64\117.0.5938.22\chrome.exe
DEBUG Discovering versions from https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
DEBUG Required driver: chromedriver 117.0.5938.22
DEBUG Downloading chromedriver 117.0.5938.22 from https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/117.0.5938.22/win64/chromedriver-win64.zip
INFO Driver path: C:\Users\boni\.cache\selenium\chromedriver\win64\117.0.5938.22\chromedriver.exe
INFO Browser path: C:\Users\boni\.cache\selenium\chrome\win64\117.0.5938.22\chrome.exe
在您的腳本中實作 Selenium Manager
先前
def setup_without_selenium_manager():
chrome_service = Service(executable_path='path/to/chrome.exe')
driver = webdriver.Chrome(chrome_service)
return driver
Selenium Manager
def setup_with_selenium_manager():
driver = webdriver.Chrome()
return driver
Selenium Grid
設定 Selenium Grid 時,Selenium Manager 允許您自動設定驅動程式。為此,您需要在啟動 Selenium Grid 的命令中包含 --selenium-manager true
參數。如需更多詳細資訊,請造訪 Selenium Grid 入門頁面。
此外,Selenium Manager 也允許自動管理 Selenium Grid 版本。為此,--grid
參數的使用方式如下
$ ./selenium-manager --grid
在此命令之後,Selenium Manager 會發現最新版本的 Selenium Grid,並將 selenium-server.jar
儲存在本機快取中。
或者,--grid
參數允許指定 Selenium Grid 版本 (--grid <GRID_VERSION>
)。
已知限制
連線問題
Selenium Manager 會請求遠端端點 (例如 Chrome for Testing (CfT) 等) 以從線上儲存庫發現和下載驅動程式和瀏覽器。當此操作在具有 Proxy 或防火牆的企業環境中完成時,可能會導致連線問題,例如以下情況
error sending request for url (https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json)
error trying to connect: dns error: failed to lookup address information
error trying to connect: An existing connection was forcibly closed by the remote host. (os error 10054)
當發生這種情況時,請考慮以下解決方案
- 使用 Selenium 的 Proxy 功能 (請參閱文件)。或者,使用環境變數
SE_PROXY
設定 Proxy URL,或使用設定檔 (請參閱設定)。 - 檢查您的網路設定,以啟用 Selenium Manager 所需的遠端請求和下載。
自訂套件管理器
如果您使用的是 Linux 套件管理器 (Anaconda、snap 等),需要為您的瀏覽器使用特定的驅動程式,您需要指定驅動程式位置、瀏覽器位置,或兩者都指定,具體取決於需求。
替代架構
Selenium 支援 Google Chrome for Testing 管理的所有五種架構,以及 Microsoft Edge 提供的所有六種驅動程式。
每個 Selenium 綁定版本都附帶三個獨立的 Selenium Manager 二進制檔案 — 分別適用於 Linux、Windows 和 Mac。
- Mac 版本同時支援 x64 和 aarch64 (Intel 和 Apple)。
- Windows 版本應適用於 x86 和 x64 (32 位元和 64 位元作業系統)。
- Linux 版本僅經驗證適用於 x64。
不支援更多架構的原因
- Chrome for Testing 和 Microsoft Edge 都不支援額外的架構,因此 Selenium Manager 需要管理一些非官方的東西才能使其運作。
- 我們目前從現有的 GitHub Actions 執行器建置二進制檔案,這些執行器不支援這些架構
- 任何額外的架構都將與所有 Selenium 版本一起發布,從而增加整體建置大小
如果您在 arm64/aarch64、32 位元架構或 Raspberry Pi 上執行 Linux,Selenium Manager 將不適用於您。人們最大的問題是他們過去常常取得客製化建置的驅動程式並將它們放在 PATH 上,讓它們可以運作。現在 Selenium Manager 負責在 PATH 上尋找驅動程式,這種方法不再適用,使用者需要使用 Service
類別並直接設定位置。讓 Selenium Manager 在 PATH 上尋找驅動程式而不是在每個綁定中管理該邏輯有很多優點,因此這目前是我們感到舒適的權衡。
但是,從 Selenium 4.13.0 開始,Selenium 綁定允許使用名為 SE_MANAGER_PATH
的環境變數來定位 Selenium Manager 二進制檔案。如果設定了此變數,綁定將使用其值作為本機檔案系統中的 Selenium Manager 路徑。此功能將允許使用者提供 Selenium Manager 的自訂編譯版本,例如,如果預設的二進制檔案 (為 Windows、Linux 和 macOS 編譯) 與給定的系統 (例如 Linux 中的 ARM64) 不相容。
瀏覽器依賴性
在 Linux 中自動管理瀏覽器時,Selenium Manager 依賴於瀏覽器供應商 (即 Chrome、Firefox 和 Edge) 發布的版本。這些版本在大多數情況下是可攜式的。儘管如此,可能存在需要現有函式庫的情況。在 Linux 中,嘗試執行 Firefox 時可能會遇到此問題,例如以下情況
libdbus-glib-1.so.2: cannot open shared object file: No such file or directory
Couldn't load XPCOM.
如果發生這種情況,解決方案是安裝該函式庫,例如,如下所示
sudo apt-get install libdbus-glib-1-2
嘗試在 Linux 中執行 Chrome for Testing 時,可能會發生類似的問題
error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory
在這種情況下,要安裝的函式庫如下
sudo apt-get install libatk-bridge2.0-0
使用環境變數設定驅動程式路徑
可以使用環境變數來指定驅動程式路徑,而無需使用 Selenium Manager。支援以下環境變數
SE_CHROMEDRIVER
SE_EDGEDRIVER
SE_GECKODRIVER
SE_IEDRIVER
SE_SAFARIDRIVER
例如,要指定 chromedriver 的路徑,您可以將 SE_CHROMEDRIVER
環境變數設定為 chromedriver 可執行檔的路徑。以下綁定允許您使用環境變數指定驅動程式路徑
- Ruby
- Java
- Python
此功能在 Selenium Ruby 綁定中從 4.25.0 版本開始提供,在 Python 綁定中從 4.26.0 版本開始提供。
建置自訂 Selenium Manager
為了建置您自己的自訂 Selenium Manager,使其可以在我們目前不支援的架構中運作,您可以利用以下步驟
- 安裝 Rust 開發環境
- 將 Selenium 複製到您的本機電腦
git clone https://github.com/SeleniumHQ/selenium.git --depth 1
- 導航到您的複製目錄
cd selenium/rust
- 建置 selenium
cargo build --release
- 為驅動程式路徑設定以下環境變數
SE_MANAGER_PATH=~/selenium/rust/target/release/selenium-manager
- 將您想要的驅動程式放在系統 PATH 上的位置
- Selenium 現在將使用建置的 Selenium Manager 來定位 PATH 上手動下載的驅動程式
Roadmap
您可以在Selenium Manager 專案儀表板中追蹤正在進行的工作。此外,您可以在其變更日誌檔案中查看每個 Selenium Manager 版本附帶的新功能。