Auto.js学习笔记13:images.findImag()报错找不到方法,返回的坐标无法点击等问题利用图片的相似度执行精准目标点击(实战篇)
申明本人使用的autojs是4.1.1版本
目录
操作app是云闪付的小程序抢消费劵
实际开发中各种问题并解答
错误代码
报错:Can't find method findImage()函数
问题:
解决方法:
报错:Wrapped java. lang . NullPointerException:template = null
错误原因:
解决:
问题:每次截图都是上一个界面
错误原因:
解决:
问题:findImage()函数找不到指定的小图片位置
错误原因:
解决:
问题:系统找到了指定的图片,依然无法执行点击效果
错误原因:
解决:
最终成功的代码示例
总结
操作app是云闪付的小程序抢消费劵
界面如下:大图是全屏截图,小图是比对相识度的图片,并对其进行点击
实际开发中各种问题并解答
错误代码
/*** 点击图片* @param {String} smallImgPath 小图片路径* @param {Int} threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9* @returns */
function 点击图片(smallImgPath, threshold) {var img = captureScreen("/sdcard/a.png");var smallImg = images.read(smallImgPath); //读取本地的领取图片var result = findImage(img, smallImg, {threshold: threshold})//找到图会返回坐标 找不到返回nullif (!result) {return false;} else {click(result.x, result.y);return true;}
}点击图片("/sdcard/脚本/A1.png",0.8); //调用函数
报错:Can't find method findImage()函数
Thread[main (Spawn-0),5]: Can't find method com.stardust.autojs.runtime.api.Images.findImage(boolean,com.stardust.autojs.core.image.ImageWrapper,number,number,null,number).
问题:
我找了很久才发现是,var img = captureScreen("/sdcard/a.png"); 这行代码导致的findImage()函数报以上错误。
仔细看文档(该函数不会返回任何值, 该函数也可以作为全局函数使用)不难发现captureScreen("/sdcard/a.png")带参的函数不会返回image对象,所有当程序跑到findImage()函数时就报错了!
解决方法:
使用captureScreen("/sdcard/a.png")定义截图路径,在使用images.read("/sdcard/a.png");获取image对象
/*** 点击图片* @param {String} smallImgPath 小图片路径* @param {Int} threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9* @returns */
function 点击图片(smallImgPath, threshold) {var screenshotIcon = captureScreen("/sdcard/a.png");if(screenshotIcon){var img = images.read("/sdcard/a.png");var smallImg = images.read(smallImgPath); //读取本地的领取图片var result = findImage(img, smallImg, {threshold: threshold})//找到图会返回坐标 找不到返回nullif (!result) {return false;} else {click(result.x, result.y);return true;}}}点击图片("/sdcard/脚本/A1.png",0.8); //调用函数
报错:Wrapped java. lang . NullPointerException:template = null
错误原因:
函数参数smallImgPath 小图片路径是错误的导致,改为正确的路径及可
解决:
正确路径:"/sdcard/脚本/A2.png",并增加相关image对象日志提示。
/*** 点击图片* @param {String} smallImgPath 小图片路径* @param {Int} threshold 图片相似度。取值范围为0~1的浮点数。默认值为0.9* @returns */
function 点击图片(smallImgPath, threshold) {var screenshotIcon = captureScreen("/sdcard/a.png");if(screenshotIcon){var img = images.read("/sdcard/a.png");var smallImg = images.read(smallImgPath); //读取本地的领取图片if(smallImg==null||img==null){toastLog("大图片img:" + img);toastLog("小图片smallImg:" + smallImg);}var result = findImage(img, smallImg, {threshold: threshold})//找到图会返回坐标 找不到返回nullif (!result) {return false;} else {click(result.x, result.y);return true;}}
}点击图片("/sdcard/脚本/A2.png",0.8); //调用函数
问题:每次截图都是上一个界面
错误原因:
当我加入找到指定界面,在立马截图,发现截图依然是上一个界面的。难道是因为原生界面进入小程序导致的吗?因为我们最终操作的界面是一个小程序。
function 点击图片(smallImgPath, threshold) {var titl = textContains("每周五").findOne(13000if(titl!=null){toastLog("找到指定界面")captureScreen("/sdcard/a2.png");}...省略各种代码
}
解决:
截图问题,判断是否在这个界面,如果在立马截图,截图依然是上一个界面,需要延迟几百毫秒最佳。
function 点击图片(smallImgPath, threshold) {var titl = textContains("每周五").findOne(13000if(titl!=null){toastLog("找到指定界面")sleep(4500);captureScreen("/sdcard/a2.png");}...省略各种代码
}
问题:findImage()函数找不到指定的小图片位置
错误原因:
我用的是PC端微信进行截图然后导入手机的,导致无法识别到。
解决:
后来使用手机截图即可立马找到。
问题:系统找到了指定的图片,依然无法执行点击效果
错误原因:
通过多次测试发现:
1.需要执行2次及以上点击click()方法才生效(可能是软件进行了限制);
2.通过多次测试,确认截图识别成功后返回的坐标是小图片最左边的坐标,有时又返回的是最右边的坐标。
解决:
随后通过界面ui分析发现app可以点击的位置是中间(程序点击是精确到了点和人为点击是不同的),所以截图时一定要截图图片中间位置,或是利用简单算法对返回坐标进行计算。
最终成功的代码示例
function 点击图片(smallImgPath, threshold) {var titl = textContains("每周五").findOne(13000);var screenshotIcon;if(titl!=null){toastLog("找到指定界面")sleep(4500);screenshotIcon = captureScreen("/sdcard/a.png");}if(screenshotIcon){var img = images.read("/sdcard/a.png");var smallImg = images.read(smallImgPath); //读取本地的领取图片if(smallImg==null||img==null){toastLog("大图片img:" + img)toastLog("小图片smallImg:" + smallImg)}var result = images.findImage(img, smallImg, {threshold: threshold})//找到图会返回坐标 找不到返回nullif (!result) {log("没找到2222:" + result);return false;} else {log("找到了1111111" + result);click(result.x, result.y);click(result.x, result.y);return true;}}return false;
}点击图片("/sdcard/脚本/A2.png",0.8); //调用函数
总结
第一次开发这类软件,有很多不足,也遇到很多问题,全部都记录下来,以后遗忘可以回来看下。本想弄个gif动画效果示例的,但手机的gif录制app和autojs有点冲突就不想搞了麻烦。
光看不敲是没用的
看后一定要去实践
一定要去敲代码
一定要去运行试错
这样才是有意义的学习
Auto.js学习笔记13:images.findImag()报错找不到方法,返回的坐标无法点击等问题利用图片的相似度执行精准目标点击(实战篇)相关推荐
- Auto.js学习笔记10:实例化自定义对象,在子线程使用JSON.stringify()方法导致报错(已解决)
申明本人使用的autojs是4.1.1版本 JSON.stringify()使用导致autojs软件直接奔溃退出. 报错核心局部代码 var sendInfoObj = { //对象areaCode ...
- Auto.js学习笔记2:真机连接vscode开发工具进行调试,自动开启微信app,自动切换通讯录和微信界面
实战代码演示启动微信并切换微信和通讯录界面 申明本人使用的autojs是4.1.1版本 1. 安装autojsapp:4.1.1版本 这个不用多说,找到app安装到手机上 启动autojs的app,开 ...
- Auto.js学习笔记1:开发需要准备什么工具和编程语言知识?
什么是Auto.js? 根据官方文档定义:Auto.js是一款无需root权限的JavaScript自动化软件. Auto.js是一款安卓手机的应用主要用webview,和微信一样,安装在手机上: A ...
- Auto.js学习笔记4:autojs打包后,大部分华为等大牌子手机无法安装?利用模拟器远程在autoPro里签名打包可以解决该问题。
准备工作 Android模拟器,我用的逍遥模拟器: auto Pro版本的apk(本人用的是Prov7.0.4.1版本): vs Code开发工具: 一台可以正常连接网络的电脑,这个是必须: 在vs ...
- Auto.js学习笔记——快速入门:软件安装
Auto.js是什么 Auto.js是不需要Root权限的安卓手机自动化软件(Auto.js文档官方文档) Auto.js与一般的APP一样,安装在手机上,且可以自行编写并运行脚本,从而实现自动化工作 ...
- jsp 学习笔记( java编译报错:程序包 javax.servlet和javax.servlet.http 不存在)
最近学习javaEE这门课程,老师要求不用集成开发环境只用 tomcat (服务器).java 和 浏览器 实现jsp过程,要编译的java文件如下 import javax.servlet.*; i ...
- STM32 学习笔记 -- Keil5使用Debug报错之Encountered an improper argument
Keil5使用Debug报错之Encountered an improper argument 分类专栏: 软件问题 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上 ...
- JS Uncaught SyntaxError:Unexpected identifier异常报错原因及其解决方法
最近在写ajax的时候,调用js方法,遇到了Uncaught SyntaxError:Unexpected identifier异常报错,开始搞不清原因,很苦恼. 以为是js方法参数个数和长度的问题, ...
- 解决Nginx出现403 forbidden (13: Permission denied)报错的四种方法
我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log.打开日志发现报错Permissio ...
最新文章
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences
- slider使用TickPlacement获得游标效果
- 一个领导力培训的游戏练习
- 十天学会ASP.Net——(8)
- 生态和能力是国内自研操作系统发展的关键
- 学校校车运营各项安全管理制度_学校校车接送安全管理制度(通用3篇)
- SpringSecurity Basic Authentication
- 西安python后端招聘_有大佬招 Python 后端初级人员吗?
- moosefs-1.6.10 安装手记
- 美团技术leader:写给工程师的十条精进原则
- C题:无线充电电动小车(本科)--2018年TI杯大学生电子设计竞赛
- Interfaces for Music音乐界面——翻译
- outlook怎么配置126邮箱服务器,outlook 如何配置126邮箱
- 《留住好员工》-读后感
- Web前端面试常见问题
- 局部搜索(爬山法+模拟退火+遗传算法)
- 估值近百亿,“创维三把手”酷开科技能否顺利赶考?
- 编程和乐高机器人的区别
- mysql 换文件夹_windows下更换MySql数据库数据文件夹位置
- java动态编程解决分硬币问题,动态编程硬币更改问题
热门文章
- oracle用于限制分组函数的返回值,Oracle考试试题(带答案)
- VMware Workstation Pro新建虚拟机的操作步骤
- Flink基础系列8-Flink on yarn运行wordcount程序
- 【Unity3D基础2-11】Unity3D网格和材质
- 好课堂Scratch编程10 趣学篇(六)听题!格里芬的挑战
- 如何限制在制品?| Kanban
- 取消改写模式(python)
- 【愚公系列】2023年01月 .NET CORE工具案例-基于SqlSugar的多库多表融合查询
- 【word小技巧】用WPS调整你的论文格式
- 开源!!!100 多个常用 API 数据接口免费分享!建议收藏!