Selenium 1.0 的工作原理
Selenium 1.0,又稱Selenium RC ,RC是Remote Control的縮寫。Selenium RC利用的原理:JavaScript代碼可以方便的獲取頁面上的任意元素並執行各種操作。
但是因為“同源政策(Same-origin policy)”(只有來自相同域名、端口和協議的javaScript代碼才能被瀏覽器執行),所以,要想在測試用例運行中的瀏覽器中,注入javascript代碼,從而實現自動化web操作,Selenium RC必須“欺騙”被測站點,讓它誤以為被注入的代碼是同源的。
那如何實現“欺騙”呢?這就是需要引入 Selenium RC Server 的原因了。其中的 Http Proxy 模塊就是來「欺騙」瀏覽器的。除了 Selenium RC Server,Selenium RC 方案的另一部分就是 Client Libraries。他們的具體關系如下圖1所示:

圖1 Selenium RC 的基本模塊
Selenium RC Server,主要包括Selenium Core,Http Proxy 和Launcher 三部分:
-
Selenium Core,是被注入到瀏覽器頁面中的JavaScript 函數集合,用來實現界面元素的識別和操作;
-
Http Proxy,作為代理服務器修改JavaScrip的源,以達到“欺騙”被測站點的目的;
- Launcher,用來在啟動測試瀏覽器時完成,Selenium Core 的注入和瀏覽器代理的設置。
Client Libraries,是測試用例代碼向Selenium RC Server發送 Http 請求的接口,支持多種語言,包括 Java、C# 和 Ruby 等。
Selenium執行流程圖,如圖2:

圖2 Selenium RC 的執行流程
-
測試用例通過基於不同語言的 Client Libraries向 Selenium RC Server 發送Http請求,要求與其建立連接。
-
連接建立后,Selenium RC Server 的Launcher 就會啟動瀏覽器或者重用之前已經打開的瀏覽器,把 Selenium Core(JavaScript 函數的集合)加載到瀏覽器頁面當中,並同時把瀏覽器的代理設置為Http Proxy。
-
測試用例通過 Client Libraries,向 Selenium RC Server 發送 Http請求,Selenium RC Server 解析請求,然后通過 Http Proxy 發送 JavaScript命令通知 Selenium Core 執行瀏覽器上控件的具體操作。
- Selenium Core 接收到指令后,執行操作。
-
如果瀏覽器收到新的頁面請求信息,則會發送 Http 請求來請求新的 Web 頁面。由於 Launcher 在啟動瀏覽器時把 Http Proxy 設置成為了瀏覽器的代理,所以 Selenium RC Server 會接收到所有由它啟動的瀏覽器發送的請求。
-
Selenium RC Server 接收到瀏覽器發送的 Http 請求后,重組 Http 請求以規避“同源策略”,然后獲取對應的 Web 頁面。
-
Http Proxy 把接收的 Web 頁面返回給瀏覽器,瀏覽器對接收的頁面進行渲染。
Selenium 2.0 的工作原理
Selenium 2.0,又稱 Selenium WebDriver,其原理是:使用瀏覽器原生的 WebDriver 實現頁面操作。實現方式完全不同於 Selenium 1.0。Selenium WebDriver 是典型的 Server-Client 模式,Server 端就是 Remote Server。以下是 Selenium 2.0 工作原理:

圖3 Selenium WebDriver 的執行流程
- 當使用 Selenium 2.0 啟動瀏覽器時,后台會同時啟動基於 WebDriver Wire 協議的 Web Service 作為 Selenium 的 Remote Server,並與瀏覽器綁定。之后,Remote Server 就開始監聽 Client 端的操作請求;
- 執行測試時,測試用例會作為 Client 端,將需要執行的頁面操作請求以 Http Request 的方式發送給 Remote Server 。該 Http Request 的 body,是以 WebDriver Wire 協議規定的 JSON 格式來描述需要瀏覽器執行的具體操作;
- Remote Server 接收到請求后,會對請求進行解析,並將解析結果發給 WebDriver,由WebDriver 實際執行瀏覽器的操作;
- WebDriver 可以看做是直接操作瀏覽器的原生組件(Native Component),所以搭建測試環境時,通常都需要先下載瀏覽器對應的 WebDriver。
