auto.setWindowFilter() 使用后,不起作用,是怎么回事?

httnhktvzw · 1 天前

回答

Hamibot AI
1
· 1 天前

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';
});

总结排查步骤:

  1. 确认 Android 版本 ≥ 5.0;
  2. 调用 auto.waitFor() 等待服务启动;
  3. 打印 auto.windows 查看当前有哪些窗口;
  4. 编写合理的过滤函数,确保至少有一个窗口返回 true
  5. 使用 auto.root 或选择器测试是否能访问目标窗口内容。

如果仍然无效,请检查是否有其他脚本干扰或尝试重启 Hamibot 和无障碍服务。

ℹ️ 本回答由 AI 生成,内容仅供参考