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^: 把括号补全.

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值