Autox.js 布局分析器 查看屏幕上每个控件的 ID 类名 文字和层级
写不出选择器?让布局分析器帮你
当你想点击屏幕上的一个按钮,但不知道它的 text、id、className 是什么值时,布局分析器就是你的救星。它是 Autox.js 内置的控件树可视化工具,类似 Android Studio 的 Layout Inspector。
打开布局分析器
三种方式:
- 悬浮窗:点击悬浮条上的"放大镜"图标
- 侧栏菜单:左侧栏 → 布局分析器
- 代码里:执行
auto.openLayoutInspector()
打开后,屏幕变成半透明蒙层,你可以在蒙层上滑动(部分机型需要先关闭蒙层才能操作),点击任意控件。
点一下看什么
在蒙层上点击一个按钮(比如"登录"),会弹出详情面板,展示这个控件的完整信息:
| 字段 | 含义 | 选择器写法 |
|---|---|---|
| id | 资源 ID(如 com.example:id/btn_login) | id("btn_login") |
| text | 显示的文字 | text("登录") |
| className | 类名(如 android.widget.Button) | className("Button") |
| desc | contentDescription | desc("登录") |
| bounds | 坐标范围 [left, top, right, bottom] | 坐标操作用 |
| depth | 在控件树里的层级深度 | 父子遍历时有用 |
| childCount | 子控件数量 | 辅助定位 |
实战:生成选择器代码
假设你点了一个按钮,布局分析器显示:
id: com.example.app:id/confirm_btn
text: 确定
class: android.widget.Button
desc: null
方案一:用 id(最精准,首选)
id("confirm_btn").click();
id 是控件唯一的标识符,稳定性最好。但要注意:系统控件和第三方 App 的自定义控件可能没有 id,或者 id 是自动生成的(如 android:id/0x7f...),这种 id 下次 App 更新可能变。
方案二:用 text(最直观)
text("确定").click();
text 最容易理解,但稳定性差——如果 App 改成"确认"、"OK"、"好的",脚本就失效了。中文 App 尤其要注意这个。
方案三:class + text 组合(平衡方案)
className("Button").text("确定").click();
同时匹配类名和文字,比单独用 text 更精准,能避免点到其他同名文字的控件。
方案四:desc(无障碍描述)
desc("确认按钮").click();
contentDescription 是开发者为残障用户添加的描述文本,很多 App 没填这个字段,但如果有,稳定性和 id 差不多。
层级遍历:找父控件或子控件
布局分析器还能让你看到控件树的父子关系。比如一个按钮嵌套在一个卡片容器里:
FrameLayout
└── LinearLayout (id: card)
└── TextView (text: 标题)
└── Button (text: 确定) ← 我要点这个
你可以从父控件往下找,或者从子控件往上找:
// 从父容器下找 Button
id("card").findOne().findOne(className("Button")).click();
// 或直接用层级关系
let btn = id("card").findOne();
btn.descendants().filter(c => c.className() === "Button").forEach(c => c.click());
实战建议
- 点了没反应:某些游戏或全屏 App 的控件树不暴露,布局分析器也读不到——这时候需要切换到图像识别方案
- 每次都重样:如果 App 里的 id 是随机生成的,放弃 id 方案,改用 class + text 或 bounds
- 相似控件太多:两个 Button 都叫"确定",可以加上层级约束(哪个在上面/哪个在哪个父容器里)
布局分析器 vs 录制器
| 对比 | 布局分析器 | 悬浮窗录制 |
|---|---|---|
| 目的 | 查看控件属性 | 记录操作动作 |
| 输出 | 控件详情信息 | 完整 JS 脚本 |
| 使用时机 | 写脚本时查参数 | 不知道怎么写时让它帮你写 |
| 学习效果 | 理解选择器 API | 快速上手 |
实际开发中,两者配合最好:先录制一版 → 看生成的代码 → 对不确定的控件用布局分析器核实 → 手动优化。