auto.js 中文文档 下载 App

控件找不到怎么办——UiSelector 匹配失败的五种典型场景

排查思路

当你写的选择器找不到目标控件时,按以下顺序检查:

1. 控件是否真的存在

打开布局分析器,在目标界面上手动找这个控件。它在不在?如果不在:

2. 选择器条件是否精确

// 原始脚本
text("签到").click();

// 布局分析器里看到实际 text 是「立即签到领金币」
textContains("签到").click();  // ✅ 改成包含匹配

3. 等待时间够不够

// ❌ 不等
launchApp("淘宝");
text("签到").click();

// ✅ 智能等待
launchApp("淘宝");
text("签到").waitFor(10000).click();

4. 换一种选择器

// text 不行试 ID
if (text("签到").findOnce() == null) {
  id("btn_signin").click();
}

// ID 不行试 className + textContains
if (id("btn_signin").findOnce() == null) {
  className("Button").textContains("签到").click();
}

5. 用 filter 兜底

// 实在找不到具体属性,filter 里写详细逻辑
var target = className("Button").filter(function(v) {
  return v.text().indexOf("签到") >= 0 &&
         v.bounds().top > 500 &&
         v.bounds().bottom < 2000;
}).findOne();

if (target) target.click();

五种典型场景

场景一:文案含空格 / 换行

// 实际 text 是「立即签到\n领金币」
// text("立即签到") 找不到
// 解决:textContains("立即签到") 或 textMatches("立即签到.*")

场景二:动态生成控件

某些列表项(商品卡片、聊天消息)是动态创建的,在你执行 findOne 时控件还不存在。解决:用 waitFor 或循环检查。

场景三:列表滚动加载

目标控件在屏幕下方需要滚动才能出现。Auto.js 的选择器只能匹配当前屏幕上可见的控件,屏幕外的找不到。解决:先 scrollDown() 滚动,再查找。

场景四:弹窗遮挡

目标控件被一个弹窗盖在下面,布局分析器看不到。解决:先关闭弹窗,再操作。

场景五:游戏画面 / Canvas 控件

游戏的画面通常是渲染在 SurfaceView 或 Canvas 上的,Auto.js 的无障碍服务读不到任何控件。解决:切换到图像识别(images.findImage)或坐标点击。

验证成功

用 findOnce() 代替 findOne() 跑脚本,加详细日志:

var btn = text("签到").findOnce();
if (btn) {
  log("找到按钮,text=" + btn.text() + " bounds=" + JSON.stringify(btn.bounds()));
  btn.click();
} else {
  log("没找到按钮,检查界面");
}