Auto.js 使用过程中遇到的坑点与细节(踩坑日记)

1,201 阅读3分钟
  • 细节1

    click('扫一扫')click(x, y),后者只会在 基于坐标 的环境下生效,默认不是。

    // 必现要在前面设置屏幕宽高
    setScreenMetrics(1600, 900);
    // 点击指定坐标才会生效,否则只能按控件的点击事件进行生效
    click(point.x, point.y)
    
  • 细节2

    如果正常运行代码到 app 没问题,但是打包之后出现无效果或者闪退等问题,又看不到输出日志,可以通过 trycatch 包裹最前沿的代码通过自带的日志面板看输出。

  • 细节3:通过 click(x, y) 的方式不知道具体点了什么位置

    在使用基于坐标操作时,不知道具体点了什么位置,屏幕上也没有能看到的反馈提示,可以通过开启录屏功能,开启后点击时,会有点击标记出现,能知道准确的点击了哪里。

  • 细节4:launch 相关的启动函数失效

    在使用 launch()launchApp()launchPackage() ... 等启动函数时,发现调用了正确的 app 名称(例如:钉钉)包名(getPackageName('钉钉')) 无法打开对于 app

    解决方案:原因是因为 app 权限问题,需要到 设置 -》 应用管理 -》钉钉 -》权限 -》打开关联启动 这样就可以通过上面的函数调起了,要不然只能通过定位方式打开 app

    // 开了权限后可以使用这种方式打开
    launchApp('钉钉');
    
    // 没开权限,只能这么打开,得保证 钉钉 在当前屏幕上可见
    const dingding = desc('钉钉').findOne();
    click(dingding.bounds().centerX(), dingding.bounds().centerY());
    

    但是在一些 app 内部的按钮上,可以使用 click('登录'),发现的区别就是这个按钮 desc、text 是没值的可以点击到,有值的点击不到。

  • 细节5:click("钉钉") 无法打开当前屏幕上的 app

    这个应该还是权限问题,但是暂时没找到对应权限,也有可能是 autox.js 基础库版本原因,有知道可以留言告知下,但是有替代方案,取出当前这个 app 元素组件,通过点击组件中心位置进行点击,也是一样的效果。

    const dingding = desc('钉钉').findOne();
    click(dingding.bounds().centerX(), dingding.bounds().centerY());
    
  • 细节6:require('./utils.js') 方式获取其他 js 模块的代码报错找不到该模块

    原因是路径问题,因为电脑与手机的环境问题,导致路径不对,可以通过 vscodeautox.js 插件自带的辅助指令,创建一个项目,在项目中进行互相引用,其实也就是要保证到手机后是在一个文件夹内,要不然单个脚本可能只会运行单个脚本到手机内,导致引入的模块并没有在同一个目录。快捷键 command + shift + pcontrol + shift + p 换出下面的菜单。

    image.png

    image.png

  • 错误1

    Can't find method com.stardust.autojs.core.image.ColorFinder.findMultiColors(boolean,number,number,org.opencv.core.Rect,[I)
    

    原因是:使用了截图函数,并传入了保存地址,截图函数传入保存地址后则不会返回 images 对象。

    var img = captureScreen("/sdcard/screencapture.png");
    var point = findMultiColors(img, "#123456", [[10, 20, "#ffffff"], [30, 40, "#000000"]], {
      region: [0, 960, 1080, 960]
    });
    if(point){
      toast("找到了");
    } else {
      toast('未找到');
    }
    

    改为一下即可,如果一定要存储,可以改为存储后,再读取出来使用图片

    var img = captureScreen();
    var point = findMultiColors(img, "#123456", [[10, 20, "#ffffff"], [30, 40, "#000000"]], {
      region: [0, 960, 1080, 960]
    });
    if(point){
      toast("找到了");
    } else {
      toast('未找到');
    }
    
  • 错误2

    Error: out of region: region = [1092,100,113,144], image.size = [900,1600]
    

    原因是:查找的图色坐标超过了,尤其是使用图色查找助手的需要注意,图色助手的值可能没问题,但是代码中的截图可能有问题,因为横竖屏截图尺寸不一样,截出图的自然就没法进行对比。

    requestScreenCapture(false);
    var img = captureScreen();
    // 确认一下尺寸,尤其是ipad上,会存在尺寸相反的问题
    console.log(img.getWidth(), img.getHeight());
    
  • 后续再补充...