Sikulix选取相对位置的图片或对象

转载:https://www.cnblogs.com/goldenRazor/p/4884499.html

Sikulix选取相对位置的图片或对象

一般来说有这样的需求,我已经有了一个图片元素,在这个元素的周围会有一个动态显示的对象,我要去做一个点击或者是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包里的源代码重新编译下就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章