Sikuli-IDE 用起来方便,但是用到实际项目中还是有局限性的,Sikuli 提供了 Sikuli-Script 的 jar 包,在 Sikuli-X 的安装目录下,这样就可以在
eclipse 中使用 JAVA 编写代码了,并用 Sikuli-Script 和 selenium 完美结合使用。
首先新建一个 Sikuli 的项目,导入 Sikuli-Script.jar 包,然后在项目下新建一个 CaleTest.java,并且在项目文件下新建一个存放图片的文件
夹 PNG,在 PNG 文件夹下对应 CaleTest.java 建一个同名的文件夹存放对应使用的图片(便于维护)。
然后就开始敲代码了,代码如下:
package com.sikuli;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;
public class CaleTest {
public static void main(String[] args) throws IOException, FindFailed {
Process app= null; //新建一个进程
String path ="E:\\workspace\\Sikuli\\PNG\\CaleTest\\"; //图片路径
String strat = null;
String end =null;
app=Runtime.getRuntime().exec("calc.exe"); //打开计算器
Screen scr = new Screen(); //新建一个操作屏幕
//获取时间,打印开始日志
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
strat = dateFormat.format(now);
System.out.println("strat"+"-------"+strat);
scr.wait(path+"1481855580087.png", 5); //等待元素出现,超时5秒
scr.click(path+"1481855580087.png"); //点击元素
scr.wait(path+"1481855635062.png", 5);
scr.click(path+"1481855635062.png");
scr.wait(path+"1481855675892.png", 5);
scr.click(path+"1481855675892.png");
scr.wait(path+"1481855716969.png", 5);
scr.click(path+"1481855716969.png");
scr.wait(path+"1481855763519.png", 5);
scr.click(path+"1481855763519.png");
scr.wait(path+"1481855820477.png", 5);
scr.click(path+"1481855820477.png");
Date now1 = new Date();
SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
end = dateFormat1.format(now1);
System.out.println("end"+"-------"+end);
if (scr.exists(path+"66.png", 1000) != null){
System.out.println("测试通过");
app.destroy(); //关闭计算器进程
}
else{
System.out.println("测试失败");
app.destroy();
}
}
}
运行一下,用时 9 秒
感觉是不是有点慢,因为是在整个电脑屏幕中识别,下面我们把识别范围缩小下,使用 Screen 中的 setRect 方法设置识别区域
app=Runtime.getRuntime().exec("calc.exe"); //打开计算器
Screen scr = new Screen(); //新建一个操作屏幕
scr.setRect(596,325,220,315); //设定识别区域
再次运行看下时间,用时 5 秒,少了差不多一半,当然了这个也是有问题的,就是程序不在这个区域就不行了