Sahi 是 Tyto Software 旗下的一個基於業務的開源 Web 應用自動化測試工具。Sahi 運行爲一個代理服務器,並經過注入 JavaScript 來訪問 Web 頁面中的元素。Sahi 支持 HTTPS 而且獨立於 Web 站點,簡單小巧卻功能強大。它相對於 Selenium 等自動化測試工具,在動態 ID 元素查找和隱式頁面等待處理等方面具備必定的優點。選擇 Sahi 工具來實現具體 Web 項目的自動化測試是一個很不錯的選擇。html
Web 測試背景java
隨着 Web 技術和互聯網的發展,Web 應用產品愈來愈豐富,基於 Web 頁面測試的需求與日俱增。在當前全球軟件都在追求高效、敏捷的開發模式的大背景下,Web 自動化測試成爲了新一波技術探討和研究的熱潮。由於傳統的手工測試不只效率低,而且測試質量受限於測試人員的一些情緒和心情。若當一個測試人員帶着煩躁情緒來測這些繁雜的大量重複性工做,測試的質量使人擔心。更況且,當這項測試工做涉及到全球化方面的測試時,多語言版本的測試工做致使該測試工做量的成倍增長,這無疑是一項巨大的考驗!web
當說起面向 Web 的自動化測試,相信許多讀者會想到或者說使用過 Selenium、Watir 等工具,而對於 Sahi 就可能比較陌生。首先,讓咱們先來了解下 Sahi 工具。它是一款印度公司 Tyto Software 開發的成熟的開源 Web 自動化測試工具。Sahi 簡單易用,能良好支持 Ajax 和 Web2.0 技術,同時適用於敏捷和傳統的不一樣測試模式。那麼,它與其餘很是流行的 Web 自動化測試工具備哪些不一樣和優點呢?讓咱們將其與主流自動化測試工具 Selenium 和 Watir 來進行一番對比,請參考圖 1:正則表達式
從上圖的對比能夠看出,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 顯示的 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 就是先用其自帶的錄製工具,把大體的操做過程錄製下來,並用 Sahi 代碼記錄下整個操做過程。隨後,將自動生成的代碼進一步的精煉和開發,調用一些外部 API 或編寫特定代碼來實現特定的操做。最後,用 Sahi 來回放保存好的最終腳本,Sahi 就將自動對 Web 應用進行定義好的測試操做。
下面,本文將對這三個過程進行詳細說明。
Sahi 是經過運行爲一個代理服務器,並經過設置瀏覽器代理爲 Sahi 服務器。這樣 Sahi 的腳本就可以經過 request 請求來注入到 JavaScript 裏以訪問 Web 頁面中的元素。如圖,能夠很清晰的看到,Sahi 就是 Web 瀏覽器和 Web 服務器之間的一箇中間代理。
錄製的腳本都是指定元素並惟一操做的,這時就須要對代碼進行重構,抽取出核心的功能塊,對其中的元素進行參數化處理,以實現重用。這樣的數據能夠從外部的 DB 或文件中讀取而來。與此同時,也可調用 Sahi API 或外部 Java 等 API 實現特定的一些功能。
Sahi 運行提煉好的腳原本自動化測試操做,並生成測試報告。
Sahi 雖然是 Tyto 公司的產品,但它的下載放在世界上最大的開源軟件開發網站 SourceForge 上,能夠經過點擊這裏下載。
默認推薦是下載 install_sahi_xxx.jar,這是一個可執行文件,包含了 Sahi 的安裝器和 Sahi 工具及其源代碼。固然您也能夠點擊上圖紅框處「Browse All Files」來選擇歷史版本和一些免安裝壓縮文件。好比,選擇只包含 Sahi 工具的 sahi_xxx.zip 文件,或者包含了 Sahi 和源代碼的免安裝壓縮包文 件sahi-src_xxx.zip。
通常建議選擇推薦的 Sahi 安裝包文件便可,這樣能夠免去一些設置操做,並能夠選擇是否安裝源代碼。雙擊 jar 文件進行安裝,如圖:
安裝過程很是簡單,待安裝完成後雙擊桌面圖標打開 Sahi 程序。打開程序先會出現一個 Sahi Dashboard,它能自動開啓 Sahi 代理服務來啓動瀏覽器,而不須要繁瑣的代理服務器設置操做。固然若有須要,您也能夠手動修改這些代理設置。
Sahi 會自動去偵探您系統裏安裝的一些瀏覽器,並在 Sahi Dashboard 上顯示出來,若是發現有一些其餘的瀏覽器未被準確偵探出來,您也能夠點擊下面的「Configure」來進行配置添加進來。
接下來,經過點擊 Sahi Dashboard 上的瀏覽器圖標按鈕來啓動相應瀏覽器。
您能夠輸入起始測試的網頁 URL 開始您的測試。若是測試的目標 URL 是 HTTPS 協議的,也能夠點擊「SSL Manager」來查看和管理 SSL 證書。
按住 Alt 鍵並雙擊頁面,將彈出 Sahi 控制窗口,如圖 12:
這個窗口至關於 Sahi 的主控臺,在這裏咱們能夠來錄製和回放 Sahi 腳本,並編輯和管理腳本信息。
在 Record 視圖界面,輸入一個腳本名稱,點擊「Record」,這時 Sahi 錄製器便開始工做了。把鼠標移到瀏覽器上的目標網頁上,您的全部操做過程都將被記錄下來。您也能夠自定義增長一個 Assertion。按住 Ctrl 鍵,把鼠標移動到目標網頁的任意一個 HTML 元素,那麼這個 Accessor 會自動出如今 Sahi 控制器中。這時,即可以自定製對該元素的操做。經常使用的操做有「點擊」,「高亮」,「賦值等。同時,您能夠經過「Append to Script」按鈕來加到腳本代碼中。錄製完成後按「Stop」來結束整個過程。
圖 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 的命令行中輸出。
回放的時候,只須要在 Sahi 控制檯上切換到「Playback」tab 頁面,找到腳本存放的路徑,下面就有開始、暫停和結束等按鈕來進行操做。須要注意的是,開始之前必須給它設置一個「Stat URL」不然沒法回放腳本。腳本回放的時候,在「Statements」裏能夠看到腳本運行的日誌,好比操做步驟和一些錯誤信息等。
經過點擊右下角的「View Logs」能夠查看詳細的 Sahi 運行日誌報告:
由圖可見,這樣自動錄製生成的腳本代碼都是 Sahi 代碼,咱們能夠在實際的 Java 項目中調用這些 Sahi 代碼,以實現重用。其實,咱們能夠經過打開 sahi/config/sahi.properties 文件將其中屬性設置爲 controller.mode=java 來實現自動錄製腳本的語言爲 Java。值得注意的是,改成 Java 語言錄製後的 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 來開發自動化測試腳本。下面是一個簡單的案例腳本:
import net.sf.sahi.client.Browser; import net.sf.sahi.config.Configuration;
設置 sahi 安裝路徑和 userdata 路徑
String sahiBase = "C:/Users/ADMIN/sahi/"; String userDataDirectory = "C:/Users/ADMIN/sahi/userdata"; Configuration.initJava(sahiBase, userDataDirectory);
您能夠設置任意一種瀏覽器類型,也能夠在 sahi/userdata/config/browser_types.xml 文件中本身建立定義
String browserType = "firefox"; Browser browser = new Browser(browserType); browser.open();
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/