以下內容均來譯自 SikuliX ,以官網爲準,此篇內容爲個人學習的記錄與分享。
SikuliX允許自動化可視化工作流程(visual workflow)
就像我們每天坐在電腦前做的那樣:
- List item
- 我們想要實現一些目標
- 我們使用一個應用程序(例如瀏覽器訪問Web內容)
- 我們點擊一些按鈕,鏈接或其他頁面
- 我們等待應用程序做出反應並在屏幕上顯示預期結果
- 我們在某處填寫一些文字並按下一些功能鍵,如TAB或ENTER
- 我們再等待一些預期的反應或結果
- 我們點擊…
- 我們等 …
- 我們打字/輸入…
- 我們等 …
- 我們…
- …
我們稱之爲可視化工作流(visual workflow)。
每個人都或多或少地重複這些工作流中的一些,我們不時地問自己:這可以實現自動化操作嗎?
有很多工具可以用於這樣的工作流程自動化,並且曾經在這個領域做過一些實驗/探索的人將會獲得他的經驗,並可能擁有最喜歡的自動化工具。
主要有3類工具:
- 錄製(Recorder) 當您手動操作工作流程時,記錄器會跟蹤您的鼠標和鍵盤操作。 停止錄製後,您可以播放(自動運行您的工作流)。 通常可以使用其他工具對錄製內容進行編輯和擴充。
- 界面識別(GUI aware) GUI識別工具允許以編程方式對GUI元素(如按鈕)進行操作。這是基於對GUI元素及其特性的內部結構和名稱的瞭解。其中一些工具還具有錄製功能。(這裏說的比如最流行的Selenium)
- 可視化(Visually) 在視覺上,該工具可以“看到”屏幕上的圖像(通常是矩形像素區域),並允許用戶使用鼠標和鍵盤模擬對這些圖像進行操作。使用這樣的工具可能還會有一些錄製功能。
SikuliX屬於第3類,目前沒有錄製功能。 在完成工作流程的同時,您可以捕獲一些圖像,這些圖像是您想要操作的,或者是您希望在操作後顯示的圖像。 這些圖像由單擊和輸入操作使用,或用於等待屏幕,爲下一個操作做好準備。
SikuliX是一個WYSIWYS工具:你看到的就是你的腳本(What You See Is What You Script.)。
- 所以再次採用上述工作流程,現在使用SikuliX命令:
- openApp(someApp) #我們使用某個應用程序
- click(imageButton) #我們點擊一些按鈕
- wait(imageExpected1) #我們等待應用程序做出反應並在屏幕上顯示預期結果
- type(“some text”); type(Key.ENTER) #我們填寫一些文字,然後按ENTER鍵
- wait(imageExpected2) # 再次等待一些預期的反應或結果
- click(…) #我們點擊 …
- wait(…) #我們等待 …
- type(…) #輸入 …
- wait(…) #等待 …
使用SikuliX IDE,您可以設置和維護上述這類可視化工作流程,包括捕獲和組織所需的圖像。 除了解基本命令的選項外,您不需要任何編程或腳本知識。 現在,您若是想優化、重複或擴充增強這樣一個基本的線性工作流程,您必須深入瞭解您選擇的腳本語言(在IDE中支持:Python,Ruby,JavaScript)。
SikuliX可以用於視覺測試
在軟件測試中,人們使用工具來檢查由某些工作流驅動的應用程序是否顯示了預期的結果。由於應用程序具有視覺上覆雜的GUI,測試人員遲早會想要根據他們的期望檢查一些視覺內容。這可能是屏幕上GUI元素的呈現或屏幕某些部分的可視內容。
SikuliX可以以各種方式集成到這樣的測試環境中,無論是在腳本級別還是使用基於Java API(實現SikuliX功能的部分)。這種方法的突出例子是RobotFramework或Cucumber。
此外,GUI識別工具和SikuliX的組合已經成爲現實(例如,web應用程序的Selenium)。
這裏的挑戰通常是,SikuliX基於圖像的特性在某種意義上是像素感知的,屏幕上的圖像完全是像素感知的,或者SikuliX失敗了(只要像素的寬度和高度匹配,就會有一些細微的偏差)。這通常導致需要爲不同的環境提供不同的圖像集。版本2將有更多的特性,這將使處理此類情況更加容易。
對測試人員來說,很重要的方面:
- SikuliX需要一個真實的屏幕來運行被測試的應用程序或至少一些等效的虛擬解決方案。(需要操作或是識別的圖片必須出現在屏幕上,肉眼可見)
- SikuliX僅適用於運行Windows,Mac或Linux並具有Java 6以上的PC /工作站。
如何在屏幕上找到圖像?
SikuliX使用OpenCV包在屏幕上查找圖像。
SikuliX特性基於OpenCV的方法matchTemplate(),本例頁面對此進行了很好的解釋。如果你不熟悉它是如何工作的,你應該看看那裏,然後再回到這裏進一步閱讀。
Sikulix的一個基本功能是等待圖像出現在給定的區域:
# 屏幕的左上角
aRegion = Region(0, 0, 500, 500)
# png圖像文件
# 這是我們想要在給定區域內尋找的圖像
aImage = “someImage.png”
# 搜索並得到結果
aMatch = aRegion.find(aImage)
爲了不把它弄得太複雜,我不討論如何創建aImage—我們只是假設它在那裏並且可以訪問。
matchTemplate()需要一個指定大小或更大的基礎圖像(基礎),在其中搜索給定的目標圖像(目標)。 爲此,我們在內部對給定的aRegion定義的屏幕區域進行屏幕截圖(使用Java Robot類),這是保存到內存中的基本映像(base image)。目標圖像也被創建——從圖像文件中讀取圖像。然後,將這兩幅圖像轉換爲所需的OpenCV對象(CVMat)。
現在,我們運行matchTemplate()函數,得到一個基本圖像大小的矩陣,其中爲每個像素包含一個目標圖像的相似度評分,與該像素位置的左上角逐個像素進行比較。如果現在還不清楚,請回到上面的示例並嘗試理解。每個像素位置的得分值在0.0到1.0之間變化:值越低,該像素位置左上角開始區域包含目標圖像的概率越低。得分值在0.7 - 0.8以上的信號概率很高,說明圖像在這裏。
在下一步中,我們使用另一個OpenCV方法,從提到的結果矩陣中獲取相關的最大值(result score),這意味着我們正在尋找一個像素,最可能的是目標圖像在基礎圖像的左上角。
如果沒有其他說明,則只將結果分數> 0.7視爲找到。其他值將發出FindFailed異常的信號。根據目標圖像的各個方面(主要是目標圖像中包含多少對邊緣的均勻背景),通常會得到> 0.8甚至0.9的結果。如果按照SikuliX的建議創建目標圖像,那麼在大多數情況下應該會得到>0.95甚至>0.99的結果分數(從內部來看與1.0完全匹配)。
sikuli函數、簡單事件操作個人總結筆記
參照另外一位大神的博客,你會得到更多。
https://blog.csdn.net/airfer/article/details/47726939