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
    })
    //找到图会返回坐标 找不到返回null
    if (!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
    })
    //找到图会返回坐标 找不到返回null
    if (!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
      })
      //找到图会返回坐标 找不到返回null
      if (!result) {
       return false;
      } else {
       click(result.x, result.y);
       return true;
      }
    } 
}

点击图片("/sdcard/脚本/A2.png",0.8); //调用函数

问题:每次截图都是上一个界面

错误原因:

        当我加入找到指定界面,在立马截图,发现截图依然是上一个界面的。难道是因为原生界面进入小程序导致的吗?因为我们最终操作的界面是一个小程序。

function 点击图片(smallImgPath, threshold) {
    var titl = textContains("每周五").findOne(13000
    if(titl!=null){
        toastLog("找到指定界面")
        captureScreen("/sdcard/a2.png");
    }
    ...省略各种代码
}

解决:

        截图问题,判断是否在这个界面,如果在立马截图,截图依然是上一个界面,需要延迟几百毫秒最佳。

function 点击图片(smallImgPath, threshold) {
    var titl = textContains("每周五").findOne(13000
    if(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
       })
       //找到图会返回坐标 找不到返回null
       if (!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有点冲突就不想搞了麻烦。

光看不敲是没用的
看后一定要去实践
一定要去敲代码
一定要去运行试错
这样才是有意义的学习

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PYB3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值