內容主要轉自:Selenium工作原理 http://blog.csdn.net/five3/article/details/6790925
簡介:
Selenium 1.0中可以使用多種語言編程,當然前提是支持http庫。在運行selenium1.0程序之前需先啟動selenium server端(selenium remote control),簡稱RC。RC主要包括三個部分:launcher,http proxy,selenium core。其中selenium core是被selenium server嵌入到瀏覽器頁面中的,selenium core內部是一堆javascript函數構成,通過調用這些函數來實現對瀏覽器的各種操作。而selenium 2.0(selenium1 + webdriver)最顯著的特點就是不用再啟動server端了。
Selenium 1.0是第一個基於瀏覽器的開源自動化測試工具,由javascript實現的,所以只要是支持javascript的瀏覽器都可以很好的支持它。但缺點是,每一個瀏覽器對於執行 javascript都有很嚴格的安全限制(不可跨域),以防止用戶被惡意腳本攻擊。這也導致了selenium在某些場景下的測試工作變得很困難,比如IE下面的 upload操作就不允許執行往輸入框中填寫文件的路徑。
主要有以下幾點問題亟待解決: 1.沒有原生的鼠標和鍵盤事件 2.XSS/HTTP同源數據問題 3.popup dialog問題
Webdriver對不同瀏覽器的處理方式和selenium有着明顯的不同,selenium是不管什么瀏覽器都是javascript來處理,而webdriver是選擇瀏覽器最容易接受的語言來處理。比如,在IE 中,C++最合適,在firefox中,javascript最合適等等。通過靈活選擇最合適的語言來處理多瀏覽器,我們可以很好的回避某些瀏覽器對 javascript的安全限制。而且webdriver不僅僅具有這些能力,它還能夠調用操作系統API,尤其是當用戶需要模擬鼠標和鍵盤進行真是的頁面操作的時候,這項能力的作用尤為明顯。 把上面兩款工具放到一起比較,優缺點就比較明顯了。Selenium要求真實的瀏覽器環境,而webdriver可以直接操作HTML unit驅動,大家都知道selenium啟動firefox非常慢,而webdriver可以通過HTML unit在系統內存中迅速的執行,但是這兩者都不方便調試。
Webdriver不支持並行測試,而selenium GRID支持。Webdriver要求針對瀏覽器選擇最合適的語言來編寫腳本,而Selenium可以把多種語言解析成javascript來操控植入瀏覽器的Selenium Core來完成操作,因此把兩者的優點集合起來,即selenium 1.0+webdriver=selenium 2
如何啟動Selenium1的測試腳本?
1. Selenium IDE可以導出多種語言的Selenium腳本,也可自己編寫測試腳本(python):

1 from selenium import selenium 2
3 sel = selenium("localhost", 4444, "*firefox", "https://www.baidu.com/") 4 sel.start() 5 # 百度搜索關鍵字selenium grid
6 sel.open("/") 7 sel.click("id=kw") 8 sel.type("id=kw", "selenium grid") 9 sel.click("id=su")
2. 啟動server,在server包的目錄下的cmd輸入:java -jar selenium-server-standalone-3.0.1.jar
3. 執行測試腳本
一.Selenium RC的組成
Selenium 1.0家譜
Selenium RC主要由兩部分組成:
(1)Selenium Server: (Remote Server)
Selenium Server負責控制瀏覽器行為,總的來說,Selenium Server主要包括3個部分:Launcher,Http Proxy,Selenium Core。其中Selenium Core是被Selenium Server嵌入到瀏覽器頁面中的。其實Selenium Core就是一堆JS函數的集合,就是通過這些JS函數,我們才可以實現用程序對瀏覽器進行操作。
(2)Client Libraries:
所編寫的測試用例(Testcase),用來控制Selenium Server的庫。簡單來說,就是我們寫的測試腳本。
二.Selenium RC與Testcase的關系
如圖:紅色步驟1~8等於以下文字(1) (2) (3) (4) ,綠色則與以下步驟相符
(1) 測試案例(Testcase)通過Client Lib的接口向Selenium Server發送Http請求,要求和Selenium Server建立連接。
為什么要通過發送Http請求控制Selenium Server而不采用其他方式呢?從上文可以看出,Selenium Server是一個獨立的中間服務器(確切地說是代理服務器),它可以架設在其他機器上!所以測試案例通過發送HTTP請求去控制Selenium Server是很正常的。
(2) Selenium Server的Launcher啟動瀏覽器,把Selenium Core加載入瀏覽器頁面當中,並把瀏覽器的代理設置為Selenium Server的Http Proxy。
(3) 測試案例通過Client Lib的接口向Selenium Server發送Http請求,Selenium Server對請求進行解析成JS,然后通過Http Proxy發送JS命令通知Selenium Core執行操作瀏覽器的動作。
(4) Selenium Core接收到指令后,執行操作。
(5) 瀏覽器收到新的頁面請求信息(因為在(4)中,Selenium Core的操作可能引發新的頁面請求),於是發送Http請求,請求新的Web頁面。
由於Selenium Server在啟動瀏覽器時做了手腳,所以Selenium Server會接收到所有由它啟動的瀏覽器發送的請求。
(6) Selenium Server接收到瀏覽器的發送的Http請求后,自己重組Http請求,獲取對應的Web頁面。
(7) Selenium Server的Http Proxy把接收的Web頁面返回給瀏覽器。
繼續前一篇的問題,為什么Selenium RC中的Selenium Server需要以這種代理服務器的形式存在?其實,這和瀏覽器的“同源策略”(The Same Origin Policy)有關。
一.什么是同源策略
同源策略,它是由Netscape提出的一個著名的安全策略,現在所有的可支持JavaScript的瀏覽器都會使用這個策略。
為什么需要同源策略,這里舉個例子:
假設現在沒有同源策略,會發生什么事情呢?大家知道,JavaScript可以做很多東西,比如:讀取/修改網頁中某個值。恩,你現在打開了瀏覽器,在一個tab窗口中打開了銀行網站,在另外一個tab窗口中打開了一個惡意網站,而那個惡意網站掛了一個的專門修改銀行信息的JavaScript,當你訪問這個惡意網站並且執行它JavaScript時,你的銀行頁面就會被這個JavaScript修改,后果會非常嚴重!而同源策略就為了防止這種事情發生。
比如說,瀏覽器的兩個tab頁中分別打開了http://www.baidu.com/index.html和http://www.google.com/index.html,其中,JavaScript1和JavaScript3是屬於百度的腳本,而JavaScript2是屬於谷歌的腳本,當瀏覽器的tab1要運行一個腳本時,便會進行同源檢查,只有和www.baidu.com同源的腳本才能被執行,所謂同源,就是指域名、協議、端口相同。所以,tab1只能執行JavaScript1和JavaScript3腳本,而JavaScript2不能執行,從而防止其他網頁對本網頁的非法篡改。
二.Selenium Server為什么以這種代理服務器的形式存在
上面說了同源策略,那同源策略的Selenium Server有什么關系呢??呵呵,上一篇說過,Selenium Core是一堆JS函數的集合,它是我們操作瀏覽器的基礎。當存在同源策略時,便出現一些問題,看下圖:
因為Selenium Core的JS腳本的“源”是localhost,所以瀏覽器會阻止Selenium Core的JS腳本在測試頁面上執行,這就是為什么在本系列第一篇中說,如果只使用Selenium Core進行測試,需要把Selenium Core安裝到遠程服務器上。
為了解決上面這個問題,Selenium RC中的Selenium Server就以代理服務器的形式出現了,下圖說明它是如何借助代理的身份蒙騙瀏覽器的:>
Selenium Server以代理的形式存在,通過修改WebSite的源信息,從而達到欺騙瀏覽器的目的,就這樣,Selenium RC就輕松繞過了同源策略。在上圖中,瀏覽器會認為WebSite和Selenium Core來自同一個“源”----代理服務器!
三. Remote的理解
Remote可以啟動server = selenium grid。除了可以更方便的進行跨平台、瀏覽器的測試外,最重要的一點是排除我們本地環境的污染,因為我們工作用的PC其實我們安裝了很多的軟件,那么在coding的時候這些軟件對環境的污染就難免不對我們的代碼產生影響,最后就很容易造成代碼在我這運行良好,但是到了別人那就跑不起來了或者結果有差異,這時我們就需要一個干凈的PC環境作為一個驗證機,在自己的PC上編寫完代碼后在驗證機上進行Remote執行驗證。當然把代碼拷貝過去執行也是可以。
個人理解,remote是早期selenium1便存在,后來webdriver是繼承了它也重寫了它。所以早期remote是通過RC執行腳本,不需要驅動,但現在到selenium3,只存在webdriver協議那樣的工作方式。所以涉及曾在selenium1合並過來的grid --》 server--》chromedriver驅動 --》chrome瀏覽器,也是用webdriver工作方式在跑。