前言
随着技术的不断发展,广大软件都添加了防止自动化的功能,导致常规通过控件ID、坐标、属性点击方法无法使用,这时就需要找图的方法替代。
一、准备工作
首先需要三张图片,一张手机软件的页面图,两张从页面PS下来的小图标,注意需要寻找的小图标一定要是从页面图上面扣下来的,否则肯定找不到图标,文章最后附上运行效果视频,及本文使用的素材图片,直接添加测试。
二、代码使用
1.代码片段
代码如下(示例):
auto.waitFor();
console.show();
console.setPosition(100, 1200);
//打开目标app
app_init(0);
//寻找返回图标 图标也可以放在sd卡下如"/sdcard/ceshi.jpg"
finding("./ceshi.jpg","./img_back.png",0.75,1,1);
//寻找加号图标
finding("./ceshi.jpg","./img_add.png",0.75,1,1);
/**
* 启动应用 这步是为了真实点击到页面图标 可以省略看log找没找到
*/
function app_init(num) {
var packageName = getPackageName("找图测试");
if(null!=packageName){
home();
sleep(1000);
app.launchPackage(packageName);
echo_log("打开找图测试");
echo_log("手机分辨率--"+device.width+"/"+device.height);
}else{
echo_log("未找到找图测试,任务结束");
exit();
}
}
/**
* 寻找图标
*parent 大图
*find 要寻找的图标
*sbl 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
*a|b int类型 解决点击在图标左上角点击不到 加几个像素
*/
function finding(parent,find,sbl,a,b){
let imgPath = parent;
imgPath = files.path(imgPath);
let img = images.read(imgPath);
let grayImg = images.grayscale(img);
let threshold = 188;
let thresholdImg = images.threshold(grayImg, threshold, 255);
images.save(thresholdImg, "/sdcard/二值化.png");
img.recycle();
grayImg.recycle();
thresholdImg.recycle();
let big= images.read("/sdcard/二值化.png");
if(big==null)
echo_log("大图二值化失败")
let small1= images.read(find);
if(small1==null)
echo_log("获取小图标失败")
//1440 2960为截大图的手机分辨率
let sx = device.width/1440;
let sy = device.height/2960;
let small= images.scale(small1,sx,sy);
if(small==null)
echo_log("图标缩放失败");
else
echo_log("图标缩放比例"+sx+"--"+sy);
let result = images.matchTemplate(big,small,{
max:5,
region:[0,0, device.width,device.height],
threshold:sbl,
});
if(result != null){
if(0===result.matches.length){
echo_log("未找到"+result.matches.length)
}else{
echo_log("找到"+result.matches.length)
for(let i =0; i < result.matches.length; i++){
let pp = result.matches[i].point
echo_log("找到--"+find+"/坐标/"+pp.x+"/"+pp.y)
click(pp.x + a, pp.y + b);
echo_log("点击"+find)
sleep(2000);
break;
}
//将找到图片的位置滑下来 找到图标后可以去sd卡看一下 也可以删掉
var points=result.points;
var canvas = new Canvas(big);
var paint = new Paint();
paint.setColor(colors.parseColor("#ffff00"));
points.forEach(point => {
canvas.drawRect(point.x, point.y, point.x + small.width, point.y + small.height, paint);
});
var image = canvas.toImage();
images.save(image, "/sdcard/找图.png");
big.recycle();
small1.recycle();
small.recycle();
}
}else{
echo_log("未找到"+find);
big.recycle();
small1.recycle();
small.recycle();
}
}
/**
* 在控制台统一输出内容
*/
function echo_log(msg) {
console.log(msg);
}
2.注意事项
注意:如果找不到图标可以修改图片相似度、检查图标切的准确度、截图手机与运行手机的分辨率问题
3.素材
总结
`
以上就是今天要讲的内容,也是查阅了很多大佬文章摸索出来的,希望对大家有所帮助。