標籤:適用於 from das ssl 輸入資料 開源 recording 程式碼範例 建立
Sahi 是 Tyto Software 旗下的一個基於業務的開源 Web 應用程式自動化測試載入器。Sahi 運行為一個Proxy 伺服器,並通過注入 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”等屬性,這些都是頁面可見的屬性,所見即所得 (WYSIWYG)。同時,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 參數都支援Regex,例如,_div(/name.*/) 用來識別所有以某種預屬性值是 name 開頭的 div。
隱式頁面載入響應等待機制:
現在越來越多的 Web 應用程式採用 Ajax 的應用技術,來支援網頁資料的非同步請求響應。當前一般的 Web 自動化測試載入器沒有一個智能的處理機制,來判斷何時可以繼續下一個操作。像 Selenium 等自動化測試載入器通常會在指令碼中人為來設定一個固定的等待時間。但這往往被證實不一定是準確的。實際測試中,人是很難準確判斷每一個操作請求需要的合理時間數值。因為,等待時間設定過短,下一步操作在被測應用請求還未返回就執行了,或是由於網路因素使正常的回應時間變長,都可能導致測試過程找不到相應的頁面元素,從而導致整個測試案例失敗的情況。而如果把時間設定過長,又會造成在一些正常響應過程中的不必要等待的時間浪費,降低了測試效率。
當然,一些測試人員會在自動化測試指令碼中加入一些自訂的代碼。通過輪詢介面上某個指定元素,來判斷請求響應是否返回,進而決定繼續下一步操作或者是逾時。但是,這樣的尋找過程會導致整個指令碼代碼變得非常臃腫,加大了開發的成本。更何況,在一個動態頁面找到指定的元素本身就不是一件容易的事。
Sahi 內建了智能的頁面等待機制,能夠自動判斷 Ajax 請求是否已經處理完畢,然後繼續下一步操作。並且,這一點對於使用者是“隱式”的,不需要增加額外的代碼。
回頁首
Sahi 的工作原理:
簡單地說,用 Sahi 實現自動化測試有三步,錄製,精鍊指令碼和回放,如:
圖 3. Sahi 工作的三個主要過程
如 Sahi 就是先用其內建的錄製工具,把大致的操作過程錄製下來,並用 Sahi 代碼記錄下整個操作過程。隨後,將自動產生的程式碼進一步的精鍊和開發,調用一些外部 API 或編寫特定代碼來實現特定的操作。最後,用 Sahi 來回放儲存好的最終指令碼,Sahi 就將自動對 Web 應用程式進行定義好的測試操作。
下面,本文將對這三個過程進行詳細說明。
第一步:錄製圖 4. Recording 過程的工作原理
Sahi 是通過運行為一個Proxy 伺服器,並通過設定瀏覽器代理為 Sahi 伺服器。這樣 Sahi 的指令碼就能夠通過 request 請求來注入到 JavaScript 裡以訪問 Web 頁面中的元素。,可以很清晰的看到,Sahi 就是 網頁瀏覽器和 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 代理服務來啟動瀏覽器,而不需要繁瑣的Proxy 伺服器設定作業。當然如有需要,您也可以手動修改這些代理設定。
圖 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 calllogin("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 所有的功能進行一一闡述,希望有興趣的朋友一起研究探討。
Sahi ---實現 Web 自動化測試