Files

92 lines
2.5 KiB
Markdown

# 统一选择器
> [返回文档中心](README.md) · [动作目录](actions/README.md)
选择器只负责从当前页面中找出匹配节点,不等待、不点击,也不默认选择第一个。
## 1. 当前字段 **[已实现]**
~~~json
{
"resourceId": "com.example.target:id/continue_button",
"text": "继续",
"contentDescription": "继续操作",
"className": "android.widget.Button",
"clickable": true
}
~~~
规则:
- 已提供字段按 AND 组合。
- `resourceId`、`text`、`contentDescription` 和 `className` 精确匹配。
- `clickable` 匹配节点自身状态。
- 至少提供一个字段。
- 当前只遍历 `rootInActiveWindow`。
## 2. 简单扩展 **[提案]**
~~~json
{
"resourceId": "com.example.target:id/continue_button",
"text": {
"source": "TEXT_OR_DESCRIPTION",
"mode": "CONTAINS_ANY",
"values": ["继续", "下一步"]
},
"state": {
"visible": true,
"enabled": true
},
"region": {
"minXRatio": 0.0,
"maxXRatio": 1.0,
"minYRatio": 0.5,
"maxYRatio": 1.0
}
}
~~~
首批扩展建议只支持:
- 文字来源:`TEXT`、`CONTENT_DESCRIPTION`、`TEXT_OR_DESCRIPTION`。
- 文字模式:`EXACT`、`CONTAINS`、`CONTAINS_ANY`。
- 状态:`visible`、`enabled`、`clickable`、`selected`、`checked`、`focused`、`scrollable`。
- 区域:屏幕比例矩形,节点中心点落在区域内即匹配。
`visible` 统一定义为 `isVisibleToUser == true`,且屏幕边界非空并与屏幕相交。
正则、祖先/后代关系、逻辑嵌套和多窗口查询等到出现明确场景时再增加。
## 3. 候选数量
不同动作决定如何使用匹配结果:
- WAIT v1 要求恰好一个。
- CLICK、INPUT 和 BACK 以外的单目标动作默认要求一个。
- EXTRACT 可以显式声明 `ONE` 或 `MANY`。
- 多个候选时不默认选第一个。
CLICK 可以把文字节点向上解析为最近的可点击祖先;这是 CLICK 的规则,不改变基础选择器结果。
## 4. 查询接口
建议公共接口保持简单:
~~~kotlin
fun findAll(
root: AccessibilityNodeInfo,
selector: NodeSelector,
): List<UiNodeRef>
~~~
每次轮询读取新 root。同一轮查询结束后释放不再使用的节点;动作完成后不保留旧节点引用。
## 5. 实现顺序
1. 保留 v1 精确匹配。
2. 增加可见、启用和边界检查。
3. 增加 `TEXT_OR_DESCRIPTION` 和 `CONTAINS_ANY`。
4. 增加屏幕比例区域。
5. 只有实际任务需要时再扩展复杂选择器。