跳转到内容

三种控件模式API差异

更新: 2026/3/2 字数: 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 代码自动生成

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