上帝之眼——Sikuli

在进行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_第1张图片

当然作为要成为终有一日能站在测试开发技术栈顶端的我们,肯定不能这样写,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生成包:

上帝之眼——Sikuli_第2张图片
Paste_Image.png

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


上帝之眼——Sikuli_第3张图片
Paste_Image.png

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

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


上帝之眼——Sikuli_第4张图片

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方法中我是想测试下点击桌面的微信图标的效果:


上帝之眼——Sikuli_第5张图片

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

更多原创技术好文和资料,请关注公众号:测试开发栈
上帝之眼——Sikuli_第6张图片

你可能感兴趣的:(上帝之眼——Sikuli)