您好,我使用 Hamibot 开发微信自动加好友脚本,遇到脚本卡在微信首页控件查找环节的问题,详情如下:
✅ 整体运行现象
脚本可以正常启动、成功拉起微信、读取任务并解析客资;
之后执行 wechat_add_adapter.js,尝试通过固定 ID 控件匹配依次点击:微信首页底部【通讯录】Tab、新的朋友、添加朋友按钮、搜索框,
脚本在这里持续停滞,无法继续往下执行后续操作。
我的手机本身已关闭电池优化、可保持 Hamibot 无障碍服务常驻,不属于被系统后台频繁杀服务的机型。
✅ 核心 3 类问题
微信控件匹配问题
控件 ID 是特定版本微信的快照 ID:h6y / mg / obc / coz / mes,并非全局永久 ID
微信版本更新、开屏弹窗 / 更新提示 / 验证弹窗、自动拉起微信后无法稳定停留在干净微信主消息首页,导致目标控件不在预期页面层级,旧 ID 查找失败
原生无参数 waitFor () 会无限阻塞脚本,没有内置超时机制,一旦找不到控件脚本就卡死
之前尝试使用 UiSelector.waitFor(毫秒数值) 写法,直接报错:InternalError: 找不到方法 com.stardust.autojs.core.accessibility.UiSelector.waitFor(number)
JS 引擎语法兼容问题
Hamibot 引擎和原版 Auto.js 存在语法差异:不支持带超时参数的 waitFor 重载写法
同时老版引擎对 ES6 语法支持有限,如函数默认参数写法会触发语法解析报错,导致脚本加载失败
不清楚当前 Hamibot JS 引擎版本、支持语法规范、官方推荐的控件超时等待写法
控件匹配底层差异疑问
原版 Auto.js 的 ID 控件查找逻辑和 Hamibot 是否存在底层差异?
有没有稳定适配微信底部导航栏控件的匹配方案(文本匹配 / 通用匹配方式),避免依赖易变动的微信私有 ID?
微信页面弹窗、开屏动画干扰下,有没有官方推荐的等待页面加载、稳定定位控件的写法?
✅ 需要您协助解答
Hamibot 正确的控件超时等待写法是什么?是否支持标准 Auto.js 格式的带参数 waitFor API?
有无通用、稳定匹配微信底部导航栏控件的方案,减少微信版本更新带来的 ID 失效问题?
Hamibot 当前 JS 引擎版本、支持的 JS 语法规范是什么?
是否存在 Hamibot 控件选择器底层行为与原版 Auto.js 不一致,造成 ID 查找失败的情况?
感谢!
回答
你好!针对你遇到的问题,我逐一解答并提供 Hamibot 上的正确实践方法。
1. 控件超时等待的正确写法
Hamibot 不支持 waitFor(number) 这种带参重载。你遇到的 InternalError: 找不到方法 正是因为这个原因。
正确的超时等待控件的方法是使用 findOne(ms):
// 文档地址 https://docs.hamibot.com/
// 在 5 秒内查找 id 为 "coz" 的控件,超时返回 null
var target = id("coz").findOne(5000);
if (target) {
target.click();
} else {
toast("控件未找到,请检查页面状态");
}
findOne()不带参数就是无限等待,会卡死脚本,所以必须传入超时毫秒数。- 建议对每个可能缺失的控件都使用
findOne(ms)并做空值判断,避免脚本卡住。
2. 微信底部导航栏的稳定匹配方案
微信的私有 ID(如 h6y、mg 等)是版本快照,每次更新都可能变化,坚决不要依赖。
推荐使用 文字匹配 或 通用控件属性,例如:
// 点击底部“通讯录”导航
text("通讯录").className("android.widget.TextView").findOne(5000).click();
// 或者用 desc 属性(有些版本底部导航有 contentDescription)
desc("通讯录").findOne(5000).click();
如果微信底部导航是 Tab 布局,也可以这样定位:
// 通过 TabWidget 定位
var tabWidget = className("android.widget.TabWidget").findOne(5000);
if (tabWidget) {
tabWidget.child(i).click(); // i 是通讯录的索引,可通过分析获取
}
处理弹窗、开屏广告与页面加载状态:
- 在进入微信后,先等待主页稳定,例如:
// 等待主页出现“通讯录”文本,表示主页已加载完毕
text("通讯录").waitFor(); // 注意:waitFor() 无参,会无限等,但这里确信会出现
// 或者用 findOne(10000) 等待 10 秒
- 关闭可能的弹窗:用
textContains("同意").findOne(2000)或text("我知道了").findOne(2000)尝试点击,然后继续。
3. Hamibot 的 JS 引擎版本与语法限制
Hamibot 使用的 JavaScript 引擎是 Rhino 1.7.15,它并不完全兼容 ES6 及更高版本。
必须避免的语法:
- 箭头函数 (
() => {}) - 函数默认参数 (
function foo(a = 1) {}) let/const部分场景可能有问题,建议统一使用var- 模板字符串可以用,但需要注意转义
推荐写法:
- 使用传统
function定义 - 所有参数在函数体内手动判断
undefined - 在代码开头添加注释
// 文档地址 https://docs.hamibot.com/是个好习惯
4. 控件选择器底层行为是否与原版 Auto.js 不一致?
Hamibot 的控件选择器底层逻辑 基本兼容 Auto.js,大部分 API 行为一致。但不同系统、不同微信版本、无障碍服务状态的差异可能导致同一个 ID 在不同设备上找不到。
常见原因及排查:
- 微信版本不同,控件 ID 和层级变化。
- 无障碍服务未开启或异常(你已检查,可忽略)。
- 页面未完全加载(如还在开屏动画),此时查找会失败。
- 某些厂商 ROM 对无障碍服务的限制导致控件树不完整。
建议:
- 始终使用文本、描述等不易变的属性作为首选。
- 使用
findOne(ms)做超时处理,并加上重试逻辑。 - 可用
auto.waitFor()(无参)等待无障碍服务就绪,但不要用它等控件。
补充:权限与后台弹出界面
你已关闭电池优化,但还要确保授予了 “后台弹出界面” 权限,否则脚本可能无法在后台拉起微信或点击控件。进入「设置 → 应用管理 → Hamibot → 权限管理」,开启 后台弹出界面。
针对你的流程的改进示例
// 文档地址 https://docs.hamibot.com/
launchApp("微信");
sleep(2000); // 等待启动
// 等待主页加载,可通过“通讯录”文本判断
if (text("通讯录").findOne(10000) == null) {
toast("微信主页未加载完成");
exit();
}
// 点击通讯录
text("通讯录").findOne(5000).click();
// 点击新的朋友(可能需要滚动或直接查找)
var newFriend = text("新的朋友").findOne(5000);
if (newFriend) {
newFriend.click();
} else {
// 尝试滚动查找
swipe(500, 1500, 500, 500, 500);
text("新的朋友").findOne(5000).click();
}
// 后续操作同理...
这样既避免了 ID 依赖,也通过超时机制防止脚本卡死。如果仍有问题,可以先用 Auto.js 的悬浮窗分析工具抓取当前微信页面的控件树,确认控件的实际属性再调整代码。
希望这些解答能帮你顺利推进脚本开发!