回答
这种情况在自动化脚本中很常见。click() 返回 true 仅表示无障碍服务成功向该控件节点派发了点击事件,并不代表应用层实际接收或处理了该事件。常见原因包括:
- 控件的
clickable属性为false,但实际通过父容器或自定义绘制响应点击。 - 应用使用了非标准 UI 框架(如 Flutter、游戏引擎或自定义 View),无障碍服务无法正确触发其内部逻辑。
- 点击事件被上层透明控件或父布局拦截。
解决方案:改用坐标点击
当 click() 无效时,最可靠的方式是获取控件的屏幕坐标,然后通过坐标模拟点击。示例代码如下:
// 文档地址 https://docs.hamibot.com/
var target = className("android.view.View").text("目标文本").findOne();
if (target) {
var rect = target.bounds();
// 使用无障碍服务坐标点击
click(rect.centerX(), rect.centerY());
// 如果设备已获取 Root 权限,可改用底层点击,成功率更高
// Tap(rect.centerX(), rect.centerY());
}
最佳实践建议:
- 优先使用坐标点击:对于
clickable为false或自定义控件,直接通过bounds()获取中心点坐标点击,可绕过无障碍服务的节点限制。 - 检查布局层级:有时实际响应点击的是父控件。可尝试
target.parent().click()或向上遍历查找真正处理事件的节点。 - 处理渲染延迟:部分界面元素在
findOne()返回时可能尚未完成绘制。在点击前加入sleep(300)或使用waitFor()等待控件稳定,可避免点击时机过早。 - 备用手势方案:若坐标点击仍无反应,可尝试
gesture(100, [[x1, y1], [x2, y2]])模拟极短滑动,或使用press(x, y, duration)模拟长按,部分控件对点击手势有严格判定。
按上述方法替换 click() 调用,通常能解决“返回 true 但无响应”的问题。如仍有特定场景无法触发,可提供该控件的布局分析截图或属性信息,以便进一步定位。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实