Selenium1工做原理

內容主要轉自:Selenium工做原理 http://blog.csdn.net/five3/article/details/6790925javascript

 

簡介:html

  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端了。java

  Selenium 1.0是第一個基於瀏覽器的開源自動化測試工具,由javascript實現的,因此只要是支持javascript的瀏覽器均可以很好的支持它。但缺點是,每個瀏覽器對於執行 javascript都有很嚴格的安全限制(不可跨域),以防止用戶被惡意腳本攻擊。這也致使了selenium在某些場景下的測試工做變得很困難,好比IE下面的 upload操做就不容許執行往輸入框中填寫文件的路徑。python

  主要有如下幾點問題亟待解決: 1.沒有原生的鼠標和鍵盤事件 2.XSS/HTTP同源數據問題 3.popup dialog問題  web

  Webdriver對不一樣瀏覽器的處理方式和selenium有着明顯的不一樣,selenium是無論什麼瀏覽器都是javascript來處理,而webdriver是選擇瀏覽器最容易接受的語言來處理。好比,在IE 中,C++最合適,在firefox中,javascript最合適等等。經過靈活選擇最合適的語言來處理多瀏覽器,咱們能夠很好的迴避某些瀏覽器對 javascript的安全限制。並且webdriver不只僅具備這些能力,它還可以調用操做系統API,尤爲是當用戶須要模擬鼠標和鍵盤進行真是的頁面操做的時候,這項能力的做用尤其明顯。  把上面兩款工具放到一塊兒比較,優缺點就比較明顯了。Selenium要求真實的瀏覽器環境,而webdriver能夠直接操做HTML unit驅動,你們都知道selenium啓動firefox很是慢,而webdriver能夠經過HTML unit在系統內存中迅速的執行,可是這二者都不方便調試。chrome

  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")
View Code

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工做方式在跑。

相關文章
相關標籤/搜索