自動化測試之sikuli調研

調研結果

Sikuli可用於web和app的自動化測試中,操做簡單,代碼容易,但截圖過程太過繁瑣,所須要的圖片內存佔用量大,且sikuli的圖片識別度較低,需對所要操做的圖片進行精準截圖。java

什麼Sikuli

MIT的研究人員設計了一種新穎的圖形腳本語言Sikuli,計算機用戶只須有最基本的編程技能(好比會寫print"hello world"),他不須要去寫出一行行代碼,而是用屏幕截圖的方式,用截出來的圖形元素組合出神奇的程序。python

Sikuli工做原理(以python爲例

經過sikuli IDE,能夠創建sikuli腳本,其中包括Python源代碼以及所須要的截圖。Sikuli IDE執行腳本時,經過Python解析器和java庫的橋樑,核心部分解析是經過java庫實現的分兩個部分,java.awt.Robot用來傳遞鍵盤和鼠標的事件流到適當位置;給予OpenCV的C++引擎用於在屏幕內搜索制定的圖片。各部分的協調工做,最終使得sikuli腳本得以運行,以下圖:android

 

利用sikuli對web進行自動化測試的流程

1.下載sikulixsetupweb

下載地址:https://launchpad.net/sikuli/+download 編程

下載獲得:sikulixsetup-1.1.0.jarwindows

2.安裝sikuliapi

jar包導入工程中;瀏覽器

cmd中運行該jar包。java -jar sikulixsetup-1.1.0.jar,則會出現以下圖,選擇相應選項後,啓動會下載sikulixapi.jar。否則會報錯:libs to export not found on above classpath: /sikulixlibs/mac/libs642.app

選擇第二個框架

啓動後會有have fun的提示;

在文件夾中找到下載的sikulixapi.jar包,導入到工程中。

 3.編寫java代碼

代碼以下:

import org.sikuli.script.FindFailed;

import org.sikuli.script.Key;

import org.sikuli.script.Screen;

 

public class Sikulidemo123 {

   public static void main(String[] args) throws FindFailed, InterruptedException {

Screen s=new Screen();

s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\min1.png");

s.doubleClick("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\firfoxpic.PNG");

Thread.sleep(2000);

s.type("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\url1.png", "******");

s.type(Key.ENTER);

s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\ningbologin.png");

s.type("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\username.PNG","zhangguangwu");

s.type("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\password.PNG","Abc123456");

s.click("D:\\eclipse-jee-mars-2-win32-x86_64\\Sikulidemo\\PNG\\loginbutton.PNG");

System.out.println("完美。。。。。");

}

}

應用seleiun寫的登陸自動化

 

二者區別:

ü 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();

    }

}

二者區別:

ü Appium的準確度高,而sikuli對圖片的要求很高;

ü Appium寫好的代碼能夠在任何計算機上使用,sikuli寫好的代碼僅容許在本機使用,由於圖片的識別會由於分辨率、背景顏色,圖片大小的變化而變化;

ü Appium前期的環境搭建過於繁瑣,而且運行腳本時,須要打開appium的前期步驟也比較多,sikuli僅需簡單安裝小蘿貝控機大師便可;

ü Appium代碼中前期須要配置的參數過多,而sikuli僅需按照平常手動操做中的步驟來進行便可。

編寫android app自動化測試的建議:

ü 編寫安卓app自動化測試腳本時,若僅須要測試一小段簡單程序時,可使用sikuli來編寫,若須要測試一個複雜的系統,則應用Appium;

ü sikuli來編寫代碼時,所截到的圖片應該避免雷同,且儘可能縮小範圍,便於執行點擊、填寫等操做時,因爲範圍過大而定位錯誤;

ü 摻有sikuli jar包的代碼,運行時必須在同一外置手機中使用,不得換其餘手機操做,若更換,需從新截取所操做手機的截圖;

ü 若須要測試手機app的某一單獨模塊時,則應使用appium,能夠自動定義啓動哪一activity,省去前面一系列步驟。

4. 運行

Sikuli的優缺點

優勢

1.與平臺無關

能夠實現任意類型的UI(GUI)測試,輕鬆實現跨平臺測試,並能夠解決web測試中的瀏覽器兼容性測試問題。

2.可讀性強

代碼可讀性強,用圖形表示邏輯關係更生動、形象,容易理解,便於維護。

3.提供.jar包

便於構建大型的測試框架,實現各種測試工具之間的互補。

4.用例設計與程序實施可分離

用例設計人員能夠只關注圖型邏輯關係和測試檢查點,不須要懂得具體開發與程序語言基礎;程序實施人員能夠只進行編程而不過多參與設計。

缺點

一、sikuli不支持中文,所以不管在編程中或者保存路徑,都不可使用中文!不然運行報錯。

二、圖片的分辨率、色彩、尺寸、惟一性對程序的影響 (若是有兩個相同的,沒法區分具體哪個)

三、sikuli自己還不完善(處於開發、升級階段) 還有不少程序bug,可否繼續發展仍是未知數

四、只認識當前活動的圖標(只有當前桌面有才行)

五、用例組織方面有提供可是目前有bug,還未調研嘗試便利性

六、截圖的話,腳本存儲佔用空間較大

七、類似度調整須要手動一個個的調整,工做量大

相關文章
相關標籤/搜索