[笔记]autojs学习补充笔记

本文介绍了使用AutoJS进行自动点击的实践经验,包括HelloWorld示例、开启应用、遇到的点击失效、坐标问题及UI线程错误等挑战,并提供了相应的解决方案。作者分享了在不同手机型号上遇到的兼容性问题,以及如何处理滚动轮播图和坐标超出屏幕的情况。同时,还探讨了在UI模式下避免使用sleep函数的替代方法。
摘要由CSDN通过智能技术生成

1 说明

因为玩游戏,想偷懒,做一些自动点击功能,看能否代替枯燥的点击时间。最早的自动游戏是很久以前在校园里玩Mud的时候编写的,可惜早已成为往事。

补充笔记仅作为原教程学习笔记,并非单一教程,主要是记录遇到的坑
如有其他问题,欢迎留言交流。

1.1 学习资料网址

通过官网可找到基本配置及文档说明:https://pro.autojs.org/

2. 补充笔记

2.1 参照文章下载及设置vs code

https://blog.autojs.org/2021/07/05/vscode-debug/
参照官方博客可下载及配置成功
补充笔记
使用客户端模式连接时,一直未能成功。只能使用服务器端模式。

2.2 关于无障碍服务

学习时用的是8.0版本,每次关闭auto.js之后都需要启用无障碍服务。

2.3 Hello World

在VSCode中,新建一个文件,选择文件类型为“javascript”,文件中仅有以下语句:

toast("Hello world")

按F5, 在手机屏幕中可以看到有Hello world的字样出现

2.4 打开一个APP

在hello world的基础上,尝试打开一个APP。就用最熟悉的微信为例,代码如下:

toast("Hello world")
app.launchApp("微信")

按F5,在手机上可以看到微信被打开

3. 遇到的问题合集

3.1 Click函数失效

学习第一天,就遇到这个click函数失效的问题,到处找资料没有头绪。开始怀疑是否下载的版本问题,找了历史版本,依然如此。这是最简单的函数,搞不定就无法进行下去。几乎要放弃了。

//代码一 - 有效的点击,可以进到下一个页面
var iconBiz = id("title_store_enter").findOne();
iconBiz.click()

//代码二 - 页面完全没有反应,并且检查过click返回为true
var iconBiz = id("title_store_enter").findOne();
click(iconBiz.bounds().centerX(), iconBiz.bounds().centerY())

后来想,找了各种资料,都没有这个问题,应该不是我的理解有误,试试另一个手机,发觉代码二起效了。
这个就实在是无解,可能跟手机型号或者系统有关,这个迟些研究,知道这种情况要换台手机就好

3.2 UIObject.bounds() 横坐标返回负坐标,或者超出屏幕的坐标

调试过程中,发现一些object的坐标是负数,或者超出屏幕范围,导致后续操作出错。这个属于正常现象,是因为页面有可以左右滑动的广告轮播页,查找的object在轮播时处于页面以外,所以X坐标会在屏幕以外。
遇到这种问题,有两种解决方案:

  1. 找到轮播框,左右滑动到需要查找的object在屏幕以内。但这个方式需要反复做的判断比较多,不推荐
  2. 一般轮播都是广告,需要查找的object主体一定是在列表页面有的,可以通过到指定列表,或者通过swipe把页面往下划到轮播图消失,再查找

3.3 Object.bounds() 纵坐标超出屏幕以外不多时

当纵坐标刚好在页面最下方,小荷才露尖尖角时,使用控件查找还是能查找到,但点击却是无效的。如果找不到,程序还是很容易判断的(使用null判断即可),但比较大的坑是刚好控件在屏幕下方边界值,使用程序可以正常范围坐标。这个时候直接使用点击就无效了。

经过观察,发现返回的坐标,如果是上述情况,控件的下坐标会小于上坐标(正常情况下,下坐标是大于上坐标的。见下公式:

正常屏幕以上:boundsInScreen=[444,1656][636,1716]
1716 > 1656,为正常的坐标位置

不正常屏幕以下:boundsInScreen=[444,1878][636,1812]
boundsInScreen=[444,2009][636,1812]
1812 < 1878, 1812 < 2009,为不正常的坐标。

解决方案:增加判断,如果找到的控件下坐标小于上坐标,使用swipe将屏幕向上滑动,使得控件能正常显示到页面上

3.4 UI模式下不能使用sleep

写好逻辑代码,要优化一下加上界面,发现在界面模式下直接调用函数时,如果有sleep延时语句,运行时会报错导致程序无法运行,会出现以下提示

Error: 不能在ui线程执行阻塞操作,请使用setTimeout代替

然而,使用setTimeout确实也无法解决问题。
解决方案:
使用新的线程执行,部分代码块如下。其中threads.start(main)中的main,是自定义的function man()函数

"ui";
var threadMain=null
ui.layout(
    <vertical padding="16">
        <button id="myThreadStart" text="启动程序" w="*" style="Widget.AppCompat.Button.Colored" />
        <button id="myThreadStop" text="终止程序并退出" w="auto"/>
    </vertical>
);

ui.myThreadStart.on("click", () => {
    if(threadMain==null) {
        threadMain = threads.start(main);
    }else {
        toast("程序已在运行,请点击停止");
    }
});
ui.myThreadStop.on("click", () => {
    if(threadMain==null) {
        toast("没有程序在运行");
        exit();
    }else {
        toast("程序线程已停止");
        threadMain.interrupt();
        threadMain = null;
        exit();
    }
});
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值