基於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也算是出了很大一份力。只要能合理地利用,任何不起眼的工具都可以發揮它的價值!

更多實用乾貨,同步首發於微信公眾號【測試開發實戰】,歡迎關注!