跳转到内容

三种控件模式API差异 ​

更新: 2026/9/29 字数: 0 字 时长: 0 分钟

无障碍模式(推荐) ​

基于 Android 无障碍服务(AccessibilityService) 实时获取控件树,响应速度快、稳定性高,适用于绝大多数自动化场景。

HID / 数字助理模式 ​

基于 AssistService 辅助服务获取控件树结构,适用于部分系统限制无障碍权限的设备环境,相对无障碍模式更安全,常常配合 HID 外置触控硬件一起使用。

ADB Shell / Root 模式(XML 解析) ​

通过 系统布局层级导出并解析 XML 获取控件树结构,适用于无障碍受限或 Root 设备的高级调试场景。

Selector 选择器差异 ​

👉 选择器语法与大部分 API 完全一致 👉 默认使用 无障碍模式

可通过 selector(mode) 显式指定模式:

无障碍模式(默认模式)

js
// 不加 selector,默认无障碍模式
text("任务管理").findOne();
// 或者显式写 0
selector().text("任务管理").findOne();

HID / 数字助理模式

js
// selector(1) 表示 HID / 数字助理模式
selector(1).text("任务管理").findOne();

ADB Shell / XML 解析模式

js
// selector(2) 表示 ADB Shell / XML 解析模式
selector(2).text("任务管理").findOne();

模式编号说明

模式编号模式名称说明
0(默认)无障碍模式实时控件树,推荐使用
1HID / 数字助理AssistService 获取
2ADB/XML 模式系统布局解析

示例

无障碍模式 查找控件

js

// var uiObject = text("任务管理").className("android.widget.TextView").visibleToUser(true).findOne(1000);
var uiObject = selector().text("任务管理").className("android.widget.TextView").visibleToUser(true).findOne(1000);
if (uiObject) {
    console.log(uiObject);
} else {
    toastLog("未找到符合条件的控件");
}

HID / 数字助理模式 查找控件

js
var uiObject = selector(1).text("任务管理").className("android.widget.TextView").visibleToUser(true).findOne(1000);
if (uiObject) {
    console.log(uiObject);
} else {
    toastLog("未找到符合条件的控件");
}

ADB/XML 模式 查找控件

js
var uiObject = selector(2).text("任务管理").className("android.widget.TextView").visibleToUser(true).findOne(1000);
if (uiObject) {
    console.log(uiObject);
} else {
    toastLog("未找到符合条件的控件");
}

Selector 附加选择条件差异 ​

选择器条件 API无障碍模式HID / 数字助理模式ADB / XML 模式
UiSelector.algorithm(algorithm)✅❌不支持❌不支持
UiSelector.text(str)✅✅✅
UiSelector.textContains(str)✅✅✅
UiSelector.textStartsWith(prefix)✅✅✅
UiSelector.textEndsWith(suffix)✅✅✅
UiSelector.textMatches(reg)✅✅✅
UiSelector.desc(str)✅✅✅
UiSelector.descContains(str)✅✅✅
UiSelector.descStartsWith(prefix)✅✅✅
UiSelector.descEndsWith(suffix)✅✅✅
UiSelector.descMatches(reg)✅✅✅
UiSelector.id(resId)✅✅✅
UiSelector.idContains(str)✅✅✅
UiSelector.idStartsWith(prefix)✅✅✅
UiSelector.idEndsWith(suffix)✅✅✅
UiSelector.idMatches(reg)✅✅✅
UiSelector.className(str)✅✅✅
UiSelector.classNameContains(str)✅✅✅
UiSelector.classNameStartsWith(prefix)✅✅✅
UiSelector.classNameEndsWith(suffix)✅✅✅
UiSelector.classNameMatches(reg)✅✅✅
UiSelector.packageName(str)✅✅✅
UiSelector.packageNameContains(str)✅✅✅
UiSelector.packageNameStartsWith(prefix)✅✅✅
UiSelector.packageNameEndsWith(suffix)✅✅✅
UiSelector.packageNameMatches(reg)✅✅✅
UiSelector.bounds(left, top, right, bottom)✅✅✅
UiSelector.boundsInside(left, top, right, bottom)✅✅✅
UiSelector.boundsContains(left, top, right, bottom)✅✅✅
UiSelector.drawingOrder(order)✅✅✅
UiSelector.visibleToUser([b = true])✅✅✅
UiSelector.clickable([b = true])✅✅✅
UiSelector.longClickable([b = true])✅✅✅
UiSelector.checkable([b = true])✅✅✅
UiSelector.selected([b = true])✅✅✅
UiSelector.enabled([b = true])✅✅✅
UiSelector.scrollable([b = true])✅✅✅
UiSelector.editable([b = true])✅✅✅
UiSelector.multiLine([b = true])✅❌不支持❌不支持
UiSelector.findOne()✅✅✅
UiSelector.findOne(timeout)✅✅✅
UiSelector.findOnce()✅✅✅
UiSelector.findOnce(i)✅✅✅
UiSelector.find()✅✅✅
UiSelector.untilFind()✅✅✅
UiSelector.exists()✅✅✅
UiSelector.waitFor()✅✅✅
UiSelector.filter(f)✅✅✅

注释说明

  • ✅ 代表此模式下支持该选择器条件
  • ❌ 代表此模式下不支持该选择器条件

UiObject 控件差异 ​

UiObject 方法无障碍模式HID / 数字助理模式ADB / XML 模式
UiObject.click()✅⚠通过$hid⚠通过$shellHttp
UiObject.clickCenter()✅⚠通过$hid⚠通过$shellHttp
UiObject.longClick()✅⚠通过$hid⚠通过$shellHttp
UiObject.setText(text)✅⚠通过$input⚠通过$input
UiObject.copy()✅⚠通过$input⚠通过$input
UiObject.cut()✅⚠通过$input⚠通过$input
UiObject.paste()✅⚠通过$input⚠通过$input
UiObject.setSelection(start, end)✅⚠通过$input⚠通过$input
UiObject.select()✅❌不支持❌不支持
UiObject.collapse()✅❌不支持❌不支持
UiObject.expand()✅❌不支持❌不支持
UiObject.show()✅❌不支持❌不支持
UiObject.scrollForward()✅⚠通过$hid⚠通过$shellHttp
UiObject.scrollBackward()✅⚠通过$hid⚠通过$shellHttp
UiObject.scrollUp()✅⚠通过$hid⚠通过$shellHttp
UiObject.scrollDown()✅⚠通过$hid⚠通过$shellHttp
UiObject.scrollLeft()✅⚠通过$hid⚠通过$shellHttp
UiObject.scrollRight()✅⚠通过$hid⚠通过$shellHttp
UiObject.children()✅✅✅
UiObject.childCount()✅✅✅
UiObject.child(i)✅✅✅
UiObject.parent()✅✅✅
UiObject.bounds()✅✅✅
UiObject.boundsInParent()✅✅✅
UiObject.drawingOrder()✅✅✅
UiObject.id()✅✅✅
UiObject.text()✅✅✅
UiObject.findByText(str)✅✅✅
UiObject.findOne(selector)✅✅指定selector(1)✅指定selector(2)
UiObject.find(selector)✅✅指定selector(1)✅指定selector(2)

注释说明

  • ✅ 代表此模式下支持此方法
  • ⚠ 代表此模式下通过其他模块下的 API 代替此方法
  • ❌ 代表此模式下不支持此方法

总结

  • HID / 数字助理模式 和 ADB / XML 模式 不能对控件直接点击、长按、滑动、输入、拷贝等操作,只能依赖其他模块里的API来实现

示例

无障碍模式 查找控件并点击

js

var uiObject = selector().desc("任务管理").className("android.widget.LinearLayout").visibleToUser(true).clickable(true).enabled(true).findOne(1000);
if (uiObject) {
  var success = uiObject.click();
  console.log("click:" + success);

} else {
  toastLog("未找到符合条件的控件");
}

HID / 数字助理模式 查找控件并点击

js
var uiObject = selector(1).text("任务管理").className("android.widget.TextView").visibleToUser(true).findOne(1000);
if (uiObject) {
  //我这里用ESP32的S2开发板进行触控点击中心点坐标 
  $hid.esp32otg.click(uiObject.bounds().centerX(), uiObject.bounds().centerY());
  sleep(1000);
} else {
    toastLog("未找到符合条件的控件");
}

ADB/XML 模式 查找控件并点击

js
var uiObject = selector(1).desc("任务管理").className("android.widget.LinearLayout").visibleToUser(true).clickable(true).enabled(true).findOne(1000);
if (uiObject) {
  //我这里用 $shellHttp 模块进行触控点击中心点坐标  
  $shellHttp.click(uiObject.bounds().centerX(), uiObject.bounds().centerY());
  sleep(1000);

} else {
  toastLog("未找到符合条件的控件");
}

UiCollection 控件集合差异 ​

UiCollection 方法无障碍模式HID / 数字助理模式ADB / XML 模式
UiCollection.size()✅✅✅
UiCollection.get(i)✅✅✅
UiCollection.each(func)✅❌弃用❌弃用
UiCollection.empty()✅✅✅
UiCollection.nonEmpty()✅✅✅
UiCollection.find(selector)✅✅✅
UiCollection.findOne(selector)✅✅✅
  • ✅ 代表此模式下支持此方法
  • ❌ 代表此模式下不支持此方法

代码自动生成 ​

Bot.js Pro和云控后台的在线开发工具均支持控件节点的代码自动生成,你只需要选择对应的参数即可

Bot.js Pro 代码自动生成 ​

在线开发工具 代码自动生成 ​