Selenium 經歷了兩個版本,Selenium 1.0 和 Selenium 2.0,本文僅介紹Selenium2的原理,在Selenium 2.0 主推的是WebDriver,Selenium2又名Selenium Webdriver。
Selenium2簡介
Selenium是一個用於Web應用程序測試的工具,支持多平台、多瀏覽器、多語言去實現自動化測試,Selenium2將瀏覽器原生的API封裝成WebDriver API,可以直接操作瀏覽器頁面里的元素,甚至操作瀏覽器本身(截屏,窗口大小,啟動,關閉,安裝插件,配置證書之類的),所以就像真正的用戶在操作一樣。
Webdriver的一個簡單的架構圖,如下圖所示:

Selenium2原理
webdriver是按照server–client的經典設計模式設計的:
server端就是remote server,可以是任意的瀏覽器:我們的腳本啟動瀏覽器后,該瀏覽器就是remote server,它的職責就是等待client發送請求並做出相應;
client端簡單說來就是我們的測試代碼:們測試代碼中的一些行為,比如打開瀏覽器,轉跳到特定的url等操作是以http請求的方式發送給被server端(也就是被測瀏覽器)server接受請求,並執行相應操作,並在response中返回執行狀態、返回值等信息;
簡單介紹一下webdriver的工作原理:
- 啟動瀏覽器后,selenium-webdriver會將目標瀏覽器綁定到特定的端口,啟動后的瀏覽器則作為webdriver的remote server。
- 客戶端(也就是測試腳本),借助ComandExecutor發送HTTP請求給sever端(通信協議:The WebDriver Wire Protocol,在HTTP request的body中,會以WebDriver Wire協議規定的JSON格式的字符串來告訴Selenium我們希望瀏覽器接下來做什么事情)。
- Sever端需要依賴原生的瀏覽器組件,轉化Web Service的命令為瀏覽器native的調用來完成操作。
注:
the WebDriver Wire Protocol是Selenium自己設計定義的協議,這套協議非常之強大,幾乎可以操作瀏覽器做任何事情,包括打開、關閉、最大化、最小化、元素定位、元素點擊、上傳文件等。
WebDriver Wire協議是通用的,也就是說不管FirefoxDriver還是ChromeDriver,啟動之后都會在某一個端口啟動基於這套協議的Web Service。
例如FirefoxDriver初始化成功,默認從http://localhost:7055開始IE則是http://localhost:52432,如下圖截圖:

參考資料
http://www.51testing.com/html/95/477695-846433.html
http://blog.csdn.net/ant_ren/article/details/7970793.html
http://www.cnblogs.com/sunada2005/archive/2013/12/22/3486314.html
http://blog.csdn.net/ant_ren/article/details/7968582
http://blog.csdn.net/ant_ren/article/details/7970793
這里作者初步畫了一個圖來表示各種WebDriver的工作原理:

從上圖中我們可以看出,不同瀏覽器的WebDriver子類,都需要依賴特定的瀏覽器原生組件,例如Firefox就 需要一個add-on名字叫webdriver.xpi。而IE的話就需要用到一個dll文件來轉化Web Service的命令為瀏覽器native的調用。另外,圖中還標明了WebDriver Wire協議是一套基於RESTful的web service。如果不明白什么是RESTful的,可以參見作者之前另外一篇介紹REST的blog(http://blog.csdn.net/ant_yan/article/details/7963517)
關於WebDriver Wire協議的細節,比如希望了解這套Web Service能夠做哪些事情,可以閱讀Selenium官方的協議文檔
