轉載: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包裏的源代碼重新編譯下就可以了。