上帝之眼——Sikuli

作者: 测试开发栈 | 来源:发表于2017-04-07 12:26 被阅读1437次

    在进行Web端自动化测试的时候,你会发现总会存在某些特殊控件无法定位识别不了(比如windows GUI界面的上传文件的文件选择框、导出文件路径选择框等等),那么直接使用WebDriver等Web自动化测试框架对这类控件是束手无策……同样的,在移动端自动测试过程中,有时也会遇到某些控件无法定位,虽然可以基于屏幕坐标点击,但那毕竟不太可靠,换个不同尺寸或分辨率的手机就点错地方了……好了,既然没有百分百完美的测试框架,那么面对这些瓶颈或痛点我们有什么工具或框架可以弥补吗?肯定是有的,比如对付GUI界面的AutoIt3(以后有时间再讲解这个工具的用法),还有我们今天的主角,号称“上帝之眼”的Sikuli。

    一、Sikuli简介

    Sikuli是由MIT(麻省理工学院) 研究团队发布的一种图形化编程技术(编程小白的福音),使用Sikuli你只需要会写HelloWorld这种最基本的编程技能即可,用Sikuli不需要去写出一行行复杂的代码,而是用屏幕截图的方式,用截出来的图形元素组合出神奇的程序。
    Sikuli官网:http://slides.sikuli.org/
    API doc :http://nightly.sikuli.de/docs/index.html
    Sikuli是开源的,源码可在Github查看:https://github.com/sikuli/sikuli
    使用Sikuli的IDE编出来的程序长这样:


    当然作为要成为终有一日能站在测试开发技术栈顶端的我们,肯定不能这样写,Sikuli非常人性化的提供了基于Java语言编程的API,我们还是要老老实实的写Java代码,让Sikuli辅助我们使用的其他主流自动化测试框架。

    二、Sikuli自动化测试

    Sikuli包括Sikuli脚本、基于Jython的API以及Sikuli IDE。Sikuli可以实现任何你可以在显示器上看到ui对象的自动化,你可以通过编写一些代码来实现web 页面,window/linux/Mac OS X桌面应用、甚至是iphone和android模拟器的自动化测试。
    1、Sikuli的用于自动化测试的优点:
    a.可以测试不易识别或无法定位的对象,比如map 、Flash和图表等;
    b.可以验证图片;
    c.通俗易懂,容易维护;
    但是它的缺点和优点一样明显,不够灵活,所以一般都只是用于辅助测试。
    2、Java项目中引用Sikuli:
    Sikuli for Java 的jar包下载地址参考:http://slides.sikuli.org/download/
    这是我们今天的重点,如何在Java项目中引入Sikuli,下面图解进行说明:
    a.官网下载Java对应的api生成包:

    Paste_Image.png

    这里不能直接用maven引入,我试了不是我们想要的效果,没仔细研究说明了,你们有兴趣可以去看看~
    在上面地址下载下来的是一个sikulixsetup-x.x.x.jar的jar文件,双击运行,打开setup界面:


    Paste_Image.png

    这里我们选择第二个,如果要安装IDE,选择第一个Pack-1。安装完后会在当前目录生成一个jar文件:sikulixapi.jar,这就是我们需要引入Java项目的jar包了。

    b.新建Java工程引入sikulixapi.jar包



    c.调用Sikuli API
    下面进入编码环节,我这里是创建了一个Sikuli工具类:

    public class SikuliUtil {
         
         public static Pattern pattern = null;
         public static Screen screen = null;
         //单击
         public static boolean click(String iconPath){
             boolean isVaild = false;
             if(!isExist(iconPath)){
                 System.err.println("can not find the object:" + iconPath);
                 return false;
             } 
             pattern = new Pattern(iconPath);
             screen = new Screen();
             try {
             screen.click(pattern);
             isVaild = true;
             } catch (FindFailed e) {
             e.printStackTrace();
             System.err.println(e.getMessage());
             }
             clear();
             return isVaild;
         }
         //双击
         public static boolean doubleClick(String iconPath){
             boolean isVaild = false;
             if(!isExist(iconPath)){
                 System.err.println("can not find the object:" + iconPath);
                 return false;
             }
             pattern = new Pattern(iconPath);
             screen = new Screen();
             try {
             screen.doubleClick(pattern);
             isVaild = true;
             } catch (FindFailed e) {
                 e.printStackTrace();
                 System.err.println(e.getMessage());
             }
             clear();
             return isVaild;
         }
         //基于图片对象查找
         public static boolean isExist(String iconPath){
             boolean isVaild = false;
             pattern = new Pattern(iconPath);
             screen = new Screen();
             try {
                 Image image = screen.find(pattern).getImage();
                 System.out.println(image);
                 isVaild = image != null;
             } catch (FindFailed e) {
                 e.printStackTrace();
                 System.err.println(e.getMessage());
             }
             clear();
             return isVaild;
         }
         //关闭弹窗
         public static void closePrompt(){
             Screen.closePrompt();
         }
         
         public static void clear(){
             if(pattern != null){
                 pattern = null;
             }
             if(screen != null){
                 screen = null;
             }
         }
        
         public static void main(String[] args){
             click("weixin.png");          
         }
    }
    

    上面代码我封装了Sikuli的几个常用方法,个人觉得点击最常用,main方法中我是想测试下点击桌面的微信图标的效果:



    这样写这个工具类就可以在WebDriver、Appium 或者UiAutomator无法定位的地方愉快的使用Sikuli来操作了~

    更多原创技术好文和资料,请关注公众号:测试开发栈

    相关文章

      网友评论

      • cooling2016:斯库里,感觉有点像BDD 的方式,个人觉得
      • 6bf4671977ce:再问一下,这个有python包吗
        测试开发栈:暂时好像只有jar包,不过使用python也是没问题的,借助JPype,它是一个能够让 python 代码方便地调用 Java 代码的工具
      • 6bf4671977ce:这也行。。。那对于js它怎么处理呢
        测试开发栈:你是想说web页面吧?一样的处理,在屏幕区域可见就行

      本文标题:上帝之眼——Sikuli

      本文链接:https://www.haomeiwen.com/subject/brhhattx.html