回答
获取不到微信好友列表,通常由以下原因导致:
- 界面位置错误:微信启动后默认停留在“聊天”页,好友列表实际在“通讯录”标签页中。
- 选择器不稳定:你代码中使用的
id()和depth()会随微信版本更新动态混淆或改变,极易失效。 - UI未渲染完成:脚本执行速度快于界面加载速度,
find()在节点尚未生成时返回空集合。 - 无障碍节点捕获限制:未开启无障碍权限或微信节点未正确暴露,导致无法获取控件树。
下面提供一套稳定可行的实现方案。代码已适配Hamibot使用的Rhino 1.7.15引擎,未使用箭头函数与默认参数,并采用更可靠的选择器策略。
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
launchApp("微信");
sleep(2000);
// 1. 切换到通讯录标签
var contactTab = text("通讯录").findOne(5000);
if (contactTab) {
contactTab.click();
sleep(1000);
} else {
log("未找到通讯录标签,请检查微信界面或无障碍权限");
exit();
}
// 2. 查找指定好友(替换为你的好友昵称或备注)
var friendName = "张三";
var friendNode = text(friendName).findOne(5000);
if (!friendNode) {
friendNode = desc(friendName).findOne(3000);
}
if (friendNode) {
friendNode.click();
sleep(1500);
} else {
log("未找到好友:" + friendName + "。若好友不在当前屏幕可见区域,需先滑动列表");
exit();
}
// 3. 定位输入框并输入内容
var inputBox = className("EditText").findOne(5000);
if (inputBox) {
inputBox.setText("你好");
sleep(500);
} else {
log("未找到输入框");
exit();
}
// 4. 点击发送按钮
var sendBtn = text("发送").findOne(3000);
if (sendBtn) {
sendBtn.click();
log("消息已发送");
} else {
log("未找到发送按钮");
}
关键说明:
- 使用
text()或desc()替代id()/depth(),这是微信自动化中最稳定的定位方式。 findOne(timeout)会阻塞等待节点出现,比find()更适合处理UI加载延迟。- 微信通讯录为长列表,
findOne()仅能匹配当前屏幕可见节点。若好友不在可视区域,你需要先调用scrollDown()或结合className("ListView")/className("RecyclerView")进行滑动查找。 - 输入框使用
className("EditText")定位,部分微信版本可能需要配合id()过滤,建议用Hamibot的“布局分析”工具核对实际属性。
最佳实践建议:
- 始终在关键操作前加入
sleep()或waitFor(),避免UI未渲染完成导致查找失败。 - 昵称匹配可改用
textContains()或descContains()进行模糊查找,降低因空格或特殊字符导致的匹配失败。 - 微信对自动化操作有风控策略,建议控制执行频率,点击间隔保持在 500ms 以上,并避免短时间内大量重复操作。
- 运行前确保已授予Hamibot无障碍权限,并在系统设置中关闭Hamibot的电池优化,防止后台服务被系统回收。
你可以先用Hamibot的布局分析功能抓取当前微信界面的节点树,核对目标控件的 text、desc、className 属性后再微调选择器。提供具体报错或节点信息,我会帮你进一步优化脚本。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实