差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
rf:rf:sikulilibrary [2013/03/24 22:37]
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{
行 72: 行 73:
 </​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操作流程|
行 87: 行 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]]
  
 =====    ===== =====    =====