回答
auto.setWindowFilter() 不起作用,通常由以下几个原因导致。你可以逐一排查:
1. Android 系统版本低于 5.0
auto.setWindowFilter() 仅在 Android 5.0 及以上系统有效。如果你的设备系统版本低于 Android 5.0,该函数将不会生效,选择器仍然只会搜索当前活跃窗口。
解决方法:确认你的设备系统版本是否满足要求。
2. 过滤器返回了 false 给所有窗口
如果你设置的过滤器函数对所有窗口都返回 false,那么选择器将无法找到任何可搜索的窗口,结果就是“看起来没作用”。
例如:
auto.setWindowFilter(function(window) {
return window.title === '不存在的应用';
});
如果当前没有窗口的 title 是“不存在的应用”,则所有窗口都会被排除。
正确做法:确保你的过滤条件能匹配到至少一个实际存在的窗口。可以先打印所有窗口信息来调试:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
console.log("所有窗口:", auto.windows);
for (var i = 0; i < auto.windows.length; i++) {
console.log("窗口 " + i + ": ", auto.windows[i].title, auto.windows[i].type);
}
然后根据输出内容编写正确的过滤逻辑。
3. 未等待无障碍服务启动
调用 auto.setWindowFilter() 前必须确保无障碍服务已经启用并准备就绪。
解决方法:使用 auto.waitFor() 确保自动化环境已就绪:
auto.waitFor();
auto.setWindowFilter(function(window) {
return window.title === 'QQ';
});
4. 设置后未重新获取布局根节点
设置 windowFilter 后,并不会自动刷新当前布局。你需要通过 auto.root 或选择器操作触发新的搜索。
注意:auto.root 返回的是 经过 WindowFilter 过滤后的第一个窗口 的根节点。
你可以验证是否生效:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
auto.setWindowFilter(function(window) {
return window.title === 'QQ';
});
sleep(1000); // 可选:稍作延迟确保窗口状态更新
if (auto.root) {
console.log("当前根节点来自窗口:", auto.root.window.title);
} else {
console.log("未找到符合条件的窗口,可能 filter 过滤掉了所有窗口");
}
5. 应用标题(title)判断不准确
window.title 并非总是等于应用包名或你预期的名字。它可能是空值、Activity 名称或其他字符串。
建议结合 window.packageName 判断更可靠:
auto.setWindowFilter(function(window) {
return window.packageName === 'com.tencent.mobileqq';
});
总结排查步骤:
- 确认 Android 版本 ≥ 5.0;
- 调用
auto.waitFor()等待服务启动; - 打印
auto.windows查看当前有哪些窗口; - 编写合理的过滤函数,确保至少有一个窗口返回
true; - 使用
auto.root或选择器测试是否能访问目标窗口内容。
如果仍然无效,请检查是否有其他脚本干扰或尝试重启 Hamibot 和无障碍服务。
ℹ️ 本回答由 AI 生成,内容仅供参考