回答
输入法弹出后会覆盖部分界面,并产生新的窗口层级,这会影响控件查找的准确性。为解决此问题,你可以通过设置窗口过滤器(WindowFilter)来控制选择器搜索的目标窗口,从而避开输入法窗口对元素定位的干扰。
解决方案:使用 auto.setWindowFilter() 过滤掉输入法窗口
输入法窗口通常具有特定的类名或标题,可以通过判断这些特征将其排除在搜索范围之外。
示例代码:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
// 设置窗口过滤器,只在非输入法窗口中进行控件查找
auto.setWindowFilter(function(window) {
// 排除常见的输入法包名
var inputMethodPackages = [
'com.sohu.inputmethod.sogou',
'com.baidu.input',
'com.google.android.inputmethod.latin',
'com.tencent.qqpinyin'
// 可根据实际设备添加更多输入法包名
];
return !inputMethodPackages.includes(window.packageName);
});
这样设置后,Hamibot 的选择器(如 text("登录").find()) 将不会在输入法窗口中搜索,避免因输入法弹出导致找不到目标控件的问题。
补充建议:
-
等待输入法完全弹出后再操作
有时输入法是动态弹出的,建议稍作延时或使用sleep(500)等待其稳定后再执行查找。 -
结合 OCR 定位作为备用方案
如果控件被遮挡且无法准确获取,可配合 OCR 文字识别定位关键文本区域:if (!requestScreenCapture()) { toastLog("请授予截屏权限"); hamibot.exit(); } const img = captureScreen(); const result = ocr.recognizeText(img); if (result.includes("手机号")) { // 使用坐标点击等方式进行操作 } -
恢复默认窗口过滤行为
若后续需要重新启用所有窗口的搜索,可以清除过滤器:auto.setWindowFilter(null); // 恢复默认行为,在活跃窗口中搜索
通过合理使用 auto.setWindowFilter(),能有效规避输入法弹出带来的定位问题,提升脚本稳定性。
ℹ️ 本回答由 AI 生成,内容仅供参考