zoukankan      html  css  js  c++  java
  • 自动化测试之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脚本得以运行,如下图:

     

    利用sikuli对web进行自动化测试的流程

    1.下载sikulixsetup

    下载地址:https://launchpad.net/sikuli/+download 

    下载得到:sikulixsetup-1.1.0.jar

    2.安装sikuli

    jar包导入工程中;

    cmd中运行该jar包。java -jar sikulixsetup-1.1.0.jar,则会出现如下图,选择相应选项后,启动会下载sikulixapi.jar。不然会报错:libs to export not found on above classpath: /sikulixlibs/mac/libs642.

    选择第二个

    启动后会有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.用例设计与程序实施可分离

    用例设计人员可以只关注图型逻辑关系和测试检查点,不需要懂得具体开发与程序语言基础;程序实施人员可以只进行编程而不过多参与设计。

    缺点

    1、sikuli不支持中文,因此无论在编程中或者保存路径,都不可以使用中文!否则运行报错。

    2、图片的分辨率、色彩、尺寸、唯一性对程序的影响 (如果有两个相同的,无法区分具体哪一个)

    3、sikuli本身还不完善(处于开发、升级阶段) 还有很多程序bug,能否继续发展还是未知数

    4、只认识当前活动的图标(只有当前桌面有才行)

    5、用例组织方面有提供但是目前有bug,还未调研尝试便利性

    6、截图的话,脚本存储占用空间较大

    7、相似度调整需要手动一个个的调整,工作量大

  • 相关阅读:
    Linux下架构高可用性网络----HA+LB+lvs
    MacBook如何用Parallels Desktop安装windows7/8
    Win10如何彻底禁用小娜?彻底禁用小娜的方法
    安卓手机微信发不出去怎么办 微信不能发信息怎么办
    计算机名、主机名、用户账户名与NetBIOS名有什么区别
    安装corel x8提示你已安装了另外一个版本
    ssh整合问题总结--在添加商品模块实现图片(文件)的上传
    代理设计模式之静态代理与动态代理(超..)详解
    Java基础--反射机制的知识点梳理
    ssh整合问题总结--运行项目时报java.lang.StackOverflowError(堆栈溢出)异常
  • 原文地址:https://www.cnblogs.com/daphnezhu/p/6397806.html
Copyright © 2011-2022 走看看