差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
rf:rf:sikulilibrary [2013/03/24 22:36] tony |
rf:rf:sikulilibrary [2023/06/25 09:48] (目前版本) |
||
---|---|---|---|
行 2: | 行 2: | ||
====== RobotFramework+Sikuli(2)-Sikuli Library ====== | ====== RobotFramework+Sikuli(2)-Sikuli Library ====== | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | 之前[[rf:rf:rf_sikuli|文章]]中,介紹給大家透過Sikuli Script的方式將RobotFramework與Sikuli整合在一起的方法。這篇文章要教你另外一種透過將Sikuli API寫成RobotFramework Plugin的方式。 | + | 之前[[rf:rf:rf_sikuli|文章]]中,介紹給大家透過Sikuli Script的方式將RobotFramework與Sikuli整合在一起的方法。這篇文章要教你另外一種透過將Sikuli API寫成RobotFramework Plugin的方式。 \\ |
+ | PS: 先給大家完成品{{:rf:rf:sikulilibrary.zip|Download SikuliLibrary}} | ||
===== Plugin-Based Sikuli-Robot Integration===== | ===== Plugin-Based Sikuli-Robot Integration===== | ||
==== High Level Architecture ==== | ==== High Level Architecture ==== | ||
讓我們來看看將Sikuli做成TestLibrary整合示意圖:\\ | 讓我們來看看將Sikuli做成TestLibrary整合示意圖:\\ | ||
{{:rf:rf:rf_sikulirobot_arch.png?300|}}\\ | {{:rf:rf:rf_sikulirobot_arch.png?300|}}\\ | ||
- | 基本上就是我們需要去實做一個Sikuli的TestLibrary,我稱為SikuliLibrary,它會依靠Sikuli。實做方法據我所知有兩個,一個是依靠Sikuli自帶的sikuli-script.jar,另外一個是靠同樣SikuliLab的[[https://code.google.com/p/sikuli-api/|Sikuli API]]。由於Sikuli API已經將繁複的操作給包成API,因此我也選擇它來實做TestLibrary。 | + | 基本上就是我們需要去實做一個Sikuli的TestLibrary,我稱為SikuliLibrary,它會依靠Sikuli。實做方法據我所知有兩個,一個是依靠Sikuli自帶的sikuli-script.jar,另外一個是靠同樣SikuliLab的[[https://code.google.com/p/sikuli-api/|Sikuli API]]。由於Sikuli API已經將繁複的操作給包成API,因此我選擇它來實做TestLibrary。 |
==== Sikuli API ==== | ==== Sikuli API ==== | ||
在Sikuli API的[[https://code.google.com/p/sikuli-api/wiki/BasicUsage|官方文件]]已經有一些Sample Code教導大家如何使用,我就不贅述只做總結。 | 在Sikuli API的[[https://code.google.com/p/sikuli-api/wiki/BasicUsage|官方文件]]已經有一些Sample Code教導大家如何使用,我就不贅述只做總結。 | ||
行 16: | 行 17: | ||
* Keyboard: 提供鍵盤相關操作。 | * Keyboard: 提供鍵盤相關操作。 | ||
* Canvas: 畫布,我把它拿來Debug用。可以針對你想要的ScreenRegion做一些畫框框或印文字的動作,讓你可以知道行為操作是否正常。 | * Canvas: 畫布,我把它拿來Debug用。可以針對你想要的ScreenRegion做一些畫框框或印文字的動作,讓你可以知道行為操作是否正常。 | ||
- | 在Linux上,Sikuli API會相依於OpenCV的函式庫。我是將OpenCV 2.4版抓下來編譯後,再將那些so取來用,好讓TestLibrary可以portable。 | + | 在Linux上,Sikuli API會相依於OpenCV的函式庫。我是將OpenCV 2.4版抓下來編譯後再將那些so取來用,讓TestLibrary可以portable。 |
==== Keywords ==== | ==== Keywords ==== | ||
目前我想到的操作有: | 目前我想到的操作有: | ||
- | * Send Combo Keys: 送出組合鍵。 | + | * Send Combo Keys: 送出組合鍵。輸入值為[[http://docs.oracle.com/javase/6/docs/api/java/awt/event/KeyEvent.html|AWT KeyEvent]]名稱,例如Ctrl + Alt + D為VK_CONTROL + VK_ALT + VK_D。 |
* Type String: 輸入字串。 | * Type String: 輸入字串。 | ||
* Move Image: 移動圖片到目標位置。 | * Move Image: 移動圖片到目標位置。 | ||
* Click Image: 點擊圖片。 | * Click Image: 點擊圖片。 | ||
- | * Find All Image: 搜尋圖片出現的所有位置。這意味著圖片會顯示在多個地方。 | + | * Find All Image: 搜尋圖片出現的所有位置,這意味著圖片會顯示在多個地方。回傳結果設計為index 0代表著數量,接著都是以x與y座標為一組資料。Ex. [ 2, 100, 200, 150, 250 ]。 |
- | * Find Image: 搜尋圖片位置。 | + | * Find Image: 搜尋圖片位置。回傳結果為x與y座標,Ex. [ 150, 250 ]。 |
- | * Image Should Exist: 確認某個圖片是否純在。 | + | * Image Should Exist: 確認某個圖片是否存在。 |
* Disable Debug Mode: 取消偵錯模式。 | * Disable Debug Mode: 取消偵錯模式。 | ||
* Enable Debug Mode: 啟用偵錯模式,透過Canvas去標示出操作圖片。 | * Enable Debug Mode: 啟用偵錯模式,透過Canvas去標示出操作圖片。 | ||
行 41: | 行 42: | ||
private int mTimout = 5000; | private int mTimout = 5000; | ||
</code> | </code> | ||
- | 我以Click Image為例,我會透過mDesktopSR去搜尋圖片,如果找到它會回傳圖片的ScreenRegion,如果沒找到就回拋例外SikuliLibraryException。拋例外也會造成Keyword Failed,Robot Assertion就是透過拋例外達成。這邊也有show出Canvas的使用方式,display(3)代表顯示三秒的意思。 | + | 以Click Image為例,我會透過mDesktopSR去搜尋圖片,如果找到它會回傳圖片的ScreenRegion,如果沒找到就回拋例外SikuliLibraryException。拋例外也會造成Keyword Failed,Robot Assertion就是透過拋例外達成。這邊也有show出Canvas的使用方式,display(3)代表顯示三秒的意思。其它大同小異我就不特別說明了。 |
<code java> | <code java> | ||
public void clickImage(String aImagePath) throws SikuliLibraryException{ | public void clickImage(String aImagePath) throws SikuliLibraryException{ | ||
行 71: | 行 72: | ||
} | } | ||
</code> | </code> | ||
+ | ==== 用它吧! ==== | ||
+ | 在執行Robot的script中必須將這個類別jar檔加入classpath中,並且要設定java.library.path好讓sikuli api可以找的到這些so檔。(請自行下載sikuli api與robotframework的jar檔,opencv so檔已在先前提供的壓縮檔中) | ||
+ | <code bash> | ||
+ | #!/bin/sh | ||
+ | FULLPATH=`dirname "$0"`/`basename "$0"` | ||
+ | SHPATH=`readlink -f "$FULLPATH"` | ||
+ | BASEPATH=`dirname "$SHPATH"` | ||
+ | |||
+ | RFPATH=$BASEPATH/robotframework.jar | ||
+ | NATIVE_LIB_PATH=$BASEPATH/libs/native | ||
+ | |||
+ | CLASSPATH=$RFPATH | ||
+ | java -Djava.library.path="$NATIVE_LIB_PATH" \ | ||
+ | -cp "$CLASSPATH" org.robotframework.RobotFramework -P "$BASEPATH/libs/*" "$@" | ||
+ | </code> | ||
+ | \\ | ||
+ | 在撰寫測試案例時,必須匯入Library:\\ | ||
+ | {{:rf:rf:rf_testcases_sikulilib3.png|}}\\ | ||
+ | \\ | ||
+ | 接著就是用它拉,這個範例是送Alt+F9組合鍵縮小視窗並確認某張圖片是否存在,我將圖片放在TestSuite的相對目錄中:\\ | ||
+ | {{:rf:rf:rf_testcases_sikulilib2.png|}}\\ | ||
+ | \\ | ||
+ | 測試結果如下:\\ | ||
+ | {{:rf:rf:rf_testcases_sikulilib1.png|}}\\ | ||
+ | |||
+ | 註: 目前已知問題在Ubuntu中Enable Debug Mode會出現Error setting window transparency或The window must use a translucency-compatible graphic的錯誤,我想應該和我在VM上執行有關係吧。 | ||
===== Summary ===== | ===== Summary ===== | ||
- | Script-Based與Plugin-Based的彼此間有什麼優缺點呢? | + | Script-Based與Plugin-Based彼此間有什麼優缺點呢? |
^ ^ Script-Based ^ Plugin-Based ^ | ^ ^ Script-Based ^ Plugin-Based ^ | ||
|程式碼活動性|敗,修改維護必須透過SikuliIDE|勝,直接在Robot中透過Keyword操作流程| | |程式碼活動性|敗,修改維護必須透過SikuliIDE|勝,直接在Robot中透過Keyword操作流程| | ||
行 85: | 行 112: | ||
* [[http://docs.oracle.com/javase/6/docs/api/java/awt/event/KeyEvent.html|Java6 SDK - KeyEvent]] | * [[http://docs.oracle.com/javase/6/docs/api/java/awt/event/KeyEvent.html|Java6 SDK - KeyEvent]] | ||
* [[https://code.google.com/p/sikuli-api/wiki/BasicUsage|Sikuli API - Basic Usage]] | * [[https://code.google.com/p/sikuli-api/wiki/BasicUsage|Sikuli API - Basic Usage]] | ||
+ | * [[http://suncat6.blog95.fc2.com/blog-entry-2.html|Build OpenCV on CentOS5.8]] | ||
+ | * [[http://www0.cs.ucl.ac.uk/staff/ucacbbl/opencv-2.4.3/|OpenCV 2.4.3 FAQ]] | ||
+ | * [[http://www.pressingquestion.com/3967025/Error-In-Making-Opencv|Error in Making OpenCV]] | ||
===== ===== | ===== ===== |