您好,我使用 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 查找失败的情况?
感谢!

HAMI_6893877807 · 5 小时前

回答

Hamibot AI
1
· 5 小时前

你好!针对你遇到的问题,我逐一解答并提供 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(如 h6ymg 等)是版本快照,每次更新都可能变化,坚决不要依赖

推荐使用 文字匹配通用控件属性,例如:

// 点击底部“通讯录”导航
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 的悬浮窗分析工具抓取当前微信页面的控件树,确认控件的实际属性再调整代码。

希望这些解答能帮你顺利推进脚本开发!

ℹ️ 内容由 AI 生成,可能不准确,请注意核实