引言
在 GUI 測試中,識別個性化控件、模擬用戶行為及對校驗屏幕顯示結果常常成為自動化測試的瓶頸,此類測試場景大多數情況下仍然依賴于手工測試。本文介紹一種新興的圖形化編程技術 Sikuli,它擺脫了對控件 API 的依賴,通過當前屏幕的實時圖像檢索獲取操作對象,模擬用戶行為,匹配屏幕區域以校驗真實的視覺顯示結果。文中將通過其在 GUI 自動化測試中的實際應用分析及程序示例,闡述其帶來的應用思路。
回頁首
Sikuli 是什么
Sikuli 是由 MIT 的研究團隊發布的新型圖形化編程技術。它以圖像檢索技術為基礎,提供了一套基于 Jython 的腳本語言以及集成開發環境。使用者可利用屏幕截圖直接引用 GUI 元素進行編程,完成交互操作。Sikuli 一詞取自墨西哥 Huichol Indian 土著語,意為“上帝之眼”,正如其開發者張琮翔所說—— Sikuli 讓電腦能像人一樣“看”這個“真實世界”。
回頁首
Sikuli 的安裝與 IDE 使用
目前 Sikuli 的最新版本為 Sikuli X-1.0rc2。在其 官方網站下載區可獲得為 Mac OS X、Windows 和 Linux 操作系統所提供的安裝文件及安裝方法簡介。
需注意的是,在 Windows 平臺下,要求有 Java 6 的運行環境支持,若要正常使用 1.0rc2 版本中新增的擴展組件 Sikuli Guide,還需更新 Java 至當前最新版本。在 Linux 平臺上,除了要安裝 Java6 的運行環境之外,還需安裝 wmctl 和 opencv2.0 的 libcv4, libcvaux4, libhighgui4 包。
Sikuli 提供了一個簡易的腳本開發環境。缺省界面由菜單欄、工具欄、側邊欄、編輯區、控制臺和狀態欄六部分組成,如圖 1 所示。
圖 1. Sikuli-IDE 界面組成
工具欄中提供了兩組共計 5 個常用工具按鈕及文本搜索框:
左側側邊欄中分類列出了部分常用函數,點擊函數名可快速將其插入到編輯區,若該函數需截圖作為參數,則自動轉入屏幕截圖狀態。下方的狀態欄可用于查看當前行號,與行首 Tab 縮進的層級 ( 列號 )。
回頁首
Sikuli 腳本
Sikuli 的腳本編寫遵循 Python 語法規范,其本身提供了多種自定義類及其自定義方法,其詳細介紹可參見其 官方網站文檔。由于 Sikuli 基于 Jython,其核心代碼由 Java 編寫,可在用戶自定義的 Java 工程中將其作為 Java 標準類庫進行引用,其官方網站亦提供了 JavaDoc供參考。
這里先通過一個自動打開 Firefox 瀏覽器,并登錄 Gmail 的簡單實例來快速一覽 Sikuli 腳本的獨特之處。
圖 2. 自動登錄 Gmail
上圖所示的 Sikuli 腳本首先單擊展開開始菜單,接著單擊 Firefox 圖標啟動瀏覽器。待 Firefox 的工具欄出現后,以工具欄位置為基準,向右偏移 300 的距離以定位到地址欄并鼠標單擊將光標置入地址欄,然后在地址欄中輸入 gmail 網址。待登錄界面出現,單擊用戶名輸入框并輸入用戶名信息,然后鍵入 Tab 鍵,使密碼輸入框獲得焦點并輸入密碼信息,最后單擊 Sign in 按鈕完成登錄。
從該示例腳本中不難發現 Sikuli 最顯著的特色——將 GUI 對象的屏幕截圖作為函數的參數直接引用,整個代碼的語義清晰明了,可讀性極強。腳本執行過程中,利用圖像檢索算法分析匹配當前屏幕中對應的控件,并對其應用相應的鼠標或鍵盤操作。這種方式使得我們在腳本編寫時,既無需關心繁瑣的應用程序相關 API 亦不用獲取 Web 內容對象。
編輯完成的 Sikuli 腳本可通過 File -> Save 進行保存。在 Windows 平臺上將保存為一個后綴為 .sikuli 的文件夾,其中包括腳本中所使用到的所有 PNG 圖片、.py 后綴的源代碼以及一份顯示源碼的 HTML 文件。
編寫調試完成的 Sikuli 腳本最終可通過菜單 File->Export executable 生成以 .skl 為后綴的可執行文件。生成這種格式的可執行文件后,使用命令行工具或直接雙擊該文件即可便捷地運行該腳本了。
回頁首
Sikuli 的應用實例
Sikuli 的出現,給 GUI 自動化測試提供了新的思路。通常情況下針對 GUI 的自動化測試多通過其 API 識別并獲取 GUI 對象,進而對其進行操作;對于 GUI 顯示的校驗則通過指定其在屏幕上的絕對位置坐標并匹配對應位置上的實際像素來完成。前者精準但復雜度相對較高,其局限在于需要了解 GUI 內部的代碼實現,依賴于 API 的開放性,所要驗證的對象未必能夠被成功獲取;后者則對 GUI 元素本身的絕對位置有著嚴格的要求,缺乏靈活度和對 GUI 位移的包容能力,一個細微的對象位置變化即可能嚴重影響校驗的結果,但在實際應用場景下,GUI 對象大小、位置變化和 UI 的重排的情況較為常見,使得這種驗證方式的穩定性和可靠性隨之降低。而 Sikuli 的工作方式完全契合了這兩類場景下的需求,可大幅地簡化操作和驗證過程。接下來通過幾個實例來展示如何在一些典型用例中使用 Sikuli 快速完成 GUI 自動化。
原文轉自:http://www.ibm.com/developerworks/cn/opensource/os-cn-sikuli/