Files

93 lines
2.5 KiB
Markdown

# EXTRACT_TEXT 与 EXTRACT
> [返回动作目录](README.md) · [统一选择器](../selector.md) · [值与输出](../values-and-outputs.md)
## 1. EXTRACT_TEXT **[已实现]**
~~~json
{
"id": "read-status",
"action": "EXTRACT_TEXT",
"packageName": "com.example.target",
"selector": {
"resourceId": "com.example.target:id/status"
},
"outputField": "status",
"timeoutMs": 3000
}
~~~
当前行为:
- 等待 selector 匹配唯一节点。
- 优先读取 text,空时读取 contentDescription。
- trim 后为空则继续等待。
- 把非空文字追加到 `outputField` 对应的字符串列表。
- 不自动滚动。
## 2. EXTRACT **[提案]**
EXTRACT 用于读取一个或多个节点的明确字段:
~~~json
{
"id": "read-items",
"action": "EXTRACT",
"packageName": "com.example.target",
"selector": {
"className": "android.widget.TextView",
"state": {
"visible": true
}
},
"cardinality": "MANY",
"fields": [
{
"name": "text",
"source": "TEXT",
"type": "TEXT",
"trim": true
}
],
"outputField": "items",
"timeoutMs": 5000
}
~~~
首批字段来源:
- `TEXT`
- `CONTENT_DESCRIPTION`
- `RESOURCE_ID`
- `CLASS_NAME`
- `BOUNDS`
- `CHECKED`、`SELECTED`、`ENABLED`
首批类型只需 `TEXT`、`INTEGER`、`DECIMAL` 和 `BOOLEAN`。转换失败明确返回错误,不使用默认值代替。
`cardinality` 支持 `ONE` 和 `MANY`。MANY 按控件树顺序输出;排序、去重和复杂对象分组等到实际需求出现时再增加。
## 3. 执行规则
1. 等待包名、Activity 和 selector。
2. 按 cardinality 校验数量。
3. 从同一页面快照读取声明字段。
4. 完成 trim 和简单类型转换。
5. 所有值都成功后一次性发布 output。
EXTRACT 不点击、不滚动、不读取未声明字段,也不保存完整控件树。
## 4. 结果码
见[结果码总表](README.md#结果码总表)。EXTRACT 使用 `OK`、`TARGET_NOT_FOUND`、`TARGET_AMBIGUOUS` 和 `ACTION_FAILED`(文本为空、字段缺失或类型转换失败)。
字段缺失与类型转换失败是否需要独立码,等 EXTRACT 实现时按实际排查需要决定,不提前登记。
## 5. 兼容方式
EXTRACT_TEXT 保留现有字符串列表结果。实现 EXTRACT 后,可以在内部把 EXTRACT_TEXT 转换为 ONE + TEXT 读取,但对外结果结构保持不变。
## 6. 测试
覆盖 text、contentDescription 回退、空文本、多个节点、MANY、字段缺失、类型转换、总超时和不自动滚动。