最近網上學習了Selenium1和selenium2,本身作一些總結,方便之後查閱。javascript
部份內容引用:html
http://www.cnblogs.com/hyddd/archive/2009/05/30/1492536.htmljava
http://www.jianshu.com/p/4f0930c0b6a8web
Selenium RC與Testcase的關係瀏覽器
(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對請求進行解析,而後經過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 RC主要由兩部分組成:
(1).Selenium Server:
Selenium Server負責控制瀏覽器行爲,總的來講,Selenium Server主要包括3個部分:Launcher,Http Proxy,Selenium Core。其中Selenium Core是被Selenium Server嵌入到瀏覽器頁面中的。其實Selenium Core就是一堆JS函數的集合,就是經過這些JS函數,咱們才能夠實現用程序對瀏覽器進行操做。
(2).Client Libraries:
寫測試案例時用來控制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來自同一個「源」----代理服務器!
什麼是同源策略
同源策略,它是由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 1.0和selenium 2.0區別
下面用見到的一幅圖來講明Selenium 1.0:
selenium 1.0包括:selenium IDE、selenium Grid、selenium RC三部分。
selenium IDE:firefox的一個插件,能夠錄製和回放腳本。
selenium Grid:用於實現分佈式測試。利用Grid,能夠很方便地同時在多臺機器上和異構環境中並行運行多個測試事例。
selenium RC:selenium 的核心部分,能夠實現利用selenium的代理服務器來實現訪問瀏覽器實現自動化測試。
其中:selenium RC分爲:Client和Selenium Server。
client實現自動化腳本,Selenium Server負責控制瀏覽器行爲。
Selenium Server分爲3部分。
Launcher:啓動瀏覽器
Http Proxy:selenium Server的Http代理
Core:嵌入到瀏覽器的js代碼。
由Launcher啓動瀏覽器,將core嵌入到瀏覽器,並把瀏覽器代理設置爲selenium Server的Http Proxy。
Selenium 1.0使用的是Javascript注入技術與瀏覽器打交道,須要SeleniumRC啓動一個Server,將操做Web元素的API調用轉化爲一段段 Javascript,在Selenium內核啓動瀏覽器以後注入這段Javascript。開發過Web應用的人都知道,Javascript能夠獲取 並調用頁面的任何元素,自如的進行操做。由此才實現了Selenium的目的:自動化Web操做。這種Javascript注入技術的缺點是速度不理想, 並且穩定性大大依賴於Selenium內核對API翻譯成的Javascript質量高低。
Selenium 2.0 則是把selenium 1.0中selenium RC替換爲了WebDriver
selenium RC 在瀏覽器中運行JavaScript應用,使用瀏覽器內置的JavaScript 翻譯器來翻譯和執行selenese命令(selenese 是selenium命令集合)。
WebDriver利用瀏覽器原生的API,封裝成一套更加面向對象的SeleniumWebDriverAPI,直接操做瀏覽器頁面裏的元素,甚 至操做瀏覽器自己(截屏,窗口大小,啓動,關閉,安裝插件,配置證書之類的)。因爲使用的是瀏覽器原生的API,速度大大提升,並且調用的穩定性交給了瀏 覽器廠商自己,顯然是更加科學。然而帶來的一些反作用就是,不一樣的瀏覽器廠商,對Web元素的操做和呈現多少會有一些差別,這就直接致使了 SeleniumWebDriver要分瀏覽器廠商不一樣,而提供不一樣的實現。例如Firefox就有專門的FirefoxDriver,Chrome就有 專門的ChromeDriver等等。
Selenium Webdriver
webdriver自動化俗稱Selenium 2.0測試Web應用程序工具。 webdriver使用不一樣的底層框架,Selenium 遙控器使用JavaScript的Selenium 核嵌入式已經在有必定的侷限性的瀏覽器中。 webdriver直接交互而不與Selenium 遠程控制,依賴於服務器上的任何中介的瀏覽器。它是用在如下方面:
在Selenium開發者社區努力下,不斷提升Selenium webdriver與Selenium的整合。
體系結構
webdriver最好用一個簡單的架構圖,說明,以下圖所示。
Selenium RC |
Selenium WebDriver |
Selenium RC的結構複雜,由於服務器須要啓動在開始試運行前。 |
webdriver架構比Selenium RC簡單,由於它控制着從操做系統層面的瀏覽器。 |
Selenium服務器充當瀏覽器和Selenese的命令之間的中間人 |
webdriver直接相互做用,以在瀏覽器和使用瀏覽器的引擎進行控制。 |
Selenium RC的腳本執行速度較慢,由於它使用了Javascript來與RC互動 |
webdriver的速度更快,由於它直接交互使用的瀏覽器。 |
Selenium RC不能支持無頭,由於它須要一個真正的瀏覽器一塊兒工做。 |
webdriver能夠支持無頭執行 |
它是一個簡單的API |
複雜,API相比,RC有點大 |
減面向對象的API |
純粹的面向對象的API |
不能測試移動應用程序 |
可測試iPhone/Android應用程序 |