Selenium是一系列基於web的界面自動化測試工具集合,提供了全面的測試函數,用於支持B/S類應用的界面自動化測試。 Selenium能夠直接控制瀏覽器完成各類操做,支持多個平臺、多種瀏覽器、多種編程語言的測試腳本。javascript
本文主要闡述了selenium 1和Webdriver執行自動化測試腳本的原理,並經過一個簡單的自動化測試腳本實例進行原理剖析。java
關鍵字:自動化測試、selenium 一、webdriverpython
Selenium的核心selenium core基於JsUnit,徹底由JavaScript編寫,所以可運行於任何支持JavaScript的瀏覽器上,支持的瀏覽器包括IE、Firefox、chrome等。web
Selenium測試直接運行在瀏覽器中,就像真正的用戶在操做同樣。這個工具的主要功能包括:測試與瀏覽器的兼容性(測試應用程序是否可以在不一樣瀏覽器和操做系統上運行)、測試系統功能(測試功能和用戶需求)。chrome
selenium支持自動錄製和生成測試腳本,可生成JAVA、python、C#等不一樣語言的測試腳本。selenium包含selenium IDE、selenium webdriver、selenium remote control(RC)和selenium Grid等組件,如圖1所示。編程
圖1 selenium框架segmentfault
Selenium IDE是一個集成測試工具,被嵌套在firefox瀏覽器中,做爲firefox瀏覽器的一個插件來使用。測試人員能夠經過selenium IDE來錄製網頁界面上的操做,能夠對錄製的動做進行編輯、調試以及快速回放。將用戶在瀏覽器中執行的操做記錄下來,生成各類形式的腳本,並可將這些腳本保存供之後使用和維護。瀏覽器
Selenium 1 (selenium-RC)是selenium最主要的測試工具之一,它所具備的某些功能即便是新版的selenium 2也沒法支持。它可以經過多種語言(JAVA、JavaScript、Ruby、PHP、Python、Perl和C#)編寫測試代碼,同時可以支持幾乎全部瀏覽器的測試。服務器
Selenium 2,一般稱爲webdriver,主要功能集成了selenium 1以及webdriver(webdriver曾經是selenium的競爭對手)。也就是說,Selenium 2是selenium和webdriver兩個項目的合併,即Selenium 2兼容Selenium,它既支持selenium API(應用程序編程接口)也支持Webdriver API。對比selenium 1時代的selenium RC,webdriver優點明顯。session
Selenium RC經過selenium server把javascript腳本注射到瀏覽器中,而後經過特定的測試腳本調用javascript命令,實現與瀏覽器的交互操做。webdriver經過原生瀏覽器支持或者瀏覽器擴展直接控制瀏覽器,比Selenium 1更簡單易學,而且速度大幅提升,調用的穩定性取決於瀏覽器自己,更加科學。相應產生的問題就是,不一樣的瀏覽器廠商,對web元素的操做和呈現多少會有一些差別,這就直接致使了selenium webdriver要區分瀏覽器廠商,提供不一樣的實現。
Selenium Grid使得selenium 能同時並行地、在不一樣的環境上運行多個測試任務,極大地加快了web應用的功能測試。
Selenium 1是selenium中最主要的第一代測試工具,相比於selenium 2,它更加成熟、穩定,能支持幾乎全部瀏覽器的測試。
Selenium 1的缺點是:
Selenium 1包含的主要組件有:
圖2 selenium1架構
Selenium服務器用於接收測試程序傳來的selenium命令,解釋並執行他們,而後向測試程序反饋測試的結果。Selenium服務器捆綁了Selenium-core並自動將其注入瀏覽器,該步驟在測試程序打開瀏覽器(調用客戶端文件的API函數)時執行。Selenium-core是JavaScript程序,也就是說,它是一系列JavaScript函數,用於調用瀏覽器內置的JavaScript解釋器,以解釋和執行selenese命令
該服務器一樣能夠接收來自測試程序的HTTP GET/POST請求的selenese命令,這意味着可使用任何支持HTTP請求的編程語言來編寫測試代碼。
客戶端庫文件提供了對編程的支持,這樣就能夠本身設計程序來運行selenium命令。對於每一種支持的編程語言,都有不一樣的客戶端庫文件。Selenium客戶端庫文件提供了編程接口,用於在程序中運行selenium命令。
客戶端庫文件能夠生成selenese命令,而後將其傳遞到selenium服務器,對被測試的應用程序執行指定的動做或者測試。客戶端文件也能夠接收命令執行的結果,並將其傳遞給應用程序,應用程序能夠根據返回結果判斷當前測試是經過仍是失敗。
所以要建立測試程序,只須要經過客戶端庫文件API編寫程序,用它來執行一系列Selenium命令。也能夠在Selenium IDE中建立Selenese測試腳本,導出成客戶端驅動的API函數調用,如圖3所示。
圖3 導出selenium1執行腳本
這部分具體描述一下webdriver工做原理。引用一個形象的類比,能夠把webdriver驅動瀏覽器類比成出租車司機開出租車,這個場景中有三個主要角色:
在webdriver中也有三個相似的角色,自動化測試腳本代碼至關於乘客,瀏覽器的驅動至關於出租車司機,瀏覽器至關於出租車:
具體的腳本執行過程是:
同一個瀏覽器驅動既能夠處理C#語言的腳本,也能夠處理Python語言的腳本,這是由於:HTTP協議是一個瀏覽器和Web服務器之間通訊的標準協議,幾乎每一種編程語言都提供了豐富的http庫,能夠方便的處理客戶端和服務器端之間的請求與響應,http請求及響應包括:http請求方法、http請求及響應內容body、http響應狀態碼等。
常見的http請求方法有:
http響應狀態碼用來判斷請求的結果。
Body部分主要傳送具體的數據,在webdriver中以JSON報文的形式存在並傳送,例如:
Webdriver使用的協議是JSON Wire protocol,該協議是在http協議基礎上,對http請求及響應的body數據進行規範。當用戶新建webdriver時,selenium首先確認瀏覽器的native component是否存在、可用並且版本匹配。若經過確認,則在瀏覽器啓動web service服務。JSON Wire protocol協議功能強大,幾乎能夠操做瀏覽器作任何事情,包括打開、關閉、最大化、最小化、元素定位、元素點擊、上傳文件等。
JSON Wire protocol是通用的,無論firefoxDriver仍是ChromeDriver,啓動以後會在某一端口基於該協議啓動web service。例如firefoxDriver初始化成功後,默認會從http://localhost:7055開始。在調用webdriver API時,須要藉助CommandExecutor發送命令,實際是向web service發送一個http request,在該request的body中,以JSON格式調用selenium執行其他操做。
本部分介紹一個最簡單的自動化測試腳本,該腳本實現科技管理工做臺(ITA)的登陸功能:輸入帳號和密碼並點擊登陸。該腳本能夠經過Selenium IDE錄製,導出成JAVA語言腳本,也能夠直接編寫JAVA代碼生成。主要腳本以下:
下面的代碼實現打開firefox瀏覽器並跳轉到ITA登錄頁面:
Webdriver driver = new FirefoxDriver();//實例化一個driver driver.get(「http://ita.abc/ita/login.action」);
在執行driver.get(「http://ita.abc/ita/login.action」);代碼時,測試代碼向server發送了以下的請求:
POST session/sessionId/url post_data{「url」:」http://ita.abc/ita/login.action」}
經過post方式請求localhost:port/hub/session/session_id/url地址,並請求瀏覽器完成跳轉url的操做。
若是上述請求是可接受的,server會跳轉到該post data包含的url,並返回以下的response:
{「name」:」get」,」sessionId」:」******」,」status」:0,」value」:」」}
該response中包含以下信息:
對於大多數selenium命令,都須要一個目標位置,該位置在web應用程序的上下文中惟一地定義web元素。
在Selenium IDE中,能夠在每條錄製命令中的Target選擇該元素的定位方式,如圖4所示:
圖4 seleniumIDE定位方式
在webdriver中一共有8種定位策略,具體列表以下:
圖5 webdriver定位方式
以id爲例說明:
圖6 ITA登錄界面
要在用戶名輸入框輸入內容,能夠經過 id= 「userNameInput」做爲定位條件獲取該對象。如圖7頁面源碼中,可看出,id=「userNameInput」可惟一標示用戶名輸入框。
代碼driver.findElement(By.id("userNameInput"))
表示尋找id
爲「userNameInput」的元素,在獲取頁面元素後,就能夠對該頁面元素進行各類操做了。
圖7 頁面元素
經常使用的元素操做方法有以下幾種:
表示找到id爲userNameInput輸入框以後,填寫用戶名信息。
Selenium包含selenium IDE、seleniumwebdriver、selenium remote control(RC)和selenium Grid等組件。
Selenium 1客戶端庫文件能夠生成selenese命令,而後將其傳遞到selenium服務器,Selenium服務器接收測試程序傳來的selenium命令,經過selenium core操控瀏覽器,並向測試程序反饋測試的結果;webdriver直接驅動瀏覽器進行各項操做,執行速度更優,易用性更強,可是webdriver對瀏覽器版本有必定的依賴性,在版本升級後,須要下載新的驅動程序。
來源:IDCF社區 做者:程偉靜