基於Sikuli GUI影像識別框架的PC客戶端自動化測試實踐
寫在前面
最近兩天,公司有個PC客戶端的測試任務,除了最基礎的功能測試外,還包括穩定性測試和兼容性測試需求。剛好去年接觸過Sikuli這款基於GUI影像識別框架的自動化測試工具,於是便應用於測試工作中,輔助測試任務。初步試用下來,總體效果還算差強人意。
一、GUI影像識別框架元祖:Sikuli
Sikuli 創始於 2009 年,是麻省理工學院用戶介面設計小組的一個開源研究項目。2012 年由 RaiMan 接管開發和 支援並將其命名為 SikuliX。 它以影像檢索技術為基礎,提供了一套基於 Jython 的腳本語言以及集成開發環境。使用者可利用螢幕截圖直接 引用 GUI 元素進行編程,完成交互操作。 Sikuli 一詞取自墨西哥的土著語,意為「上帝之眼」,寓意—— Sikuli 讓電腦能像人一樣」看」這個」真實世 界」。官網://www.sikulix.com/

SikuliX支援作為腳本語言:
- Python 語言級別 2.7(由Jython支援)
- 支援運行RobotFramework文本腳本
- Ruby 語言級別 1.9 和 2.0(由JRuby支援)
- JavaScript(受 Java 腳本引擎支援)
SikuliX的常見用途:
- 應用程式或網頁的日常自動化任務
- 玩遊戲
- IT系統和網路的管理
二、Sikuli運行原理

三、Sikuli安裝
Sikuli 支援跨平台運行,可以運行在Mac OS X、Windows 和 Linux 系統下。
下載地址://launchpad.net/sikuli/+download 或者官網://sikulix.com/
推薦安裝x1.0-rc3(需要依賴JDK1.6版本)

四、Sikuli IDE主介面基本使用
Sikuli1.x版本官方文檔://doc.sikuli.org/

1.左側為常用函數,包括查找、滑鼠動作、鍵盤動作等
2.點擊元素的圖片可以調節識別的偏移度、匹配的精度
3.sikuli腳本首次保存會提示並彈出保存路徑,可自定義保存路徑
4.腳本也可以導出為exe格式的可執行文件

- 一個腳本對應一個目錄,目錄中對應腳本中的圖標截圖、python腳本,
五、Sikuli 腳本語法
Sikuli 的腳本編寫遵循 Python 語法規範,其本身提供了多種自定義類及其自定義方法。由於 Sikuli 基於 Jython,其核心程式碼由 Java 編寫,可在用戶自定義的 Java 工程中將其作為 Java 標準類庫進行
- 定位APP窗口:myApp.window()
- 聚焦到當前APP:myApp.focus()
- 判斷元素是否存在:exists()
- 點擊某個元素或圖標:click()
- 輸入文本內容:type(“//www.baidu.com”)
- 按下鍵盤按鍵:type(Key.ENTER) 按鍵名要大寫
六、Sikuli 應用示例
PC客戶端的自動循環發送消息的腳本示例:
import time
import random
myApp=App("yueyun-im") # 聲明APP實例
if not myApp.window(): # 判斷當前是否處於APP窗口
openApp("D:\\yueyun-im\\yueyun-im.exe") # 如果不處於APP窗口,則打開指定位置EXE
myApp.focus() # 聚焦於APP
if exists("K7iX.png"): # 判斷圖標是否存在
click("K7iX.png") # 點擊指定圖標按鈕
if not exists("1655945972853.png"):
click("1655946081065.png")
click("1655945972853.png")
#while 'p' in 'python':
for i in range(10):
type("TEST-SIKULI-MSG-"+str(i))
time.sleep(0.2) # 休眠3秒
#click("1655946081065.png")
type(Key.ENTER) # 按下鍵盤的ENTER鍵,按鍵名要大寫
type(Key.ENTER)
myApp.close() # 關閉APP
七、Sikuli 優勢及局限
1.優勢
① 學習成本低,只需掌握簡單的python語法就能快速上手;
② 無需關注元素有哪些屬性,所見即所得;
③ 適合非標準控制項等自定義介面的定位,如遊戲介面;
④ 支援跨平台,支援Windows、Linux、macOS;
2.局限
① 基於影像識別,圖片的大小、解析度、色彩都會對識別造成影響,定位不能百分百準確地識別到元素;
② 只能定位當前正在操作的窗口介面;
③ 若流程過長,則會造成腳本過於臃腫;
④ 圖片存在相似度,會對識別造成影響,需要手動一一調整圖片的精度;
Sikuli 使用小結
- 儘管sikuli用來實現複雜的測試場景不太現實,這也是所有GUI自動化測試無法改變的現實。但用來做一些特定場景的測試還是遊刃有餘,比如:
① 循環、持續發送消息,7*24h運行,以檢測程式運行穩定性;
② 持續發送圖片或影片文件,以檢測程式的連續上傳、下載文件的穩定性;
③ 在不同的PC系統版本上運行,以檢測程式的兼容性;
- 對於web自動化、APP自動化主要用該端特定的自動化框架,如selenium、appium,sikuli作為輔助、可以和selenium等結合使用;
- 對於特定的、複雜的場景,如遊戲介面、flash應用等難以識別到元素的應用介面,可以使用sikuli;
- 今天在測試場景②的過程中也發現了一個bug:【當前聊天窗口,連續下載圖片過程中,程式閃退】。雖然硬說是sikuli測出來的bug有些牽強,但本身自動化測試也不是用來發現bug的,sikuli也算是出了很大一份力。只要能合理地利用,任何不起眼的工具都可以發揮它的價值!
更多實用乾貨,同步首發於微信公眾號【測試開發實戰】,歡迎關注!