最近,為了解放運營人力,需要對某國企的系統進行自動化操作。該系統使用的是https,需要加載證書,而且非得用IE才行,firefox無法正常的加載證書。而selenium啟動的IE是純凈的,不會加載任何東西。關於selenium如何能夠支持對https的系統進行測試,這個還需要研究。而對這個系統進行自動化操作,只是個權宜之計,所以不打算在這上面浪費過多的成本,前段時間對sikuli也做了一些了解,這回就考慮使用sikuli迅速開發一個腳本,順便進行一次實戰的檢查。
1、安裝
1)下載sikuli的IDE——sikuli X,並安裝。可在sikuli x的官網下載,戳我。
2)在PATH中添加sikuli x下libs路徑。
如果沒有設置,在運行時,會出現如下提示:Getting the VisionProxy.dll: Can not find dependent libraries
3)准備好一個32位的jre 1.7。
由於目前sikuli只支持32位的jre,如果使用64位,在運行時,會出現問題:Win32Util.dll: Can't load 32-bit .dll on a AMD 64 bit platform。
2、開發
1)在eclipse中建一個marven工程。因為最后是准備產出一個jar包來執行,所以選擇quickstart。
是否marven無所謂,只是個人習慣了而已。
2)配置依賴包
由於marven的托管庫中沒有sikuli-script,所以需要使用sikuli x中的sikuli-script.jar,加入marven的本地倉庫,或者導入build path中。
3)修改工程的jre為32位的jre 1.7。
4)開發腳本
功能:在博客園首頁右上角的找找看中輸入“你好”,然后點擊找找看,進行搜索。Java中的示例如下:
public class App { private final static String SIKULI_PIC_PATH = "C:\\Users\\shifeng\\Documents\\博客圖片\\"; private final static String SEARCH_PIC = "search.png"; public static void main( String[] args ) { Screen s = new Screen(); Pattern search = new Pattern(SIKULI_PIC_PATH + SEARCH_PIC); try { s.click(search.targetOffset(-148, 3)); s.paste("你好"); s.click(search.targetOffset(117, 3)); } catch (FindFailed e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
其實sikuli的邏輯很簡單,就是初始化一個屏幕,然后匹配圖片,對圖片區域進行操作。各種花樣就是在如何匹配和如何操作。
實戰中我碰到的有意思的事情,主要有三點:
a、如果需要指定點擊的具體坐標,需要使用click(patten.targetoffset(x, y))。
b、如果需要輸入中文,type()是沒有辦法的,需要使用paste()。
c、當無法使用pagedown或pageup按鍵滾動頁時,通過s.click(Key.TAB),即模擬tab鍵來切換控件,達到滾動的目的。
3、運行
1)打jar包。
這個比較簡單。因為我是有main函數的,所以選擇導出為Runnable JAR file,並選擇launch configuration;Library handling中,選擇第二個。
2)運行jar包
通過以下命令運行到處的jar包:
C:\jre1.7.0_21\bin\java -Dfile.encoding=utf-8 -jar test.jar
我沒有去修改java的環境變量,所以指定了java的路徑。
在命令中添加參數 -Dfile.encoding=utf-8,是因為工程的編碼格式utf-8,如果沒有指定運行時的編碼格式,會導致在sikuli錄入中文時,錄入亂碼。命令中的“-D”用來設置系統變量值。
另外在運行時,曾遇到過“找不到主清單屬性”的問題。這是由於導出時沒有指定接口類。在jar包中的META-INF中,有一個MANIFEST.MF。該文件為一個清單文件,用於記錄配置信息。按道理,eclipse導出時,是需要指定launch configuration,不應該出現這個問題。不過后來問題一直沒有復現過,所以也無法追查了。這里只是記錄下當時的處理過程。
在我的jar包中,包含如下屬性
Manifest-Version:用來定義manifest文件的版本
Rsrc-Class-Path:沒有查詢到具體的含義,但猜測用於設置依賴包的路徑
Class-Path:應用程序或者類裝載器使用該值來構建內部的類搜索路徑
Rsrc-Main-Class:指定入口類,應該是eclipse自定義的參數
Main-Class:原始的指定入口類的參數,一般用eclipse導出時,會被指定為org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
解決這個問題的方法,是在Rsrc-Main-Class添加入口類的class文件,注意不能帶.class后綴。
4、sikuli的優勢和限制
優勢
1)在web測試中,解決了selenium無法操作windows ui的問題,例如下載、上傳時選擇文件,或者不同frame中用div模擬的彈窗,識別起來麻煩得很。
2)上手非常快,也可以用sikuli的IDE開發,圖片化的方式,簡單易懂,可讀性好。
3)支持java、python等多種語言,可以和selenium無縫對接,只需導入sikuli的腳本jar包即可。
限制
1)成也圖片,敗也圖片。圖片匹配區域的大小和樣式不能有絲毫變化,所以如果屏幕分辨率、瀏覽器縮放等,導致圖片區域的大小發生變化,就不要想通用,維護起來會相當痛苦。不同的機器執行,可能得維護多套圖片。所以,還是慎用。
綜上,只有被selenium逼得實在沒招了,我才會去用sikuli。或者是為了快速開發測試用例,用於那種短平快的小項目,節約測試用例的開發成本。