【DevOps進行時】基於Selenium的自動化測試腳本執行原理分析 | IDCF

摘要

Selenium是一系列基於web的界面自動化測試工具集合,提供了全面的測試函數,用於支持B/S類應用的界面自動化測試。 Selenium能夠直接控制瀏覽器完成各類操做,支持多個平臺、多種瀏覽器、多種編程語言的測試腳本。javascript

本文主要闡述了selenium 1和Webdriver執行自動化測試腳本的原理,並經過一個簡單的自動化測試腳本實例進行原理剖析。java

關鍵字:自動化測試、selenium 一、webdriverpython

1、selenium總體框架

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所示。編程

image.png

圖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應用的功能測試。

2、Selenium 1工做原理

Selenium 1是selenium中最主要的第一代測試工具,相比於selenium 2,它更加成熟、穩定,能支持幾乎全部瀏覽器的測試。

Selenium 1的缺點是:

  • 編碼方式是面向過程而非面向對象,易用性較差;
  • 經過Selenium Core間接驅動瀏覽器,運行速度不如webdriver。下面簡單介紹一下selenium 1的工做原理。

Selenium 1包含的主要組件有:

  • Selenium服務器:負責啓動或關閉瀏覽器;解釋和運行從測試程序中傳來的selenese命令(selenese是seleniumIDE中使用的命令集),並能夠扮演HTTP代理的角色;捕獲和驗證在瀏覽器和被測試的應用程序之間傳遞的HTTP消息。
  • 客戶端庫文件提供了各類編程語言和selenium RC服務器之間的接口。

image.png

圖2 selenium1架構

2.1 Selenium服務器

Selenium服務器用於接收測試程序傳來的selenium命令,解釋並執行他們,而後向測試程序反饋測試的結果。Selenium服務器捆綁了Selenium-core並自動將其注入瀏覽器,該步驟在測試程序打開瀏覽器(調用客戶端文件的API函數)時執行。Selenium-core是JavaScript程序,也就是說,它是一系列JavaScript函數,用於調用瀏覽器內置的JavaScript解釋器,以解釋和執行selenese命令

該服務器一樣能夠接收來自測試程序的HTTP GET/POST請求的selenese命令,這意味着可使用任何支持HTTP請求的編程語言來編寫測試代碼。

2.2 Selenium客戶端庫文件

客戶端庫文件提供了對編程的支持,這樣就能夠本身設計程序來運行selenium命令。對於每一種支持的編程語言,都有不一樣的客戶端庫文件。Selenium客戶端庫文件提供了編程接口,用於在程序中運行selenium命令。

客戶端庫文件能夠生成selenese命令,而後將其傳遞到selenium服務器,對被測試的應用程序執行指定的動做或者測試。客戶端文件也能夠接收命令執行的結果,並將其傳遞給應用程序,應用程序能夠根據返回結果判斷當前測試是經過仍是失敗。

所以要建立測試程序,只須要經過客戶端庫文件API編寫程序,用它來執行一系列Selenium命令。也能夠在Selenium IDE中建立Selenese測試腳本,導出成客戶端驅動的API函數調用,如圖3所示。

image.png

圖3 導出selenium1執行腳本

3、webdriver工做原理

這部分具體描述一下webdriver工做原理。引用一個形象的類比,能夠把webdriver驅動瀏覽器類比成出租車司機開出租車,這個場景中有三個主要角色:

  • 乘客:告訴出租車司機目的地,以及大概路線
  • 出租車司機:按照乘客的要求操控出租車
  • 出租車:按照司機的操控完成實際的行駛,把乘客送到目的地

在webdriver中也有三個相似的角色,自動化測試腳本代碼至關於乘客,瀏覽器的驅動至關於出租車司機,瀏覽器至關於出租車:

  • 自動化測試腳本代碼:自動化測試代碼發送請求給瀏覽器的驅動(例如火狐、chrome驅動)
  • 瀏覽器的驅動:解析自動化測試代碼,解析後把結果發送給瀏覽器
  • 瀏覽器:執行瀏覽器驅動發出的指令,完成實際的操做

具體的腳本執行過程是:

  • 對於每一條Selenium腳本,會建立一個http請求併發送給瀏覽器的驅動
  • 瀏覽器驅動中包含了一個HTTP Server,用來接收http請求
  • HTTP Server接收到請求後根據請求來具體操控對應的瀏覽器
  • 瀏覽器執行具體的測試步驟
  • 瀏覽器將步驟執行結果返回給HTTP Server
  • HTTP Server又將結果返回給Selenium腳本,若是是錯誤的http代碼,就能夠在控制檯看到對應的報錯信息。

同一個瀏覽器驅動既能夠處理C#語言的腳本,也能夠處理Python語言的腳本,這是由於:HTTP協議是一個瀏覽器和Web服務器之間通訊的標準協議,幾乎每一種編程語言都提供了豐富的http庫,能夠方便的處理客戶端和服務器端之間的請求與響應,http請求及響應包括:http請求方法、http請求及響應內容body、http響應狀態碼等。

常見的http請求方法有:

  • GET:用來從服務器獲取信息,好比獲取網頁的標題信息等。
  • POST:向服務器發送操做請求,好比click,findElement等。

http響應狀態碼用來判斷請求的結果。

Body部分主要傳送具體的數據,在webdriver中以JSON報文的形式存在並傳送,例如:

image.png

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執行其他操做。

4、具體實例介紹(基於webdriver的測試腳本)

本部分介紹一個最簡單的自動化測試腳本,該腳本實現科技管理工做臺(ITA)的登陸功能:輸入帳號和密碼並點擊登陸。該腳本能夠經過Selenium IDE錄製,導出成JAVA語言腳本,也能夠直接編寫JAVA代碼生成。主要腳本以下:

image.png

4.1 打開網頁

下面的代碼實現打開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中包含以下信息:

  • Name:server端實現方法的名稱,這裏是get,表示跳轉到指定url
  • sessionId:當前session的id
  • Status:請求執行的狀態碼,非0表示未正確執行,這裏是0,表示執行成功
  • Value:請求的返回值,這裏返回值爲空。若是請求的是頁面的title,value將被賦值爲title的值。

4.2 元素定位方式

對於大多數selenium命令,都須要一個目標位置,該位置在web應用程序的上下文中惟一地定義web元素。

在Selenium IDE中,能夠在每條錄製命令中的Target選擇該元素的定位方式,如圖4所示:

image.png

圖4 seleniumIDE定位方式

在webdriver中一共有8種定位策略,具體列表以下:

image.png

圖5 webdriver定位方式

以id爲例說明:

image.png

圖6  ITA登錄界面

要在用戶名輸入框輸入內容,能夠經過 id= 「userNameInput」做爲定位條件獲取該對象。如圖7頁面源碼中,可看出,id=「userNameInput」可惟一標示用戶名輸入框。

代碼driver.findElement(By.id("userNameInput"))表示尋找id

爲「userNameInput」的元素,在獲取頁面元素後,就能夠對該頁面元素進行各類操做了。

image.png

圖7 頁面元素

4.3 元素操做

經常使用的元素操做方法有以下幾種:

  • sendKeys()方法用於爲input元素輸入文本
  • Click()方法用於執行單擊元素的操做
  • Clear()方法用於清空input元素的值
  • Submit()方法用於對指定元素所在的form進行提交操做

image.png

表示找到id爲userNameInput輸入框以後,填寫用戶名信息。

5、總結

Selenium包含selenium IDE、seleniumwebdriver、selenium remote control(RC)和selenium Grid等組件。

Selenium 1客戶端庫文件能夠生成selenese命令,而後將其傳遞到selenium服務器,Selenium服務器接收測試程序傳來的selenium命令,經過selenium core操控瀏覽器,並向測試程序反饋測試的結果;webdriver直接驅動瀏覽器進行各項操做,執行速度更優,易用性更強,可是webdriver對瀏覽器版本有必定的依賴性,在版本升級後,須要下載新的驅動程序。

來源:IDCF社區 做者:程偉靜
相關文章
相關標籤/搜索