sikuli的原理
調研結果
Sikuli可用于web和app的自動化測試中,操作簡單,代碼容易,但截圖過程太過繁瑣,所需要的圖片內存占用量大,且sikuli的圖片識別度較低,需對所要操作的圖片進行精準截圖。
什么是Sikuli
MIT的研究人員設計了一種新穎的圖形腳本語言Sikuli,計算機用戶只須有最基本的編程技能(比如會寫print"hello world"),他不需要去寫出一行行代碼,而是用屏幕截圖的方式,用截出來的圖形元素組合出神奇的程序。
Sikuli工作原理(以python為例):
通過sikuli IDE,可以建立sikuli腳本,其中包括Python源代碼以及所需要的截圖。Sikuli IDE執行腳本時,通過Python解析器和java庫的橋梁,核心部分解析是通過java庫實現的分兩個部分,java.awt.Robot用來傳遞鍵盤和鼠標的事件流到適當位置;給予OpenCV的C++引擎用于在屏幕內搜索制定的圖片。各部分的協調工作,最終使得sikuli腳本得以運行,如下圖:
?
?
selenium和sikuli兩者區別:
ü?Selenium的準確度更高,而sikuli對圖片的要求很高;
ü?Selenium寫好的代碼可以在任何計算機上使用,sikuli寫好的代碼僅允許在本機使用,因為圖片的識別會因為分辨率、背景顏色,圖片大小的變化而變化;
ü?Selenium運行起來較為緩慢,而sikuli代碼運行起來能很快識別出要點擊和添加的內容;
ü?Selenium中有很多元素無法獲得,如xpath和操作windows系統等,但sikuli都可以通過識別圖片從而進行操作。
編寫web自動化測試的建議:
ü?編寫自動化腳本時,若僅需要測試一小段簡單程序時,可以使用sikuli來編寫,若需要測試一個復雜的系統,則應以selenium為主,sikuli為輔(當有windows的操作時);
ü?在有上傳文件、圖片等操作的自動化測試中,用sikuli的圖片識別技術更為方便;
ü?用sikuli來編寫代碼時,所截到的圖片應該避免雷同,且盡量縮小范圍,便于執行點擊、填寫等操作時,由于范圍過大而定位錯誤;
ü?摻有sikuli jar包的代碼,運行時必須在本機使用,不得換其他計算機操作,若更換,需重新截取所操作計算機的截圖;
4.運行程序,運行結果如下圖:
?
利用sikuli對android進行自動化測試的流程
1.將得到的sikulixpai.jar導入程序中
2.導入要進行測試app的apk
3.安裝小蘿貝控機大師并關聯到手機,控機后頁面如下圖:
?
4.編寫java代碼
代碼如下:
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
?
public class SikuliTest {
@Test
?public void addContact() throws FindFailed, InterruptedException{
????????//獲得電腦桌面屏幕內容
Screen s = new Screen();
//圖片存儲路徑
String imgpath="D:\\eclipse-jee-mars-2-win32-x86_64\\Appium_demo\\pics\\";
//點擊最小化,最小化eclipse
s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Appium_demo\\pics\\min1.png");
//找到桌面上控機大師中的圖標
????s.find(imgpath+"Contect.png");
???? s.click(imgpath+"Contect.png");
???? Thread.sleep(1000);
???? s.click(imgpath+"AddContact.png");
???? Thread.sleep(1000);
???? //輸入contactname為some
???? s.type(imgpath+"Contactname.png", "some");
???? s.click(imgpath+"Contactemail.png");
???? Thread.sleep(1000);
???? s.type(imgpath+"Contactemail.png", "some@163.com");
???? Thread.sleep(5000);
???? s.click(imgpath+"save.png");
???? System.out.println("App is done!");
????}
????@After
????public void tearDown() throws Exception {
????????//driver.quit();
????}
}
使用appium編寫的測試android app腳本
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import java.io.File;
import java.net.URL;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
public class ContactsTest {
????private AppiumDriver driver;
@Before
//打開該應用,進入主界面
????public void setUp() throws Exception {
????????// set up appium
????????File classpathRoot = new File(System.getProperty("user.dir"));
????????//app路徑
????????File appDir = new File(classpathRoot, "/apps");
????????//app包
????????File app = new File(appDir, "ContactManager.apk");
????????DesiredCapabilities capabilities = new DesiredCapabilities();
????????//設置設備器件名稱
????????capabilities.setCapability("deviceName","4C3ETK1575017025");
????????capabilities.setCapability("platformVersion", "4.4");
????????capabilities.setCapability("app", app.getAbsolutePath());
????????capabilities.setCapability("appPackage", "com.example.android.contactmanager");
????????capabilities.setCapability("appActivity", ".ContactManager");
????????driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
????????System.out.println("App is launched!");
????}
@Test
//測試添加聯系人的步驟
????public void addContact(){
????????WebElement el = driver.findElement(By.name("Add Contact"));
????????el.click();
????????List<AndroidElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
????????textFieldsList.get(0).sendKeys("Some Name");
????????textFieldsList.get(2).sendKeys("Some@example.com");
????????driver.swipe(100, 500, 100, 100, 2);
????????driver.findElementByName("Save").click();
????????System.out.println("App is done!");
????}
????@After
????public void tearDown() throws Exception {
????????driver.quit();
????}
}
appiunm和sikuli兩者區別:
ü?Appium的準確度高,而sikuli對圖片的要求很高;
ü?Appium寫好的代碼可以在任何計算機上使用,sikuli寫好的代碼僅允許在本機使用,因為圖片的識別會因為分辨率、背景顏色,圖片大小的變化而變化;
ü?Appium前期的環境搭建過于繁瑣,并且運行腳本時,需要打開appium的前期步驟也比較多,sikuli僅需簡單安裝小蘿貝控機大師即可;
ü?Appium代碼中前期需要配置的參數過多,而sikuli僅需按照日常手動操作中的步驟來進行即可。
編寫android app自動化測試的建議:
ü?編寫安卓app自動化測試腳本時,若僅需要測試一小段簡單程序時,可以使用sikuli來編寫,若需要測試一個復雜的系統,則應用Appium;
ü?用sikuli來編寫代碼時,所截到的圖片應該避免雷同,且盡量縮小范圍,便于執行點擊、填寫等操作時,由于范圍過大而定位錯誤;
ü?摻有sikuli jar包的代碼,運行時必須在同一外置手機中使用,不得換其他手機操作,若更換,需重新截取所操作手機的截圖;
ü?若需要測試手機app的某一單獨模塊時,則應使用appium,可以自動定義啟動哪一activity,省去前面一系列步驟。
4.?運行
題外話:小程序中沒有采用appiunm的原因:1)appiunm需要手機app的apk,小程序獲取不到apk文件;2)信息安全考慮,手機和電腦連不上
Sikuli的優缺點
優點
1.與平臺無關
可以實現任意類型的UI(GUI)測試,輕松實現跨平臺測試,并可以解決web測試中的瀏覽器兼容性測試問題。
2.可讀性強
代碼可讀性強,用圖形表示邏輯關系更生動、形象,容易理解,便于維護。
3.提供.jar包
便于構建大型的測試框架,實現各類測試工具之間的互補。
4.用例設計與程序實施可分離
用例設計人員可以只關注圖型邏輯關系和測試檢查點,不需要懂得具體開發與程序語言基礎;程序實施人員可以只進行編程而不過多參與設計。
缺點
1、sikuli不支持中文,因此無論在編程中或者保存路徑,都不可以使用中文!否則運行報錯。
2、圖片的分辨率、色彩、尺寸、唯一性對程序的影響 (如果有兩個相同的,無法區分具體哪一個)
3、sikuli本身還不完善(處于開發、升級階段) 還有很多程序bug,能否繼續發展還是未知數
4、只認識當前活動的圖標(只有當前桌面有才行)
5、用例組織方面有提供但是目前有bug,還未調研嘗試便利性
6、截圖的話,腳本存儲占用空間較大
7、相似度調整需要手動一個個的調整,工作量大
?
四、sikuli界面
五、語法介紹(1)
六、語法介紹(2)
七、實際案例
自動登錄QQ并發送信息到指定好友
實現步驟:
1.打開QQ應用程序
2.輸入賬戶、密碼
3.登錄
4.查找指定用戶
5.發送信息
6.關閉QQ應用程序
————————————————
原文鏈接:https://blog.csdn.net/greless/article/details/52266881
https://www.cnblogs.com/daphnezhu/p/6397806.html
-------------常用語法總結--------------
??簡單介紹一下sikuli常用方法:
1.??:?find就是找到與指定圖片相似度最高的圖片.
?
2.?: findAll就是與指定圖片相似的所有圖片
?
3.?: wait就是等待指定圖片的出現
?
4.?: waitVanish就是等待指定圖片的消失
?
5.?:?exists就是判斷指定的圖片是否存在
?
?
?
6.?: click就是找到與指定圖片最相似的圖片, 然后單擊
?
7.?:?doubleClick就是找到與指定圖片最相似的圖片, 然后雙擊
?
8.?: rightClick就是找到與指定圖片最相似的圖片, 然后右擊
?
9.?:?hover就是找到與指定圖片最相似的圖片, 然后鼠標指針懸浮其上
?
10.?: dragDrop就是從一個圖形的中心點拉到另一個圖形的中心點
?
?
11.?:?在焦點處, 一一輸入指定的文字
?
12.?:?單擊指定的圖片, 然后再一一輸入指定的文字
?
13.?:?在焦點處, 粘貼指定的文字
?
?
14.?:單擊指定的圖片, 然后再粘貼指定的文字
?
二. 綜述:?
???????sikuli 做的事用一句話概括, 就是在某個范圍內, 找到指定條件的某個或某些圖片, 并對其做什么.
?
???????下面舉例解釋上面的那句話:
???????
???????一. 在某個范圍內
???????(1)?,?這個語句的意思是在整個電腦屏幕的范圍內去找QQ圖標, 并點擊該圖標;
?
???????
???????(2)?
???????上面第2條語句的意思是, 在我指定的范圍內( 就是第1條語句中紅色的那一塊), 找QQ圖標, 并點擊該圖標;
?
???????(3) 那么怎么定義一個Region呢
??????????????1^ : r = Region(
??????????????2^: 點擊Create Region 按鈕
??????????????3^: 把括號補全.
?
總結
- 上一篇: 怎样用计算机算出别人的出生日期,【怀孕出
- 下一篇: 【iCore1S 双核心板_FPGA】例