文章程式碼顯示

2018年6月30日 星期六

Sikuli 使用 - 重點教學

因網上已經有部分人有做教學了( Sikuli 已經出了五年以上,只是我到現在才發現這有趣的玩意兒) ,我就做重點教學的部分

因 Sikuli 的基底是 python ,在本文中若有使用到 python 語法的部分將不詳細解釋,可以至本 Blog 的 Python 部分查找,連結在此


1. 找到畫面中的某張圖片並將滑鼠移至圖片

使用 : find + hover

舉例來說我的桌面長這個樣子,我要找到桌面中的壓縮檔圖示並將滑鼠移動至上方





補充說明 Show & Show in 作用 :

這兩個按鈕可以讓你"預先"知道這行程式碼會找到畫面中的哪個圖示

Show 用法 : 將游標移動到程式中的第一行(也就是在 x = find() .. 閃爍),並且按下工具列的 Show



你就會看到桌面的壓縮檔圖示被閃爍的紅框框起來

Show in 用法 : 將桌面的壓縮檔複製一個(也就是現在桌面出現兩個壓縮檔圖示),此時程式很難去判定你要指定的是哪一個,按下 Show 後它還是會幫你隨便找其中一個並框起來。此時可以試試按 Show in 指定一個區域(Region) ,它就會在那個指定的區域中去尋找。至於在程式中要怎樣指定一個區域,請參考下方

2. 找到畫面中指定區域的某張圖片並將滑鼠移至圖片

使用 :  find + Region + hover

由我桌面的圖示可以看出我的文字檔 *.txt 有很多個,如果我想要選擇在某個限定區域內的文字檔我可讓 Find 搭配使用 Region ,就可以找到指定區域內的指定圖片



用 "點" 串聯起來,表示 x 要從某個 Region ( 圖示被標示為紅色框框的地方,也就是我桌面的下半部分) 去尋找某個圖示




3. 從畫面中某張圖片的 "上方區域" ,查找圖片並將滑鼠移至該圖片

使用 : find + above() + hover



有時候我們想要點選的圖片不適合先用一個 Region 去指定搜索範圍,但這個圖片是具有相對位置的(常見的是點選網頁中的方框選項)。這時我們可以用上方的程式語句來實現藉由圖片1 來找 圖片2

above() 代表從壓縮檔圖示的上方尋找文字檔圖示

其它可以代換的還有 below()、left()、right()

其中小括號內是可以輸入數字的,代表的是

above(dy)
" Get a new location which is dy pixels vertically above the current location. "

也就是從圖片1的位置往上 dy 個 pixels 的區域去找圖2

4. 找到畫面中的某張圖片並將滑鼠移至圖片,並點擊

使用 : click

前面都只是找到圖片並將滑鼠移至上方,而 click 則是找到圖片後將滑鼠移到上方"並且點擊"(雙擊是使用 doubleClick)



5. 找到畫面中的某張圖片並將滑鼠移至圖片,並"偏移"點擊

使用 : click + 設定目標位置偏移



有時候我們找到圖片後想要它點擊圖片中的某個"位置"(例如我要點在資源回收桶的"回"字上面),此時點擊程式碼中的



圖示,會進入以下介面,點擊上方的 "目標位置偏移"



本來十字圖標是在紅框的正中間(此紅框是由 Sikuli 產生,不是我自己畫的) ,我將它移動到旁邊的 Chorme 圖示上面

並且點擊 Apply 後再按確定

這樣一來當我執行程式後, Sikuli 會去找到資源回收桶的圖片,並且從該圖片往右偏移並雙擊滑鼠。

Hint : 這是屬於"座標位置"偏移點擊,也就是說 Sikuli 會去計算找到資源回收桶圖片後要將滑鼠偏移多少後搭配 doubleClick() 函式去雙擊滑鼠。如果你將資源回收桶右邊的 Chorme 換成了別的東西(例如一個 *.txt 檔),當 Sikuli 程式找到資源回收桶的圖片後依舊會去點開這個 *.txt 檔案。

6. 如果某張圖片存在,才點擊圖片(避免若使用 click ,但畫面中沒該圖片會導致程式整個退出的缺點)

使用 : if + exists + click

此處用到了 python 的 if 判斷式,若有找到該圖片的話就點擊該圖片兩下
後方的 10 代表 10 秒 ,如果程式在 10 秒鐘之內都沒有抓到這張圖片在畫面中就會放棄點擊該圖片。




為什麼要額外去判斷圖片有沒有出現在畫面中再使用 doubleClick 去點擊呢?

原因在於如果我們沒有先對圖片進行判斷,而是單純就使用 doubleClick 去找圖片並且點擊的話,若該圖片沒有在畫面中(或沒有被 Sikuli 找到)則程式會發出錯誤(如下圖)並且產生 error



7. 滑鼠操作(移動、點擊)

Sikuli 滑鼠操作的說明文件

使用 :

(1) 滑鼠左鍵單擊 click() 、滑鼠左鍵雙擊 doubleClick() 、滑鼠右鍵單擊 rightClick()

(2) 滑鼠按下 mouseDown(button) 、滑鼠放開 mouseUp(button)、滑鼠移動 mouseMove(position) or hover(position)

    上述的 button 可以填入 左鍵 Button.LEFT、中鍵 Button.MIDDLE、右鍵 Button.RIGHT 三種選擇


(圖 7.1 )

(3) 取得滑鼠當前位置座標 Env.getMouseLocation()、獲得圖片的 x 座標 圖片.x 、獲得圖片的 y 座標 圖片.y 、 Location ( x,y ) 表示座標點 (x,y)


圖(7.2)



8. 圖片拖拉、使用"相對座標"拖拉

使用 : drapdrop + find + Location

一口氣實現 圖(7.1) 程式碼所做的事


drapDrop 事實上兩個輸入變數(圖片) 亦可以替換成座標點,例如



Location 的用法在 圖(7.2) 程式碼中已經有說明。而在此的意思為將 B1 圖片往 "上" 拖曳 200 個 pixels

至於為什麼 B1.y -200 是往 "上" 200 而不是往 "下" 呢?

這牽扯到座標系的問題,在 Sikuli 中 x 與 y 的座標系如下圖



簡單的來說在 Sikuli 中對於座標的描述, Y 軸向下才是正的(這樣的座標系在電腦中被廣為使用)

9. 鍵盤操作(找到指定框格後在框格內打字)

使用 : type( 圖片 , text )

使用奇摩首頁來示範




執行後得到


10. 鍵盤操作(按鍵、組合鍵、打字)

Sikuli 針對鍵盤操作的說明文件

對於按鍵部分,可以使用 type()、keyDown()、keyUp() 來進行操作

作用 :

(1) 最簡單的是直接使用 type( "字串" ) 來輸入一連串的文字,並且可以用 \t \n 等特殊字元來代替 TAB 鍵或 ENTER 鍵(使用 Key.TAB 或 Key.ENTER)。使用加號可以代表一連串的打字(敲擊)動作


執行結果


除了 TAB、ENTER 外還有

ESC、BACKSPACE、DELETE、INSERT、SPACE、
F1、 F2、 F3、 F4、 F5、 F6、 F7、 F8、 F9、 F10、 F11、 F12、 F13、 F14、 F15、
HOME、 END、 LEFT、 RIGHT、 DOWN、 UP、
PAGE_DOWN、 PAGE_UP、PRINTSCREEN、 PAUSE、
CAPS_LOCK、 SCROLL_LOCK、 NUM_LOCK、
NUM0NUM1NUM2NUM3NUM4NUM5NUM6NUM7NUM8NUM9SEPARATORADDMINUSMULTIPLYDIVIDEALTCMDCTRLMETASHIFTWIN

Hint : 記得這些關鍵字前面都需要加上 " key. " 。 其中 META 這詞在 Windows 系統代表 WIN 鍵;在 MAC 系統代表 CMD (推測是為了方便讓程式在 Windows 及 MAC 系統下不需要進行修改)

Hint2 : 我實際使用 KeyDown() 發現效果好像沒有出來,不知道是不是 BUG。但可以用 while 配合 type 來代替這個功能例如


可以實現在網頁中往下捲動,找到指定圖片後就停止的功能(範例網頁)


Hint3 : 在官方文件中有提及可以使用 Env.isLockOn(Key.Caps_LOCK) 來偵測 Caps_LOCK 目前是 Turn ON/OFF 。但我實測後發現使用這條語句後程式只要一執行就會直接閃退。

(2) 組合鍵



Hint
1) 要先按的要放在後面( type() 的第二個輸入變數 )
2) 有英文字母時,要用小寫


12. 等待指定圖片出現

使用 : wait

同樣以奇摩首頁做範例網頁


上方程式碼中使用 wait( 圖片, 秒數)
也就是說我們點擊奇摩首頁後的"拍賣"字眼後,要等到網頁跳出可以輸入商品關鍵字的字眼
若不加入 wait 語句而直接使用第五行的 type 語句的話, Sikuli 有可能會發生找不到該圖片而產生錯誤的情況發生

wait 中的數字 10 代表僅給 10 秒鐘的時間讓畫面跳出輸入商品關鍵字的圖片,若超過 10 秒還是沒找到,則 Sikuli 就會報錯,強制結束程式運行

在 Sikuli 有任何 "尋找圖片" 或是 "點擊" 等等的作為時,最好都在下方一行加入 wait(1) ,也就是讓程式停在這裡一秒鐘,可以有效的增加程式的穩定性。


13. 等待指定圖片消失

使用 : waitVanish

有時我們不是希望要如第 12 點 "等待某張圖片出現" 的功能,反而是 "等待某張圖片消失的功能",此時用到 waitVanish


同樣的 waitVanish 的數字 10 亦為 "最多給10秒鐘等待該圖片消失"

14. 找到所有在畫面中的某圖片(用於多框點選)

使用 : findAll


在選項點選時,很容易遇到這種需要多項點選的情況,此時可以使用 findAll
findAll 會把畫面上所有 "未被點選的選擇框" 找出來,並且以 "列表" 的方式存在變數 X 之中
接著我們就只需要利用 for 迴圈就可以把所有選擇框進行點選了




Hint : "未被選擇的選擇框"跟"已被選擇的選擇框" 在 Sikuli 中需要調高相似度程度才能被正確的識別出來


15. 自行創立 Function 以及說明 Region 亦可以為 function 的輸入變數



16. Function HotKey




參考連結

sikuli入门到进阶
sikuli官网自动汉化文档
【图形化编程软件】 sikuli常用函数、简单事件操作 键盘操作 个人总结笔记
Sikuli_API手册_中文版
Sikuli - Global Functions and Features
python执行定时任务
sikuli官网自动汉化文档
Python 3.1 快速導覽 - 例外處理 try-except陳述
sikuli函数、简单事件操作个人总结笔记
Sikuli - 官方指令集索引
UI 自動化測試使用 Sikuli 操作介紹 Part 1 – 入門介紹
UI 自動化測試使用 Sikuli 操作介紹 Part 2 – 流程控制與基本操作
[UI Automation] Sikuli 的入門使用
SikuliX IDE 安裝與簡易使用
相見恨晚的自動化測試開發工具 Sikuli
Mac: how to use addHotkey() and use it without modifier key

Youtube
SikuliX Tutorial #3 - Conditional Automation
SikuliX Tutorial #4 - Conditional Looping
Sikuli: Using GUI Screenshots for Search and Automation
Get mouse location sikuli python programming
Sikuli: optimizando nuestros scripts | Kohrak Scripts 2

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引