• 自动化测试之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、相似度调整需要手动一个个的调整,工作量大

  • 相关阅读:
    把git项目放到个人服务器上
    关于fcitx无法切换输入法的问题解决
    博客变迁通知
    (欧拉回路 并查集 别犯傻逼的错了) 7:欧拉回路 OpenJudge 数据结构与算法MOOC / 第七章 图 练习题(Excercise for chapter7 graphs)
    (并查集) HDU 1856 More is better
    (并查集 不太会) HDU 1272 小希的迷宫
    (并查集 注意别再犯傻逼的错了) HDU 1213 How Many Tables
    (最小生成树 Kruskal算法) 51nod 1212 无向图最小生成树
    (并查集) HDU 1232 畅通工程
    (最小生成树 Prim) HDU 1233 还是畅通工程
  • 原文地址:https://www.cnblogs.com/daphnezhu/p/6397806.html
Copyright © 2020-2023  润新知