在进行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生成包:
这里不能直接用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来操作了~
网友评论