Selenium是ThrougthWorks公司一個強大的開源WEB功能測試工具系列,本系統包括多款軟件
Selenium語言簡單,用(Command,target,value)三種元素組成一個行爲,而且有協助錄製腳本工具,但Selenese有一些嚴格的限制:
它沒有條件(沒有"if"表達式),而且它沒有循環(沒有「for「表達式),使編寫複雜的測試變得困難甚至不可能。 javascript
通過比較:使用Selenium IDE,XPath Checker進行測試案例的編寫,而後轉換爲JAVA語言的測試案例,再調用Selenium RC運行測試案例。 html
Selenium工具及比較
Selenium分爲:
Selenium Core: 支持DHTML的測試案例(效果相似數據驅動測試),它是Selenium IDE和Selenium RC的引擎
Selenium IDE: Firefox的一個插件,支持腳本錄製、編輯、回放
Selenium RC: Selenium Remote Control Selenium alone server
Selenium Grid: 容許同時併發地、在不一樣的環境上運行多個測試任務,極大的地加快WEB應用的功能測試
Selenium Core HTA: Selenium Core的額外模式,只要Selenium Core配置稍加修改,即爲HTA模式,能夠在IE最高安全等級(特權)下工做
,即它僅能在IE下工做,限制很大。 java
Selenium WEBDRIVER python
瀏覽器支持:
Selenium IDE僅能夠在firefox中工做,
Selenium RC(Remote Control)支持不少瀏覽器,如最經常使用的firefox、ie、safari等瀏覽器
Selenium Core支持的瀏覽器是最廣的,這點和它的實現有關,做爲IDE和RC的引擎,Selenium Core幾乎能夠在任何瀏覽器中工做 web
須要遠程安裝
只有Selenium Core須要,Selenium Core出於同源策略的緣由,須要在被測試的服務端安裝,這也是它一個很大的限制。
而Selenium IDE和Selenium Core HTA不會被同源策略所限制,由於他們對瀏覽器擴展了。
Selenium RC提供一個代碼服務器來保證Selenium JS文件看似來自相同的遠程服務器,從而符合同源策略;代理服務器欺騙瀏覽器,讓它認爲
這裏的確有像http://www.google.com/selenium/這樣的目錄 正則表達式
支持HTTPS/SSL
都支持。 chrome
支持跨域
除Selenium Core外都支持 c#
須要JAVA:
準確的說是須要JRE
只有Selenium RC須要,上面所說的「代理服務器」是一個JAVA程序,須要跑測試案例前啓動。 跨域
將測試結果保存到磁盤:
只有Selenium Core不能將任何測試結果寫到磁盤(由於它是用javascript寫的,它不容許向磁盤寫數據)。
其解決方案是固然你能夠將測試結果發送到另一臺服務器保存。是Selenium Core的一大限制 瀏覽器
多語言支持:
Selenium IDE,Selenium Core,Selenium CoreHTA只支持Selenium語言
Selenium RC支持不少語言,如c#,java ,ruby,python
在firefox安裝插件
在firefox中安裝插件Selenium IDE
1:打開firefox瀏覽器
2:在地址欄輸入http://docs.seleniumhq.org/download/
3:在頁面中找到Selenium IDE,而後點擊Download latest released version 1.10.0 的連接,便可以自動安裝此插件
Selenium IDE僅僅支持Selenium語言,但能夠經過此插件錄製、編輯和回放Selenium測試,並能夠轉換了其餘語言的測試用例,如JAVA,C#
但僅能夠在firefox中工做
在firefox安裝XPath Checker插件
1:打開firefox瀏覽器
2:點擊工具-附加組件,打開附加組件管理器
3:在搜索框中輸入XPath Checker,
4: 找到XPath Checker,點擊安裝(當前版本是0.4.4)
做用:
給出頁面元素的XPath
根據你寫的XPath,查看是否能夠找到對應的element
可選擇的安裝其餘插件
如Firebug1.11.1,Selenium IDE Button1.2.0
Selenium IDE Button1.2.0做用:
啓動Selenium IDE的快捷按鈕
下載Selenium工具
下載Selenium Server
The Selenium Server is needed in order to run either Selenium RC style scripts or Remote Selenium Webdriver ones.
The 2.x server is a drop-in replacement for the old Selenium RC server
and is designed to be backwards compatible with your existing infrastructure.
下載後放到指定目錄,
如D:\Program
d:
cd Program
java -jar selenium-server-standalone-2.30.0.jar
便可啓動selenium服務端
默認端口是4444
下載Selenium Client & WebDriver Language Bindings
若是使用maven,不用單獨下載,可使用maven下載jar及其依賴的jar,配置以下:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.30.0</version>
</dependency>
若是單獨下載,能夠經過
http://docs.seleniumhq.org/download/
http://code.google.com/p/selenium/downloads/list
兩個連接進行下載
當前最新的版本是2.30.0
Selenium RC的工做原理:
Selenium RC主要由兩部分組成:
Selenium Server:
負責控制瀏覽器行爲,總的來講,Selenium Server主要包括3個部分,Launcher,Http Proxy,Selenium Core
其中Selenium Core是被Selenium Server嵌入到瀏覽器頁面中的,其實就是一堆S函數的集合,就是經過這些JS
函數,才能夠實現用程序對瀏覽器進行操做。
Client Libraries:
寫測試案例時用來控制Selenium Server的庫。
詳見:
http://docs.seleniumhq.org/docs/05_selenium_rc.jsp#how-selenium-rc-works
Selenium RC與Testcase的關係
1:測試案例(Testcase)經過Client Lib的接口向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 Server須要以這種代理服務器的形式存在
這和瀏覽器的同源策略(the same origin policy)有關
同源策略是由netscape提出的一個著名的安全策略,如今全部的可支持javascript的瀏覽器都使用使用這個策略。
所謂同源,就是指域名、協議、端口相同,同源策略就是瀏覽器僅會執行同源的javascript腳本
Selenium Core是一堆JS腳本,須要加載到瀏覽器中執行,Selenium Core的JS腳本的「源」是localhost,因此瀏覽器會阻止Selenium Core的JS腳本
在測試頁面上執行。因此用Selenium Core進行測試,須要把Selenium Core安裝到遠程服務器上。
爲了解決這個問題,Selenium RC中的Selenium Server就以代理服務器的形式出現了。
Selenium Server以代理的形式存在,經過修改WebSite的源信息,從而達到欺騙瀏覽器的目的,就這樣,Selenium RC就輕鬆繞過了同源策略。
Selenium Server的交互模式
在啓動Selenium Server的時候,加入-interactive,便可開啓交互模式,
是Selenium Server提供了一種快速的測試方法,能夠對Selenium輸入命令從而啓動測試
java -jar selenium-server-standalone-2.30.0.jar -interactive
在命令行輸入: *iehta or *chrome or *iexplore or *firefox
1:控制Selenium Server啓動瀏覽器,以及建立Session,輸入:
cmd=getNewBrowserSession&1=*iexplore&2=http://www.google.com.hk
cmd=getNewBrowserSession&1=*firefox&2=http://www.google.com.hk
2:控制瀏覽器訪問www.google.com.hk/webhp,輸入(sessionId是第一步產生的):
cmd=open&1=http://www.google.com.hk/webhp&SessionId=6600231a2c504abd8293d4c47d32e857
若是再輸入
cmd=open&1=http://www.baidu.com&SessionId=6600231a2c504abd8293d4c47d32e857,則會給出警告,見總結中的第4點
此時,瀏覽器能夠成功訪問http://www.google.com.hk/webhp
總結一下:
1:在Selenium Server中輸入命令的格式爲:
cmd=Command&1=Target&2=value&SessionId=...
這和Selenium IDE的案例語句很像
2:在輸入命令後,Selenium Server會發一條Http請求給本身,請求的URL格式也是固定的:
http://localhost:4444/selenium-server/driver?cmd=Command&1=Target&2=value&SessionId=...
咱們徹底能夠用瀏覽器發送控制Selenium Server請求進行測試
3:另外,SessionId是很重要的一個參數,當一個Selenium Server同時運行多個測試案例時,Selenium Server就是經過
sessionId判斷到底該操做哪一個瀏覽器窗口,而在下面的java代碼中:
selenium = new DefaultSelenium("127.0.0.1", 4444, "*iexplore",
"http://www.google.com.hk");
selenium.start();
selenium.open("/webhp");
selenium就至關於上文中的sessionId
4:在Selenium Server啓動一個Session時,必須指定一個「源」,在上面的代碼中http://www.google.com.hk就是「源」,
在後來的操做中,若是找開的倒是http://www.baidu.com,因爲兩者非同源,因此接下來的操做就可能出現各類問題,
因此Selenium Server會給出如下警告
11:55:09.321 WARN - you appear to be changing domains from http://www.google.com.hk to http://www.baidu.com
this may lead to a 'Permission denied' from the browser (unless it is running as*iehta or *chrome,
or alternatively the selenium server is running in proxy injection mode)
Selenium Server提示說:若是測試案例是運行在*iehta或者*chrome上,或者改變Selenium Server的運行模式爲
injection mode便可避免問題出現。
Selenium的運行模式
Heightened Privileges Browsers
Proxy Injection
Selenium Server啓動的默認模式爲:Heightened Privileges Browsers.若是要啓動Proxy Injection模式,能夠加
參數:「-proxyInjectionMode」。
和Proxy Injection模式不同,在Heightened Privileges Browsers模式下,Browser對Web的請求沒有通過Http Proxy
,因此返回的Web頁面就有可能和Selenium Core有不一樣源了(通常狀況下,Open都應該只獲取「源」下的某個子頁面,
用Open獲取其餘「源」的頁面在測試中應該極少數的。由於在這種狀況下,咱們還應該再new一個新的ISelenium
selenium進行處理,雖然用OPEN獲取其餘「源「的頁面出現的機會極少,但若是真的須要這樣的話,也只能啓動
proxyInjectionMode模式了,雖然這樣的效率會低一些。
Selenium RC服務器命令行參數列表
java -jar selenium-server.jar [-interactive] [options]
-port <nnnn>:selenium服務器使用的端口號(默認4444)
-timeout <nnnn>:咱們放棄前(超時)所等待的秒數
-interactive:進入交互模式
-multiWindow:進入被測試網站都在單獨窗口打開的模式,而且selenium支持frame
-foreBrowserMode <browser>:設置瀏覽器模式(例如,全部的會話都使用"*iexplore",無論給getNewBrowserSession傳遞什麼參數
-userExtensions <file>:指定一個被載入到selenium的javascript文件
-browserSessionReuse:中止在測試間從新初始化和替換瀏覽器
-alwaysProxy:默認狀況下,咱們儘可能少的進行代理,設置這個標誌將會強制全部的瀏覽器通信都經過代理
-firefoxProfileTemplate <dir>:通常狀況,咱們在每次啓動以前都生成一個乾淨的firefox設置,您能夠指定一個目錄來讓咱們將你的設置
拷貝過來,代替咱們生成的。
-debug:進入debug模式,會有更多的跟蹤調試信息。
-htmlSuite <browser> <startURL> <suiteFile> <resultFile> :使用指定的瀏覽器,例如"*firefox",在指定的URL,運行在一個
單獨的HTML Selenses(Selenium Core)測試套件而後當即退出。您須要指定HTML測試套件的絕對路徑還有咱們將會生成的
HTML測試結果文件的路徑。
-proxyInjectionMode:進入代理注入模式,這個模式中的selenium服務器做爲進入測試程序的全部內容的代理服務器。
在這個模式下,能夠跨多個域訪問,而且還支持以下附加參數:
-dontInjectRegex <regex>:附加的正則表達式,代理注入模式可以使用它決定是否進行注入。
-userJsInjection <file>:指定一個JAVASCRIPT文件,將它注入到全部頁面中。
-userContentTransformation <regex> <replacement>:一個正則表達式,對全部被測HTML內容進行匹配,第二個
string將會對替換全部匹配的內容。這個標誌可以使用屢次。
如-userContentTransformation https http,則測試應用程序的HTML中的全部「https」字符串都會被替換
爲"http".
還支持兩種JAVA系統屬性:-Dhttp.proxyHost -dhttp.proxyPort.
使用Selenium服務器做爲代理服務器,Selenium RC通常重載你的代理服務器配置。使用這個參數適合在使用Selenium服務器代理的同時使用
你本身的代理服務器,使用代理服務時這樣配置:
java -Dhttp.proxyHost=myproxy.com -dhttp.proxyPort=1234 -jar selenium-server.jar
若是你的HTTP代理服務器須要驗證,你還能夠經過-Dhttp.proxyUser和-Dhttp.proxyPassword指定用戶名和密碼。
Selenium WebDriver
WebDriver與以前Selenium的JS注入實現不一樣,直接利用了瀏覽器native support來操做瀏覽器。
因此對於不一樣平臺,不一樣的瀏覽器,必須依賴一個特定的瀏覽器的native component來實現把WebDriver API的調用轉化爲瀏覽器的native invoke。
在咱們new一個WebDriver的過程當中,Selenium首先會確認瀏覽器的native component是否存在可用並且版本匹配。
接着就在目標瀏覽器裏啓動一整套Web Service,這套Web Service使用了Selenium本身設計定義的協議,名字叫作The WebDriver Wire Protocol。
這套協議很是之強大,幾乎能夠操做瀏覽器作任何事情,包括打開、關閉、最大化、最小化、元素定位、元素點擊、上傳文件等等等等。
WebDriver Wire協議是通用的,也就是說不論是FirefoxDriver仍是ChromeDriver,啓動以後都會在某一個端口啓動基於這套協議的Web Service。
但不一樣瀏覽器端口可能不一樣
接下來,咱們調用WebDriver的任何API,都須要藉助一個ComandExecutor發送一個命令,其實是一個HTTP request給啓動的端口上的Web Service。
在咱們的HTTP request的body中,會以WebDriver Wire協議規定的JSON格式的字符串來告訴Selenium咱們但願瀏覽器接下來作什麼事情
不一樣瀏覽器的WebDriver子類,都須要依賴特定的瀏覽器原生組件,例如Firefox就須要一個add-on名字叫webdriver.xpi。
而IE的話就須要用到一個dll文件來轉化Web Service的命令爲瀏覽器native的調用
在Selenium的源碼中,咱們能夠找到一個HttpCommandExecutor這個類,裏面維護了一個Map,它負責將一個個表明命令的簡單字符串key,轉化爲相應的URL, 由於REST的理念是將全部的操做視做一個個狀態,每個狀態對應一個URI。 因此當咱們以特定的URL發送HTTP request給這個RESTful web service以後,它就能解析出須要執行的操做