feat(任务): 「动作配置」分栏——步骤默认值 + 动作录制器
需求:滑动要能"我自己录制";在自定义动作旁边加一个分栏,能配动作默认值、
能录制操作当动作、能自己建立动作。
**步骤默认值**(core/step_defaults.py,存 app_meta.step_defaults 单键,不建表):
- 覆盖 滑动(方向/时长区间/幅度/抖动/拟人)、点击(等待超时)、长按(时长/超时)、
等待(区间)、按键、输入文字(模式/候选文案/清空);
- **只影响之后新建的步骤**,已有步骤不动;新建时 `_makeStep` 用出厂值打底 + 默认值覆盖;
- 只存与出厂值不同的字段(以后调出厂默认,没配过的能跟着走);
- 字段白名单 + 范围夹取(SPEC):越界夹边界、非法值丢弃 → 手改 JSON 塞脏值也进不来。
**动作录制器**(static/admin/recorder.js):
- 在设备画面上点/划/按键/输入 → 自动翻译成步骤:
点→命中元素记「点击元素」(选择器)、没命中退化成「点击坐标」(百分比);
划→「滑动」方向/幅度/时长全按你实际操作算;停顿≥1s 可选记成「等待」(±15%);
- 两个入口:动作配置页「录制动作」(存成自定义动作,进动作库复用)、
步骤编辑器滑动那步的「录制手势」(只取手势回填该步骤);
- 画面+元素树走 /api/uiauto/snapshot 一次取齐,**每次操作后自动刷新**,
所以下一次点击用的是最新的树;执行仍走 /api/screen/{tap,swipe,key,text}(与大屏同一套)。
接口:GET/POST /api/step_defaults(读登录、写需 tasks 权限)。
文档:TASK_DEV §3.1(含翻译规则表与三条实现口径)、API §2.3、DATA_MODEL §5、README。
自测(无头浏览器 + CDP 真模拟拖动):默认值保存→回读→新建滑动步骤确实预填 0.42;
录制器取到画面与元素树;模拟"按住往上划"→ 录出
{direction:up, distance_ratio:0.5, duration_min:0.47, humanize:true}(幅度/时长按实际操作算);
恢复出厂链路 0.6 通过;页面无 JS 报错。
This commit is contained in:
@@ -124,6 +124,8 @@
|
||||
| POST | `/api/custom_actions` | T | 新建自定义动作 |
|
||||
| PUT | `/api/custom_actions/<action_id>` | T | 更新自定义动作 |
|
||||
| DELETE | `/api/custom_actions/<action_id>` | T | 删除自定义动作 |
|
||||
| GET | `/api/step_defaults` | L | 步骤默认值(生效值 + 出厂值 + 字段规格,供「动作配置」页画表单) |
|
||||
| POST | `/api/step_defaults` | T | 保存步骤默认值(只落与出厂值不同的字段) |
|
||||
| GET | `/api/uiauto/status` | L | uiautodev 服务是否在跑 |
|
||||
| GET | `/api/uiauto/devices` | D | 抓元素可选设备 |
|
||||
| GET | `/api/uiauto/elements` | D | 设备 UI 元素树 |
|
||||
|
||||
@@ -277,6 +277,7 @@ UTF-8 等价于字节序)。
|
||||
| `deployment_id` | 库唯一标识(uuid),用于识别"这份备份来自哪个库" | 同上 |
|
||||
| `deployment_claimed_at` | 标签写入时间 | 同上 |
|
||||
| `notify_webhooks` | **通知 / Webhook 全部配置**(JSON:`{version, settings, webhooks[]}`,见 [NOTIFY.md](NOTIFY.md) §4)。**不建表**——新增/删除 webhook 都只改这一个键 | 系统 → 通知 页 |
|
||||
| `step_defaults` | **步骤默认值**(JSON:`{步骤类型: {字段: 值}}`,见 [TASK_DEV.md](TASK_DEV.md) §3.1)。新建步骤时预填用。**只存与出厂值不同的字段**,这样以后调出厂默认能跟着走 | 任务 → 动作配置 页 |
|
||||
|
||||
> ⚠️ `agent_api_key` 是**明文存储**,导出备份的 zip 里也含它——备份预览会固定给出"含敏感信息"告警。
|
||||
> **同理 `notify_webhooks` 里的 webhook URL 本身就是凭据**(企业微信 `?key=`、钉钉 `?access_token=`、
|
||||
|
||||
+43
-1
@@ -10,7 +10,7 @@
|
||||
|
||||
- [1. 核心概念](#1-核心概念)
|
||||
- [2. 通用步骤任务 generic_steps](#2-通用步骤任务-generic_steps)
|
||||
- [3. 20 种步骤全表](#3-20-种步骤全表)
|
||||
- [3. 20 种步骤全表](#3-20-种步骤全表)(含 [3.1 步骤默认值与动作录制](#31-步骤默认值与动作录制任务--动作配置))
|
||||
- [4. 容器步骤与公共参数](#4-容器步骤与公共参数)(含 [4.5 公共巡检](#45-公共巡检任务级独立于步骤画布))
|
||||
- [5. 选择器与元素定位](#5-选择器与元素定位)
|
||||
- [6. 自定义动作](#6-自定义动作)
|
||||
@@ -135,6 +135,48 @@ from .generic import task # 触发 @register_task(当前唯一任务类型)
|
||||
| 19 | `notify` | 发通知 | — | `title`("")、`message`("")、`level`("info") | — | 推一条**自定义**通知(事件 `task.notify.custom`):标题正文自己写,支持 `{device} {serial} {job} {time} {app} {screen}`;谁收到取决于 webhook 的事件订阅。两者都空则跳过 |
|
||||
| 20 | `stop_self` | 停止本设备 | — | `reason`("") | — | 只停**本设备**的任务(其它设备照跑):置 worker 停止位,后续步骤不再执行,任务记成**被停止而不是失败**(不触发重试) |
|
||||
|
||||
### 3.1 步骤默认值与动作录制(任务 → 动作配置)
|
||||
|
||||
**步骤默认值**:新建步骤时预填的参数(`core/step_defaults.py`,存 `app_meta.step_defaults`)。
|
||||
在「任务 → 动作配置」页改,**只影响之后新建的步骤**,已有步骤里的参数不动。
|
||||
|
||||
覆盖范围:`swipe`(方向/时长区间/幅度/抖动/拟人)、`click`(等待超时)、
|
||||
`long_click`(长按时长/超时)、`wait`(时长区间)、`key_event`(按键)、
|
||||
`input_text`(模式/候选文案/是否清空)。
|
||||
|
||||
三条实现口径:
|
||||
|
||||
- **只存与出厂值不同的字段**——以后调出厂默认时,没配过的字段能跟着更新;
|
||||
- 字段**白名单 + 范围夹取**(`SPEC`):越界值夹到边界、非法值直接丢弃,
|
||||
不会把手改 JSON 塞进来的脏值带进任务;
|
||||
- 前端 `_makeStep` 用 `STEP_LIB` 出厂值打底,再用这里的默认值覆盖,
|
||||
`/api/step_defaults` 在打开「任务」Tab 时加载一次。
|
||||
|
||||
**动作录制**(`static/admin/recorder.js`):在设备画面上点/划/按键/输入,
|
||||
自动翻译成步骤。两个入口:
|
||||
|
||||
| 入口 | 模式 | 产出 |
|
||||
|---|---|---|
|
||||
| 动作配置页「● 录制动作」 | `action` | 录完存成**自定义动作**(进动作库,拖进任何任务画布) |
|
||||
| 步骤编辑器里滑动那一步的「● 录制手势」 | `gesture` | 只取最后一个手势,**回填当前滑动步骤**的方向/幅度/时长 |
|
||||
|
||||
翻译规则:
|
||||
|
||||
| 你做的 | 记成 | 依据 |
|
||||
|---|---|---|
|
||||
| 点一下 | `click`(选择器) | 从当前元素树里取**包含该点的最小可点击元素**,用它的 `suggested` 选择器 |
|
||||
| 点一下(没命中元素) | `click_xy` | 退化成屏幕百分比坐标 |
|
||||
| 按住划一下 | `swipe` | 方向(dx/dy 谁大取谁)、幅度(划距 ÷ 屏高/宽)、时长(你按住的毫秒数) |
|
||||
| 停顿(间隔 ≥1s) | `wait` | 真实间隔 ±15%,可在录制器里关掉「记录停顿」 |
|
||||
| 按键 / 输入 | `key_event` / `input_text` | 输入文字按**原样**记 `fixed_text`(不是随机候选) |
|
||||
|
||||
实现要点(改之前先看):
|
||||
|
||||
- 画面与元素树走 **`/api/uiauto/snapshot` 一次取齐**(截图+元素背靠背取,避免"框落在旧位置");
|
||||
**每次操作后自动刷新**,所以下一次点击能用到最新的树。
|
||||
- 录制器**只负责翻译**,真正执行仍走 `/api/screen/{tap,swipe,key,text}`——和设备大屏同一套接口。
|
||||
- 录到的步骤在列表里可上移/下移/删除;存成动作走现有 `POST /api/custom_actions`(不新增表)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 容器步骤与公共参数
|
||||
|
||||
Reference in New Issue
Block a user