Selenium 底層主要依賴于 WebDriver 協議(即 W3C WebDriver 規范,早期也有 JSON Wire Protocol)來實現對瀏覽器的遠程控制,其核心架構可以分為以下幾層:
-
Selenium 客戶端(Client Library)
-
支持多種語言(Java、Python、C#、JavaScript 等)。
-
提供了一套統一的 API,讓測試腳本(如
driver.find_element(...)
、driver.click()
)可以以語言原生的方式調用。 -
客戶端發送的每一個操作都會被封裝成一個 HTTP 請求(JSON 格式),通過 HTTP Connector 發往對應的瀏覽器驅動。
-
-
WebDriver 協議(W3C WebDriver / JSON Wire Protocol)
-
定義了“客戶端 → 驅動”之間所有命令的格式和路由,包括元素定位、頁面導航、腳本執行等。
-
每個命令都是一個 HTTP 請求,路徑類似
/session/{sessionId}/element/{elementId}/click
,請求體里是 JSON 參數。 -
驅動收到 HTTP 請求后,解析出命令類型和參數,然后執行相應的操作。
-
-
瀏覽器驅動(Browser Driver)
-
每種瀏覽器都有專屬的驅動程序:ChromeDriver、GeckoDriver(Firefox)、EdgeDriver、IEDriver 等。
-
驅動本質上是一個 HTTP 服務進程,監聽來自客戶端的 WebDriver 協議請求。
-
驅動內部與瀏覽器進行通信 — 有的通過瀏覽器提供的 DevTools 協議(如 Chrome DevTools Protocol,CDP),有的通過瀏覽器自身的自動化接口(如 Firefox 的 Marionette)。
-
-
瀏覽器自動化接口
-
Chrome:ChromeDriver 調用底層的 CDP,實現頁面元素查找、事件觸發、網絡攔截等。
-
Firefox:GeckoDriver 則通過 Marionette 協議,向瀏覽器內置的自動化模塊發送命令。
-
其他瀏覽器:各自提供類似接口,或通過插件/擴展形式加載自動化腳本。
-
-
執行流程示例
-
客戶端腳本調用
driver.get("https://example.com")
。 -
客戶端庫將該調用轉換成一個 HTTP POST 請求:
POST /session/{sessionId}/url { "url": "https://example.com" }
-
瀏覽器驅動(如 ChromeDriver)接收請求,解析后通過 CDP 命令告訴 Chrome 打開頁面。
-
Chrome 完成導航后,驅動返回一個 HTTP 響應給客戶端,客戶端繼續后續操作。
-
-
并行/分布式執行(Selenium Grid)
-
Selenium Grid 把上述架構擴展為分布式系統:一個 Hub 接收測試請求,分發給不同 Node(各自運行一個或多個瀏覽器驅動實例)。
-
Hub 與 Node 之間依然通過 WebDriver 協議通信,只是多了注冊、心跳、能力匹配等管理邏輯。
-
-
Selenium RC(歷史)
-
Selenium 1.0(RC)階段,使用了一個名為 “Selenium Core” 的 JavaScript 庫注入到瀏覽器頁面里,通過 DOM 操作和 JS 事件模擬實現自動化,受限于同源策略,需要啟動一個跨域代理服務器。
-
后來被 WebDriver 模型取代,因為 WebDriver 不注入腳本,只通過瀏覽器自身的自動化接口,可靠性和性能更好。
-
總結: Selenium 底層核心依賴
-
客戶端庫 → 封裝 API & 生成 HTTP/JSON 請求
-
WebDriver 協議 → 標準化命令格式(W3C WebDriver / JSON Wire Protocol)
-
瀏覽器驅動 → HTTP 服務 → 轉發到瀏覽器自動化接口(CDP、Marionette 等)
-
瀏覽器自動化接口 → 瀏覽器內部執行對應操作,并回傳結果
通過這一“堆棧式”架構,Selenium 才能以語言無關、瀏覽器無關的方式,提供統一且高效的 Web 自動化能力。