电竞比分网-中国电竞赛事及体育赛事平台

分享

使用 Sahi 實(shí)現(xiàn) Web 自動化測試

 瞎聊瞎看 2014-07-13

Web 測試背景

隨著 Web 技術(shù)和互聯(lián)網(wǎng)的發(fā)展,Web 應(yīng)用產(chǎn)品越來越豐富,基于 Web 頁面測試的需求與日俱增。在當(dāng)前全球軟件都在追求高效、敏捷的開發(fā)模式的大背景下,Web 自動化測試成為了新一波技術(shù)探討和研究的熱潮。因?yàn)閭鹘y(tǒng)的手工測試不僅效率低,并且測試質(zhì)量受限于測試人員的一些情緒和心情。若當(dāng)一個測試人員帶著煩躁情緒來測這些繁雜的大量重復(fù)性工作,測試的質(zhì)量令人擔(dān)憂。更何況,當(dāng)這項(xiàng)測試工作涉及到全球化方面的測試時,多語言版本的測試工作導(dǎo)致該測試工作量的成倍增加,這無疑是一項(xiàng)巨大的考驗(yàn)!

回頁首

Sahi 的特性和優(yōu)勢:

當(dāng)提及面向 Web 的自動化測試,相信許多讀者會想到或者說使用過 Selenium、Watir 等工具,而對于 Sahi 就可能比較陌生。首先,讓我們先來了解下 Sahi 工具。它是一款印度公司 Tyto Software 開發(fā)的成熟的開源 Web 自動化測試工具。Sahi 簡單易用,能良好支持 Ajax 和 Web2.0 技術(shù),同時適用于敏捷和傳統(tǒng)的不同測試模式。那么,它與其他非常流行的 Web 自動化測試工具有哪些不同和優(yōu)勢呢?讓我們將其與主流自動化測試工具 Selenium 和 Watir 來進(jìn)行一番對比,請參考圖 1:

圖 1. Sahi 與其他工具的對比

從上圖的對比可以看出,Selenium 支持的腳本語言比較豐富,且自帶 Selenium IDE 自動錄制工具,Watir 執(zhí)行的速度相對其他較快。而 Sahi 同樣具備了自帶的錄制器,且支持幾乎所有瀏覽器,且對 JS 支持較好,擁有頁面等待判斷機(jī)制,內(nèi)置 Java 異常報告,支持 Ajax 等優(yōu)勢。

下面,本文將詳細(xì)介紹一下 Sahi 的幾大優(yōu)勢。

基于上下文的頁面識別機(jī)制:

大多數(shù)如 Selenium 等 Web 自動化測試工具或是自動化框架,都采用類似基于 DOM 的定位策略、Xpath 定位策略和 id、name、identifier 等頁面元素定位策略。

Identifier 定位是最普遍的一種定位方式,當(dāng)不能識別為其它定位方式后,默認(rèn)為 identifier 定位。在這種策略下,第一個使用 id 的頁面元素將被識別出來,如果沒有使用指定 id 的元素,那么將識別第一個名字與指定條件相符的元素。

例如,identifier 識別 username 元素的定位策略:identifier=username

Id 定位是在知道元素具體 id 特征的情況下的一種更精確定位。例如,定位頁面元素 loginFrom:id=loginFrom

name 定位方式是去識別第一個匹配名稱屬性的 UI 元素。如果多個元素?fù)碛邢嗤拿Q屬性,可以使用 value 過濾器來進(jìn)一步優(yōu)化您的定位策略。例如,定位頁面元素為 username:
name=username

Xpath 定位是在 XML 中定位元素的方法,而 HTML 可以被看作是 XML 的一種實(shí)現(xiàn)。XPath 擴(kuò)展了上面 id 和 name 定位方式,提供了絕對路徑和相當(dāng)路徑兩種查找方式。

絕對路徑:html/body/div[1]/div[1]/div[3]/div[1]/form/span/input[1]

相對路徑查找://div[@id='fm']/form/span/input

然而,在實(shí)際的情況下,頁面元素并非如預(yù)期般明確。一些動態(tài)頁面的 DOM 樹常常隨著 Web 產(chǎn)品的更新而頻繁改變。許多的元素值如 ID、Name 等在代碼中并不是必須的,常常會缺省。并且,屬性值往往不是唯一對應(yīng)的,頁面中有時會存在相同屬性的元素。當(dāng)缺省 id 值或是 Xpath 定位失效時,上述這幾種查找定位方式往往顯得無助和脆弱。

Sahi 采用了一種主動查找的機(jī)制,它不受限于特定的元素屬性。在沒有 ID、Name 值的情況下,它可以使用一些如“title,value”等屬性,這些都是頁面可見的屬性,所見即所得。同時,Sahi 會通過傳入這些可見可識別的屬性值,來按照 Sahi 預(yù)設(shè)的機(jī)制進(jìn)行查找識別。Sahi 允許開發(fā)者對每一種元素設(shè)置不同屬性和特定的查找順序,包括那些自定義的屬性名。所以 Sahi 相對于其他的 Web 自動化測試工具更靈活更開放。

比如,_link(“valueName”)用來定位一個定義為“valueName”的 link,這里的 valueName 并不一定是 value 的屬性值,也可以是它的 id、title 等。

前面提到了 Sahi 主動查找的機(jī)制,那么它是如何去查找 DOM 節(jié)點(diǎn)下的特定元素的呢?Sahi 主要提供了三種基于上下文的元素 API:_in,_near 和_under。

從字面意思上,我們不難理解,_in 是指在某個 DOM 節(jié)點(diǎn)下查找某個元素,這比 Xpath 的不管是絕對路徑或是相對路徑查找都來的靈活,不會因?yàn)?DOM 樹內(nèi)部結(jié)構(gòu)發(fā)生變化而導(dǎo)致路徑失效找不到元素的問題。

_near 是指在某個元素附近查找相應(yīng)設(shè)定規(guī)則條件的最近一個元素,這對于一個頁面中有多個相同屬性值的情況提供了一個很好的解決方式,使查找的范圍更精確。

_under 是指在某個元素下方開始查找,找到符合條件的最近一個元素,一般_under 都適用在具有相同偏移量的同一列中。下面,我們來看一個例子,加深對 Sahi 這種基于上下文識別查找機(jī)制的理解:

圖 2. 案例網(wǎng)頁

假設(shè),在圖 2 顯示的 Web 頁面的所有 text box 的 name=”q”,那么,Sahi 的偵探器通過一些標(biāo)識來鑒別它們,如(_textbox("q"), _textbox("q[1]")和_textbox("q[2]"))。

如果,我們要定位“Ruby for Rails”那一行的 text box,即_textbox("q[1]")。傳統(tǒng)的元素識別會遇到多個相同屬性元素的問題,即使是 Xpath 的定位方式也會因?yàn)樵谒懊婕恿艘恍行碌臄?shù)據(jù)而導(dǎo)致 Xpath 定位失敗的情況。

這時 Sahi 可以通過_near 這種方式來定位:

_textbox("q",_near(_cell("Ruby for Rails")))

當(dāng)要定位 check box 時,我們又會發(fā)現(xiàn),“Ruby for Rails”這一行有“Recommend”和“Already own”兩個 check box,為了更準(zhǔn)確地定位,我們可以結(jié)合_under,例如:_checkbox(0,_near(_cell("Ruby for Rails")),_under(_cell("Recommend")))。

如果在整個頁面中存在多個這樣的表格,我們還可以用_in 來進(jìn)一步縮小范圍,如:_checkbox(0,_near(_cell("Ruby for Rails")),_under(_cell("Recommend")),
_in(_cell("Cost))).

同時值得一提的是,Sahi API 中的 identifier 參數(shù)都支持正則表達(dá)式,例如,_div(/name.*/) 用來識別所有以某種預(yù)屬性值是 name 開頭的 div。

隱式頁面加載響應(yīng)等待機(jī)制:

現(xiàn)在越來越多的 Web 應(yīng)用采用 Ajax 的應(yīng)用技術(shù),來支持網(wǎng)頁數(shù)據(jù)的異步請求響應(yīng)。當(dāng)前一般的 Web 自動化測試工具沒有一個智能的處理機(jī)制,來判斷何時可以繼續(xù)下一個操作。像 Selenium 等自動化測試工具通常會在腳本中人為來設(shè)定一個固定的等待時間。但這往往被證實(shí)不一定是準(zhǔn)確的。實(shí)際測試中,人是很難準(zhǔn)確判斷每一個操作請求需要的合理時間數(shù)值。因?yàn)椋却龝r間設(shè)置過短,下一步操作在被測應(yīng)用請求還未返回就執(zhí)行了,或是由于網(wǎng)絡(luò)因素使正常的響應(yīng)時間變長,都可能導(dǎo)致測試過程找不到相應(yīng)的頁面元素,從而導(dǎo)致整個測試用例失敗的情況。而如果把時間設(shè)置過長,又會造成在一些正常響應(yīng)過程中的不必要等待的時間浪費(fèi),降低了測試效率。

當(dāng)然,一些測試人員會在自動化測試腳本中加入一些自定義的代碼。通過輪詢界面上某個指定元素,來判斷請求響應(yīng)是否返回,進(jìn)而決定繼續(xù)下一步操作或者是超時。但是,這樣的查找過程會導(dǎo)致整個腳本代碼變得非常臃腫,加大了開發(fā)的成本。更何況,在一個動態(tài)的頁面找到指定的元素本身就不是一件容易的事。

Sahi 內(nèi)置了智能的頁面等待機(jī)制,能夠自動判斷 Ajax 請求是否已經(jīng)處理完畢,然后繼續(xù)下一步操作。并且,這一點(diǎn)對于用戶是“隱式”的,不需要增加額外的代碼。

回頁首

Sahi 的工作原理:

簡單地說,用 Sahi 實(shí)現(xiàn)自動化測試有三步,錄制,精煉腳本和回放,如下圖:

圖 3. Sahi 工作的三個主要過程

如上圖 Sahi 就是先用其自帶的錄制工具,把大致的操作過程錄制下來,并用 Sahi 代碼記錄下整個操作過程。隨后,將自動生成的代碼進(jìn)一步的精煉和開發(fā),調(diào)用一些外部 API 或編寫特定代碼來實(shí)現(xiàn)特定的操作。最后,用 Sahi 來回放保存好的最終腳本,Sahi 就將自動對 Web 應(yīng)用進(jìn)行定義好的測試操作。

下面,本文將對這三個過程進(jìn)行詳細(xì)說明。

第一步:錄制

圖 4. Recording 過程的工作原理

Sahi 是通過運(yùn)行為一個代理服務(wù)器,并通過設(shè)置瀏覽器代理為 Sahi 服務(wù)器。這樣 Sahi 的腳本就能夠通過 request 請求來注入到 JavaScript 里以訪問 Web 頁面中的元素。如圖,可以很清晰的看到,Sahi 就是 Web 瀏覽器和 Web 服務(wù)器之間的一個中間代理。

第二步:精煉腳本

圖 5. Refine Script 過程的工作原理

錄制的腳本都是指定元素并唯一操作的,這時就需要對代碼進(jìn)行重構(gòu),抽取出核心的功能塊,對其中的元素進(jìn)行參數(shù)化處理,以實(shí)現(xiàn)重用。這樣的數(shù)據(jù)可以從外部的 DB 或文件中讀取而來。與此同時,也可調(diào)用 Sahi API 或外部 Java 等 API 實(shí)現(xiàn)特定的一些功能。

第三步:回放

圖 6. Play back 過程的工作原理

Sahi 運(yùn)行提煉好的腳本來自動化測試操作,并生成測試報告。

回頁首

Sahi 的安裝部署與配置

Sahi 雖然是 Tyto 公司的產(chǎn)品,但它的下載放在世界上最大的開源軟件開發(fā)網(wǎng)站 SourceForge 上,可以通過點(diǎn)擊這里下載。

圖 7. Sahi 下載

默認(rèn)推薦是下載 install_sahi_xxx.jar,這是一個可執(zhí)行文件,包含了 Sahi 的安裝器和 Sahi 工具及其源代碼。當(dāng)然您也可以點(diǎn)擊上圖紅框處“Browse All Files”來選擇歷史版本和一些免安裝壓縮文件。比如,選擇只包含 Sahi 工具的 sahi_xxx.zip 文件,或者包含了 Sahi 和源代碼的免安裝壓縮包文 件sahi-src_xxx.zip。

一般建議選擇推薦的 Sahi 安裝包文件即可,這樣可以免去一些設(shè)置操作,并可以選擇是否安裝源代碼。雙擊 jar 文件進(jìn)行安裝,如圖:

圖 8. Sahi 安裝

安裝過程非常簡單,待安裝完成后雙擊桌面圖標(biāo)打開 Sahi 程序。打開程序先會出現(xiàn)一個 Sahi Dashboard,它能自動開啟 Sahi 代理服務(wù)來啟動瀏覽器,而不需要繁瑣的代理服務(wù)器設(shè)置操作。當(dāng)然如有需要,您也可以手動修改這些代理設(shè)置。

圖 9. Sahi Dashboard 界面

Sahi 會自動去偵探您系統(tǒng)里安裝的一些瀏覽器,并在 Sahi Dashboard 上顯示出來,如果發(fā)現(xiàn)有一些其他的瀏覽器未被準(zhǔn)確偵探出來,您也可以點(diǎn)擊下面的“Configure”來進(jìn)行配置添加進(jìn)來。

接下來,通過點(diǎn)擊 Sahi Dashboard 上的瀏覽器圖標(biāo)按鈕來啟動相應(yīng)瀏覽器。

圖 10. Sahi 啟動 firefox 瀏覽器

您可以輸入起始測試的網(wǎng)頁 URL 開始您的測試。如果測試的目標(biāo) URL 是 HTTPS 協(xié)議的,也可以點(diǎn)擊“SSL Manager”來查看和管理 SSL 證書。

圖 11. Sahi SSL 管理界面

按住 Alt 鍵并雙擊頁面,將彈出 Sahi 控制窗口,如圖 12:

這個窗口相當(dāng)于 Sahi 的主控臺,在這里我們可以來錄制和回放 Sahi 腳本,并編輯和管理腳本信息。

圖 12. Sahi Controller 錄制

在 Record 視圖界面,輸入一個腳本名稱,點(diǎn)擊“Record”,這時 Sahi 錄制器便開始工作了。把鼠標(biāo)移到瀏覽器上的目標(biāo)網(wǎng)頁上,您的所有操作過程都將被記錄下來。您也可以自定義增加一個 Assertion。按住 Ctrl 鍵,把鼠標(biāo)移動到目標(biāo)網(wǎng)頁的任意一個 HTML 元素,那么這個 Accessor 會自動出現(xiàn)在 Sahi 控制器中。這時,便可以自定制對該元素的操作。常用的操作有“點(diǎn)擊”,“高亮”,“賦值等。同時,您可以通過“Append to Script”按鈕來加到腳本代碼中。錄制完成后按“Stop”來結(jié)束整個過程。

圖 13. Sahi 自動生成腳本精煉

圖 13 是一個簡單的 Sahi 自動錄制過程得到的 Sahi 腳本代碼。其大致過程為:通過百度搜索“sahi”關(guān)鍵字,校驗(yàn) Sahi 官網(wǎng)的 assert 是否存在,點(diǎn)擊進(jìn)入 Sahi 官網(wǎng)后繼續(xù)校驗(yàn) assert“Community Forums”,點(diǎn)擊進(jìn)入。通過前一節(jié)“Sahi Controller 錄制”來完成這個操作過程,那么,您可以在默認(rèn)目錄“C:\Users\IBM_ADMIN\sahi\userdata\scripts”中找到先前命名為“Test_sahi”的腳本文件,我們可以將這段代碼進(jìn)行一個精煉和豐富的過程,比如在點(diǎn)擊“Community Forums”鏈接前將它進(jìn)行高亮操作:

_popup("Sahi Web Test Automation Tool")_highlight(_link("Community Forums"));

或者您想在 Sahi 腳本代碼中調(diào)用內(nèi)置的 Java 類,例如:

functionprintThroughJava(s){
java.lang.System.out.println("Through Java: "+s);}
printThroughJava("Hi there");

“Through Java: Hi there”將在 sahi 的命令行中輸出。

圖 14. Sahi Controller 回放

回放的時候,只需要在 Sahi 控制臺上切換到“Playback”tab 頁面,找到腳本存放的路徑,下面就有開始、暫停和結(jié)束等按鈕來進(jìn)行操作。需要注意的是,開始以前必須給它設(shè)置一個“Stat URL”否則無法回放腳本。腳本回放的時候,在“Statements”里可以看到腳本運(yùn)行的日志,比如操作步驟和一些錯誤信息等。

通過點(diǎn)擊右下角的“View Logs”可以查看詳細(xì)的 Sahi 運(yùn)行日志報告:

圖 15. Sahi 日志報告

由圖可見,這樣自動錄制生成的腳本代碼都是 Sahi 代碼,我們可以在實(shí)際的 Java 項(xiàng)目中調(diào)用這些 Sahi 代碼,以實(shí)現(xiàn)重用。其實(shí),我們可以通過打開 sahi/config/sahi.properties 文件將其中屬性設(shè)置為 controller.mode=java 來實(shí)現(xiàn)自動錄制腳本的語言為 Java。值得注意的是,改為 Java 語言錄制后的 Sahi 控制器和原來有所不同,它的界面更簡潔,功能也更簡單一些,沒有了自動回放功能。因?yàn)?,這更多是為了自動生成一些簡單的腳本,來提高開發(fā)人員的開發(fā)效率。

回頁首

Sahi 的語法與示例應(yīng)用

Sahi 腳本是基于 JavaScript 的,而 Sahi 腳本是通過代理解析的,并能夠在 rhino JavaScript 引擎中有效執(zhí)行的。除了變量前的強(qiáng)制符$,它和 JavaScript 基本很像。

Sahi 操作的代碼聲明是一句以分號結(jié)尾的普通代碼行,如:

_click(_link("Login"));

變量聲明

var$variableName =value;

或者先聲明再賦值:

var$variableName;// declaration
$variableName =value;// assignment

所有的變量都是以$符號開頭的,關(guān)鍵字 var 用于局部變量,如:

var$username ="SahiTestUser";
var$password;// declaration;
$password =$username +"_password";// "SahiTestUser_password"

函數(shù)聲明

// function 
declarationfunctionlogin($usr,$pwd){
_click(_link("Login"));
_setValue(_textbox("username"),$usr);
_setValue(_password("password"),$pwd);
_click(_submit("Login"));
}
// function call
login("sahi_user","secret");

在一個 Sahi 代碼文件中可以通過_include來包含調(diào)用其他 Sahi 文件,如:

_include("includes/common_functions.sah");

由上面的語法可知,Sahi 是由下劃線開頭,帶上操作或 HTML 元素,非常簡單,清晰易懂,這些 API 基本都是能夠看字面就能理解它的功能。

Sahi 的 API 主要可以分為 3 類:瀏覽器訪問 API瀏覽器操作 API混合 API。

瀏覽器訪問 API:用于訪問瀏覽器上的元素,并通過代理來注入這些 API 到瀏覽器中去。

瀏覽器操作 API:主要來執(zhí)行一些如點(diǎn)擊、輸入數(shù)據(jù)等操作,并在瀏覽器上聲明這些元素的。

混合 API:是既能在瀏覽器又能在代理上用于處理異常和操作文件和數(shù)據(jù)庫的。

由于 Sahi 對網(wǎng)頁的訪問方法的 API 很多,大家可以參考官方 API 文檔進(jìn)行學(xué)習(xí)。

由上可知,Sahi 腳本都是很直接的聲明和操作過程,在一個運(yùn)行的代理上,由 Sahi Dashboard 來管理執(zhí)行。如果我們希望能夠?qū)⑽覀兊?Sahi 自動執(zhí)行的過程與我們其他的項(xiàng)目功能模塊進(jìn)行集成,那么把這些腳本轉(zhuǎn)換成 Java 代碼,又能用獨(dú)立運(yùn)行,是一件兩全其美的事。

接下來,本文將介紹一個用 Sahi Java Driver 來編寫 Sahi 自動化腳本實(shí)現(xiàn) Web 自動化測試的簡單案例。

首先,將 Sahi 的開發(fā)庫包文件 sahi.jar 加入到 Java 項(xiàng)目中,該文件位于 Sahi 安裝路徑下..\sahi\lib\下,接下來就可以參考 Sahi 的 Java API 來開發(fā)自動化測試腳本。下面是一個簡單的案例腳本:

清單 1. 導(dǎo)入 Sahi 類包
import net.sf.sahi.client.Browser;
import net.sf.sahi.config.Configuration;

設(shè)置 sahi 安裝路徑和 userdata 路徑

清單 2. 配置 Sahi 代理
String sahiBase = "C:/Users/ADMIN/sahi/"; 
String userDataDirectory = "C:/Users/ADMIN/sahi/userdata"; 
Configuration.initJava(sahiBase, userDataDirectory);

您可以設(shè)置任意一種瀏覽器類型,也可以在 sahi/userdata/config/browser_types.xml 文件中自己創(chuàng)建定義

清單 3. 配置瀏覽器并啟動
String browserType = "firefox";
Browser browser = new Browser(browserType);
browser.open();
清單 4. 操作代碼示例
browser.navigateTo("http:///demo/training/");
browser.textbox("user").setValue("test");
browser.password("password").setValue("secret");
browser.submit("Login").click();
browser.textbox("q").setValue("2");
browser.textbox("q[1]").setValue("9");
browser.textbox("q[2]").setValue("4");
browser.button("Add").click();
System.out.println(":: browser.textbox(\"total\").value()=" + browser.
textbox("total").value()); browser.close();// close the browser

需要注意一點(diǎn),除了 Firefox 瀏覽器,其他的瀏覽器都必須進(jìn)行服務(wù)器代理配置,并在運(yùn)行腳本前打開 Sahi 代理服務(wù)。

實(shí)際測試結(jié)果表明,Sahi 代碼簡介,運(yùn)行輕巧快速,而且它還能與外置的一些模塊集成完成發(fā)送郵件,讀取 PDF 文件等操作,功能非常完善。

回頁首

結(jié)束語

綜上所述,本文從當(dāng)前 Web 自動化測試的困境出發(fā),通過與其他開源 Web 自動化測試進(jìn)行對比,介紹了 Sahi 的特性和優(yōu)勢。主要從基于上下文頁面識別機(jī)制和智能頁面加載響應(yīng)等待機(jī)制兩方面進(jìn)行闡述。同時,詳細(xì)介紹了 Sahi 的工作原理以及如何安裝部署進(jìn)行自動化測試開發(fā)的過程。總之,Sahi 提供了一套在多瀏覽器和多編程語言的開源自動化測試方案,解決了當(dāng)前一些頁面元素難找,頁面響應(yīng)不同步而導(dǎo)致測試失敗的問題。Sahi 是一個能夠快速部署,易于開發(fā)并且功能強(qiáng)大的開源 Web 自動化測試工具。由于篇幅所限,本文不能對 Sahi 所有的功能進(jìn)行一一闡述,希望有興趣的朋友一起研究探討。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多