2.5 KiB
2.5 KiB
EXTRACT_TEXT 与 EXTRACT
1. EXTRACT_TEXT [已实现]
{
"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 用于读取一个或多个节点的明确字段:
{
"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
}
首批字段来源:
TEXTCONTENT_DESCRIPTIONRESOURCE_IDCLASS_NAMEBOUNDSCHECKED、SELECTED、ENABLED
首批类型只需 TEXT、INTEGER、DECIMAL 和 BOOLEAN。转换失败明确返回错误,不使用默认值代替。
cardinality 支持 ONE 和 MANY。MANY 按控件树顺序输出;排序、去重和复杂对象分组等到实际需求出现时再增加。
3. 执行规则
- 等待包名、Activity 和 selector。
- 按 cardinality 校验数量。
- 从同一页面快照读取声明字段。
- 完成 trim 和简单类型转换。
- 所有值都成功后一次性发布 output。
EXTRACT 不点击、不滚动、不读取未声明字段,也不保存完整控件树。
4. 结果码
见结果码总表。EXTRACT 使用 OK、TARGET_NOT_FOUND、TARGET_AMBIGUOUS 和 ACTION_FAILED(文本为空、字段缺失或类型转换失败)。
字段缺失与类型转换失败是否需要独立码,等 EXTRACT 实现时按实际排查需要决定,不提前登记。
5. 兼容方式
EXTRACT_TEXT 保留现有字符串列表结果。实现 EXTRACT 后,可以在内部把 EXTRACT_TEXT 转换为 ONE + TEXT 读取,但对外结果结构保持不变。
6. 测试
覆盖 text、contentDescription 回退、空文本、多个节点、MANY、字段缺失、类型转换、总超时和不自动滚动。