一般来说有这样的需求,我已经有了一个图片元素,在这个元素的周围会有一个动态显示的对象,我要去做一个点击或者是hover又或者是单纯把这个对象图片save到本地,留做下个页面点击的对象,在这种情况下就可以用到sikuli来解决。
这里我还是依照baidu首页做个例子,可能不是很典型,但是做例子是没问题的。
我先点击换肤按钮,然后在已知换肤图片的情况下,点取其他方位的图片,并save到本地留住成为下次脚本点击的对象。
1. 首先建立一个region对象,这个region是一个方形区域,我先默认成分辨率大小
Region r = new Region(0,0,1023,767);
2. 点击皮肤按钮
r.click("img/ChangeSK.png");
3. 这个我有一个皮肤的图片是在所有皮肤图片的中央
r.exists("img/SK1.png");
运行下,结果还是没问题的:
[debug] Region: exists: img/SK1.png has appeared
4. 把这个图片找到并作为一个Match对象,highlight并打印相似度,同时打印出width和height
Match SK1 = r.find("img/SK1.png"); System.out.println(baidu.getScore()); SK1.highlight(); System.out.println(SK1.h); System.out.println(SK1.w);
结果0.9999843239784241, 说明已经找到
5. 新建一个Location对象,来存放此对象在region中的坐标
Location Loc1 = SK1.getTarget();
注意描述一个图片就有四维,start x,start y,width,height. 这里的location是指的x+height/2, y+width/2, 也就是中心位置
这里我们需要一个工具来获取屏幕上的坐标,这样在手动测试的时候就能精准获取图片的相对位置,网上这样的工具很多,搜下就有了
6. 获取到Location之后,我就需要知道在这个SK1对象的上方的一个同样大小的图片,这里如何做呢:
Location Loc2 = Loc1.above(60);
通过工具得知上方图片的位置大概要高出60pix,所以新建一个location对象
7.因为我们已经知道上方图片的width和height,所以现在就需要新建一个Match对象就行了
Match SK2 = new Match(SK1); SK2.setLocation(Loc2);//这样的做法是错误的,因为这里setLocation不是中心轴了,而是set成起始坐标了,应该这样: SK2.y = SK2.y-60;
8,打印下相似度看是否找到
SK2.highlight(); System.out.println(SK2.getScore());
得分是1,没问题
9,把这个图片save到本地路径下
SK2.saveScreenCapture("img", "SK2");
SK2-1444961093063.png 保存名后面的应该是timestream,应该是避免覆盖,改下sikuli jar包里的源代码重新编译下就可以了。