Skip to content

杂项 - DeekeScript

DeekeScript 对象提供了直接获取无障碍节点原始数据的能力,适合需要自定义节点处理的场景。相比 UiSelector/UiObject,DeekeScript 可以一次性获取所有节点数据,性能更好,适合批量处理。

获取单个节点并进行点击、输入等操作,请使用 UiSelectorUiObject

version()

返回: {number}

获取当前 DeekeScript 框架版本号。

javascript
console.log(DeekeScript.version());

readFile(path)

参数: path {string} 相对于 JS 项目根目录的文件路径

返回: {string | null} 文件内容,失败返回 null

读取 JS 项目目录下的文件内容。

javascript
let content = DeekeScript.readFile('/config/settings.json');
if (content) {
    console.log(content);
}

getProjectRoot()

返回: {string}

获取当前 JS 项目的根目录绝对路径。

javascript
let root = DeekeScript.getProjectRoot();
console.log('项目根目录:' + root);

getNodeFields()

返回: {string[]} 字段名字符串数组

获取可用于 getAllAccessibilityNodeInfo() 的节点字段名列表。

javascript
let fields = DeekeScript.getNodeFields();
console.log('可用字段:' + fields.join(', '));
// 输出:key, viewIdResourceName, text, contentDescription, className, ...

getAllAccessibilityNodeInfo(bool, fields)

参数:

  • bool {boolean} true 为复杂模式(包含所有字段),false 为简单模式
  • fields {string[]} 需要返回的字段名数组,可通过 getNodeFields() 获取完整字段列表

返回: { nodes: DeekeNodeInfo[] } | null 节点信息对象,无障碍服务未启用时返回 null

一次性获取当前界面所有控件的节点信息。

节点字段说明

字段名类型说明
keystring节点唯一标识
viewIdResourceNamestring资源 ID
textstring文本内容
contentDescriptionstring内容描述
classNamestring类名
childCountnumber子节点数量
packageNamestring所属包名
hintTextstring提示文本
inputTypenumber输入类型
drawingOrdernumber绘制顺序
depthnumber层级深度
maxTextLengthnumber最大文本长度
isPasswordboolean是否是密码框
boundsInScreenDeekeBounds在屏幕中的位置
boundsInParentDeekeBounds在父节点中的位置
isClickableboolean是否可点击
isCheckableboolean是否可勾选
isCheckedboolean是否已勾选
isEditableboolean是否可编辑
isEnabledboolean是否启用
isScrollableboolean是否可滚动
isSelectedboolean是否已选中
isVisibleToUserboolean对用户是否可见
isFocusableboolean是否可聚焦
isFocusedboolean是否已聚焦
isLongClickableboolean是否可长按
isDismissableboolean是否可关闭
childrenDeekeNodeInfo[]子节点数组

DeekeBounds 对象

字段名类型说明
leftnumber左边界 X 坐标
topnumber上边界 Y 坐标
widthnumber宽度
heightnumber高度

基础示例

javascript
// 获取简单模式的所有节点
let result = DeekeScript.getAllAccessibilityNodeInfo(false, DeekeScript.getNodeFields());
if (result && result.nodes) {
    console.log('找到 ' + result.nodes.length + ' 个节点');
    result.nodes.forEach(node => {
        if (node.text) {
            console.log('节点文本:' + node.text + ',类名:' + node.className);
        }
    });
}

筛选指定字段

javascript
// 只获取需要的关键字段,提升性能
let fields = ['text', 'className', 'isClickable', 'boundsInScreen'];
let result = DeekeScript.getAllAccessibilityNodeInfo(false, fields);
if (result && result.nodes) {
    result.nodes.forEach(node => {
        if (node.isClickable) {
            console.log('可点击节点:' + node.text + ' (' + node.className + ')');
            if (node.boundsInScreen) {
                console.log('  位置:left=' + node.boundsInScreen.left + 
                    ', top=' + node.boundsInScreen.top +
                    ', width=' + node.boundsInScreen.width +
                    ', height=' + node.boundsInScreen.height);
            }
        }
    });
}

遍历子节点

javascript
// 递归遍历节点树
let fields = ['text', 'className', 'children'];
let result = DeekeScript.getAllAccessibilityNodeInfo(true, fields);

function traverseNodes(nodes, depth) {
    if (!nodes) return;
    nodes.forEach(node => {
        let indent = '  '.repeat(depth);
        console.log(indent + '├─ ' + (node.text || node.className || '(无文本)'));
        if (node.children) {
            traverseNodes(node.children, depth + 1);
        }
    });
}

if (result && result.nodes) {
    traverseNodes(result.nodes, 0);
}

AutoJS文档 Released under the ISC License.