使用 Sahi 實現 Web 自動化測試


Sahi 是 Tyto Software 旗下的一個基於業務的開源 Web 應用自動化測試工具。Sahi 運行為一個代理服務器,並通過注入 JavaScript 來訪問 Web 頁面中的元素。Sahi 支持 HTTPS 並且獨立於 Web 站點,簡單小巧卻功能強大。它相對於 Selenium 等自動化測試工具,在動態 ID 元素查找和隱式頁面等待處理等方面具有一定的優勢。選擇 Sahi 工具來實現具體 Web 項目的自動化測試是一個很不錯的選擇。

Web 測試背景

 

隨着 Web 技術和互聯網的發展,Web 應用產品越來越豐富,基於 Web 頁面測試的需求與日俱增。在當前全球軟件都在追求高效、敏捷的開發模式的大背景下,Web 自動化測試成為了新一波技術探討和研究的熱潮。因為傳統的手工測試不僅效率低,並且測試質量受限於測試人員的一些情緒和心情。若當一個測試人員帶着煩躁情緒來測這些繁雜的大量重復性工作,測試的質量令人擔憂。更何況,當這項測試工作涉及到全球化方面的測試時,多語言版本的測試工作導致該測試工作量的成倍增加,這無疑是一項巨大的考驗!

 

 

Sahi 的特性和優勢:

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

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

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

下面,本文將詳細介紹一下 Sahi 的幾大優勢。

基於上下文的頁面識別機制:

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

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

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

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

name 定位方式是去識別第一個匹配名稱屬性的 UI 元素。如果多個元素擁有相同的名稱屬性,可以使用 value 過濾器來進一步優化您的定位策略。例如,定位頁面元素為 username:
name=username

Xpath 定位是在 XML 中定位元素的方法,而 HTML 可以被看作是 XML 的一種實現。XPath 擴展了上面 id 和 name 定位方式,提供了絕對路徑和相當路徑兩種查找方式。

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

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

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

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

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

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

從字面意思上,我們不難理解,_in 是指在某個 DOM 節點下查找某個元素,這比 Xpath 的不管是絕對路徑或是相對路徑查找都來的靈活,不會因為 DOM 樹內部結構發生變化而導致路徑失效找不到元素的問題。

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

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

圖 2. 案例網頁
 

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

如果,我們要定位“Ruby for Rails”那一行的 text box,即_textbox("q[1]")。傳統的元素識別會遇到多個相同屬性元素的問題,即使是 Xpath 的定位方式也會因為在它前面加了一行新的數據而導致 Xpath 定位失敗的情況。

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

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

當要定位 check box 時,我們又會發現,“Ruby for Rails”這一行有“Recommend”和“Already own”兩個 check box,為了更准確地定位,我們可以結合_under,例如:_checkbox(0,_near(_cell("Ruby for Rails")),_under(_cell("Recommend")))。

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

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

隱式頁面加載響應等待機制:

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

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

Sahi 內置了智能的頁面等待機制,能夠自動判斷 Ajax 請求是否已經處理完畢,然后繼續下一步操作。並且,這一點對於用戶是“隱式”的,不需要增加額外的代碼。

 

 

Sahi 的工作原理:

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

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

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

下面,本文將對這三個過程進行詳細說明。

第一步:錄制

圖 4. Recording 過程的工作原理
 

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

第二步:精煉腳本

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

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

第三步:回放

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

Sahi 運行提煉好的腳本來自動化測試操作,並生成測試報告。

 

 

Sahi 的安裝部署與配置

Sahi 雖然是 Tyto 公司的產品,但它的下載放在世界上最大的開源軟件開發網站 SourceForge 上,可以通過點擊這里下載。

圖 7. Sahi 下載
 

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

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

圖 8. Sahi 安裝
 

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

圖 9. Sahi Dashboard 界面
 

Sahi 會自動去偵探您系統里安裝的一些瀏覽器,並在 Sahi Dashboard 上顯示出來,如果發現有一些其他的瀏覽器未被准確偵探出來,您也可以點擊下面的“Configure”來進行配置添加進來。

接下來,通過點擊 Sahi Dashboard 上的瀏覽器圖標按鈕來啟動相應瀏覽器。

圖 10. Sahi 啟動 firefox 瀏覽器
 

您可以輸入起始測試的網頁 URL 開始您的測試。如果測試的目標 URL 是 HTTPS 協議的,也可以點擊“SSL Manager”來查看和管理 SSL 證書。

圖 11. Sahi SSL 管理界面
 

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

這個窗口相當於 Sahi 的主控台,在這里我們可以來錄制和回放 Sahi 腳本,並編輯和管理腳本信息。

圖 12. Sahi Controller 錄制
 

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

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

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

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

或者您想在 Sahi 腳本代碼中調用內置的 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 頁面,找到腳本存放的路徑,下面就有開始、暫停和結束等按鈕來進行操作。需要注意的是,開始以前必須給它設置一個“Stat URL”否則無法回放腳本。腳本回放的時候,在“Statements”里可以看到腳本運行的日志,比如操作步驟和一些錯誤信息等。

通過點擊右下角的“View Logs”可以查看詳細的 Sahi 運行日志報告:

圖 15. Sahi 日志報告
 

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

 

 

Sahi 的語法與示例應用

Sahi 腳本是基於 JavaScript 的,而 Sahi 腳本是通過代理解析的,並能夠在 rhino JavaScript 引擎中有效執行的。除了變量前的強制符$,它和 JavaScript 基本很像。

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

_click(_link("Login"));

變量聲明

var$variableName =value;

或者先聲明再賦值:

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

所有的變量都是以$符號開頭的,關鍵字 var 用於局部變量,如:

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

函數聲明

// 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來包含調用其他 Sahi 文件,如:

_include("includes/common_functions.sah");

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

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

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

瀏覽器操作 API:主要來執行一些如點擊、輸入數據等操作,並在瀏覽器上聲明這些元素的。

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

由於 Sahi 對網頁的訪問方法的 API 很多,大家可以參考官方 API 文檔進行學習。

由上可知,Sahi 腳本都是很直接的聲明和操作過程,在一個運行的代理上,由 Sahi Dashboard 來管理執行。如果我們希望能夠將我們的 Sahi 自動執行的過程與我們其他的項目功能模塊進行集成,那么把這些腳本轉換成 Java 代碼,又能用獨立運行,是一件兩全其美的事。

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

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

清單 1. 導入 Sahi 類包
import net.sf.sahi.client.Browser;
import net.sf.sahi.config.Configuration;

設置 sahi 安裝路徑和 userdata 路徑

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

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

清單 3. 配置瀏覽器並啟動
String browserType = "firefox";
Browser browser = new Browser(browserType);
browser.open();
清單 4. 操作代碼示例
browser.navigateTo("http://sahi.co.in/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

需要注意一點,除了 Firefox 瀏覽器,其他的瀏覽器都必須進行服務器代理配置,並在運行腳本前打開 Sahi 代理服務。

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

 

 

結束語

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

 

【源地址】http://www.ibm.com/developerworks/cn/web/1403_yangxb_sahi/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM