Selenium的使用:WEB功能測試

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以後,它就能解析出須要執行的操做

相關文章
相關標籤/搜索