helixlife-v5-cli 1.1.4 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
- **直播分类(必辨路由)**:
|
|
32
32
|
- `pathname` 为 `/edu/search`(顶栏搜索打开的页面):仅在 `main` 内点 `getByText('直播')`(与"课程"并列的结果 Tab),见 S-18 第 3 步;URL 常追加 `activeTab=live`。**禁止**改点侧栏 `to='/edu/courses'` 或套用 S-14。
|
|
33
33
|
- `pathname` 为 `/edu/courses` 或其它学习中心列表(非 `/edu/search`):「直播」指 S-14 顶栏「直播」 + 子类 → `/edu/lives?category=…`。
|
|
34
|
+
- **学习中心 · 子类消歧(必辨父 Tab)**:顶栏「课程 / 训练营 / 直播」为**一级 Tab**,各自下拉内有**独立子类**;**子类名可跨 Tab 重名**(实测「三十六策」同时存在于**课程**与**直播**下拉)。用户说「**课程**下的三十六策」→ **必须先点「课程」Tab 展开下拉**,再点该下拉内的「三十六策」→ 验收 `pathname` 仍为 `/edu/courses` 且带 `category=`、`title` 以 `课程-` 开头;**禁止**因子类名命中直播枚举而跳过「课程」Tab 直接去 `/edu/lives`。细则见「学习中心 · 一级 Tab 与子类消歧」。
|
|
34
35
|
- **播放页内切节(同课程:视频 / PDF / 作业等)**:用户说「下一个作业 / 下一节 / 下一份 PDF / 下一套小测」等,意图为**同一门课、同一大纲内**换到另一节时:
|
|
35
36
|
1. 先用 `eval`(如 `location.pathname`)或 `snapshot` 确认当前路由。
|
|
36
37
|
2. 若已在 `/edu/study/courses/{courseId}`:**必须优先**在本页 `main` 左侧「目录」(必要时先 `click` → `getByText('查看全部')` 展开)中,用 `getByText('<节完整标题>', { exact: true })` 直接 `click` 切节。视频、PDF、作业/小测等**均在本页完成**。
|
|
@@ -43,6 +44,26 @@
|
|
|
43
44
|
- **定位与多命中**:推荐 `page.locator('main').getByText('部分章节匹配', { exact: true })`;多卡并列时**必须先缩小到目标课程卡片**,避免 strict 或误触。
|
|
44
45
|
- 自测(2026-05-11):`/edu/search?keywords=…` 课程结果首条 `hover` 后,可见 tooltip 浮层(`helixlife-v5-cli run-code --filename=scripts/hover-partial-chapter-match.js` 返回 `tooltipLikeCount ≥ 1`)。
|
|
45
46
|
- **数据分析 · 详情页 · 上传文件**:用户说「上传文件 / 上传数据 / 换数据文件 / 导入 csv xlsx」等,且 `pathname` 为 `/analysis/{toolId}` 时,**一律走 D-2 三步弹窗流程**(打开弹窗 → 弹窗内选文件 → 弹窗内「确认」),**禁止**把左侧参数卡片底部「确认」(D-6 生成结果)当成上传确认。细则见下文「上传文件 · Agent 硬门禁」。
|
|
47
|
+
- **AI 应用 · 详情页 · 复制文本 / 编辑文本(须先 hover)**:用户说「复制文本 / 复制这段 / 复制这一块 / 编辑文本 / 编辑生成的结果 / 修改生成内容 / 改一下输出」等,且 `pathname` 为 `/application/{appId}`、右侧「生成结果」区已有输出块时,**必须先 `hover` 目标输出块**,再 `click` 该块浮动按钮 `getByLabel('复制文本')` 或 `getByLabel('编辑文本')`(见 AP-10 / AP-14、规约 C)。**禁止**在未 hover 时直接 `click` 这两个按钮(会 `visibility: hidden` 超时);**禁止**把输出区顶栏「全部复制」(AP-11,无需 hover)与单块「复制文本」混用;**禁止**在编辑模式下直接向 markdown 预览区 `type`/`fill`——须先点「编辑文本」进入编辑态(出现 `textbox` + 「保存」)再改内容。
|
|
48
|
+
|
|
49
|
+
#### AI 应用 · 详情页 · 复制/编辑输出 · Agent 硬门禁
|
|
50
|
+
|
|
51
|
+
**适用范围**:`pathname` 为 `/application/{appId}`;右侧「生成结果」区已有至少一块 AI 输出(markdown / 文本块等);用户要求复制或编辑**某一块**生成内容。
|
|
52
|
+
|
|
53
|
+
- **悬停前置(必做)**:「复制文本」「编辑文本」按钮默认隐藏,仅当鼠标悬停在**该输出块**(块标题或块正文区域)上时才显示(规约 C)。Agent **不得**跳过 hover 直接 `click`;也不得因 `snapshot` 未列出这两个按钮而判定「页面无编辑/复制能力」——应先 `hover` 目标块后再 `snapshot` 或 `click`。
|
|
54
|
+
- **用户说法 → 动作**:
|
|
55
|
+
- 「复制文本 / 复制这段 / 复制这一块 / 复制输出」→ **AP-10**(先 hover 目标块 → `getByLabel('复制文本')`)。
|
|
56
|
+
- 「编辑文本 / 编辑生成的结果 / 修改生成内容 / 改一下输出 / 我想编辑结果」→ **AP-14**(先 hover 目标块 → `getByLabel('编辑文本')` → 在 `textbox` 内修改 → `getByRole('button', { name: '保存' })`)。
|
|
57
|
+
- 「全部复制 / 复制全部 / 复制整份输出」→ **AP-11**(输出区顶栏 `getByLabel('全部复制')`,**无需** hover 某块)。
|
|
58
|
+
- **命令衔接**:hover 与 click 须在**同一次** `run-code`(或等价脚本)内连续执行;分两条 CLI 命令时 hover 态会丢失,导致 click 超时。推荐:
|
|
59
|
+
|
|
60
|
+
```js
|
|
61
|
+
await page.getByText('<输出块标题>', { exact: true }).hover();
|
|
62
|
+
await page.getByLabel('编辑文本').click(); // 或 '复制文本'
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- **编辑态验收**:点击「编辑文本」后,该块内出现可编辑 `textbox` 与「保存」按钮;修改完成后须点「保存」,再用 `snapshot` 确认回到 markdown 预览态。取消编辑可点「保存」旁的关闭图标(以页面实测为准)。
|
|
66
|
+
- **禁止误导**:不得向用户声称「已进入编辑模式」或「已复制」而未执行 hover → click 或未通过上述验收。
|
|
46
67
|
|
|
47
68
|
#### 任务范围与跨域
|
|
48
69
|
|
|
@@ -154,15 +175,16 @@
|
|
|
154
175
|
| 对话 · 新建会话 | S-09 |
|
|
155
176
|
| 工作站 · 新建任务弹窗 | S-10 |
|
|
156
177
|
| 工作台 · 进入子工作台 | S-11 |
|
|
157
|
-
| 应用 · 标准操作(搜索 / 级联分类 / 滚动加载 / 收藏 / 进入详情 / 多块复制 / mindmap) | S-12(细则 AP-1~AP-
|
|
178
|
+
| 应用 · 标准操作(搜索 / 级联分类 / 滚动加载 / 收藏 / 进入详情 / 多块复制 / mindmap) | S-12(细则 AP-1~AP-14 + 规约 A~H) |
|
|
158
179
|
| 应用 · 取消收藏 · 二次确认弹窗 | AP-8(规约 E) |
|
|
180
|
+
| 应用 · 详情 · 单块复制文本 / 编辑文本(须先 hover 输出块) | AP-10 / AP-14(规约 C · 硬门禁见上文) |
|
|
159
181
|
| 应用 · 多块输出 · 单块复制 vs 全部复制 | AP-10 / AP-11(规约 F) |
|
|
160
182
|
| 应用 · mindmap 缩放 vs 页面滚动 | AP-12 / AP-13(规约 G) |
|
|
161
183
|
| 应用 · 级联分类(必选到叶子级) | AP-3(规约 H) |
|
|
162
184
|
| 数据分析 · 列表 / 主·子分类 / 拼图 / 全局设置 / 卡片收藏 | S-13 |
|
|
163
185
|
| 数据分析 · 拼图工具子页(ABC 标注 · 生信工具 · 拖图 · 参考线 · TIFF/PDF 导出) | S-27(细则见「数据分析 · 拼图工具页」) |
|
|
164
186
|
| 数据分析 · 工具详情页(上传 / 验证 / 参数重置保存 / 确认出结果 / 顶栏文档) | S-28(细则见「数据分析 · 工具详情页」) |
|
|
165
|
-
| 学习中心 · 进入与 Tab
|
|
187
|
+
| 学习中心 · 进入与 Tab/子类(含跨 Tab 重名消歧) | S-14 |
|
|
166
188
|
| 学习中心 · 课程排序/个人筛选 | S-17 |
|
|
167
189
|
| 学习中心 · 顶栏关键字搜索(新标签) | S-18 |
|
|
168
190
|
| 搜索页 · 同关键词下切「课程 / 直播」结果 | S-18 第 3 步(非 S-14) |
|
|
@@ -376,12 +398,14 @@ div.side-menu--item[to='/edu/courses']
|
|
|
376
398
|
|
|
377
399
|
**规约 C · 悬停才显示的隐藏操作按钮**
|
|
378
400
|
|
|
379
|
-
|
|
401
|
+
列表项/输入输出块上部分操作按钮(**复制文本**、**编辑文本**、复制、收藏、删除、重新生成、举报等)默认隐藏,仅在 `hover` 时出现:
|
|
380
402
|
|
|
381
|
-
1. 先 `hover`
|
|
403
|
+
1. 先 `hover` 目标项目块(应用详情「生成结果」区:悬停在**该输出块的标题或正文区域**);
|
|
382
404
|
2. 再 `click` 出现的按钮(按规约 A 优先 `aria-label`)。
|
|
383
405
|
|
|
384
406
|
> 直接对未 hover 的按钮 `click`:常因 `visibility: hidden` / `pointer-events: none` 超时或被遮挡;勿用 `force: true` 绕过业务态。
|
|
407
|
+
>
|
|
408
|
+
> **应用详情 · 高频踩坑**:「复制文本」「编辑文本」的 `aria-label` 即按钮文案本身;未 hover 时 `snapshot` 往往**看不到**这两个按钮,Agent 易误判「页面不支持编辑」。用户说「编辑生成的结果」时,默认走 **AP-14**(先 hover 再点「编辑文本」),细则见上文「AI 应用 · 详情页 · 复制/编辑输出 · Agent 硬门禁」。
|
|
385
409
|
|
|
386
410
|
**规约 D · 卡片以「新标签页」方式打开详情**
|
|
387
411
|
|
|
@@ -407,9 +431,9 @@ div.side-menu--item[to='/edu/courses']
|
|
|
407
431
|
|
|
408
432
|
应用的输入/输出区可能由多个独立内容块组成(多段提示、分章节回答、多张图、多段代码/表格/mindmap 等):
|
|
409
433
|
|
|
410
|
-
-
|
|
434
|
+
- **单块操作**(单段「**复制文本**」、「**编辑文本**」、「复制」、「重新生成」、「评分」):必须先 `hover` 目标块内部才会出现该块浮动按钮(规约 C),再使用 `aria-label`(规约 A)定位**该块作用域内**的按钮;勿直接命中全局同名按钮。
|
|
411
435
|
- **整块操作**(「全部复制」、「导出全部」、「全部重新生成」):通常位于输出区顶/底全局工具条,不需要悬停某块;用 `getByLabel('全部复制')` 或 `getByRole('button', { name: '全部复制' })` 直接命中。
|
|
412
|
-
-
|
|
436
|
+
- **分流原则**:根据用户原话——「复制这段/复制文本/编辑生成的结果/修改输出/这一块/第 N 段」→ **单块**(先 `hover`,复制用 `复制文本`、编辑用 `编辑文本`);「全部复制/复制全部/复制整份输出」→ **整块**。`全部复制` 与 `复制文本` 在 `aria-label` 上严格区分,勿混用;「编辑文本」仅出现在单块 hover 工具条,与顶栏「全部复制」无关。
|
|
413
437
|
|
|
414
438
|
**规约 G · mindmap 缩放与页面滚动(鼠标位置决定)**
|
|
415
439
|
|
|
@@ -443,10 +467,11 @@ div.side-menu--item[to='/edu/courses']
|
|
|
443
467
|
| AP-7 | **收藏(单击直成)** | 先 `hover` 卡片(规约 C)→ `click` → `getByLabel('收藏')` | 文案/`aria-label` 切换为「已收藏」;无二次确认 |
|
|
444
468
|
| AP-8 | **取消收藏(需二次确认)** | 见规约 E:`hover` → `click`「取消收藏」 → `click` 弹层「确认」 | 验收文案回到「收藏」,或卡片移出「我的收藏」;勿用 `dialog-accept` |
|
|
445
469
|
| AP-9 | **多块输入 · 单块操作** | 先 `hover` 目标输入块 → 在该块作用域内用 `getByLabel('<操作>')` → `click` | 同规约 F;勿误触全局/其它块按钮 |
|
|
446
|
-
| AP-10 | **多块输出 ·
|
|
447
|
-
| AP-11 | **多块输出 · 全部复制(整块)** | `click` → `getByLabel('全部复制')` 或 `getByRole('button', { name: '全部复制' })` |
|
|
470
|
+
| AP-10 | **多块输出 · 单块复制文本** | 先 `hover` 目标输出块(同块 `getByText('<块标题>')` 或正文区)→ **同一次** `run-code` 内 `click` → `getByLabel('复制文本')` | 出现复制成功 toast 或剪贴板更新;勿与 AP-11 混用 |
|
|
471
|
+
| AP-11 | **多块输出 · 全部复制(整块)** | `click` → `getByLabel('全部复制')` 或 `getByRole('button', { name: '全部复制' })` | 同上提示;**无需** hover;勿用「复制文本」代替 |
|
|
448
472
|
| AP-12 | **mindmap · 缩放** | 见规约 G:`mousemove` 到画布内 → `mousewheel` | 节点尺寸变化 |
|
|
449
473
|
| AP-13 | **mindmap 区域附近 · 滚动页面** | 见规约 G:`mousemove` 到 mindmap 外的安全空白区(仍在外层容器内) → `mousewheel` | 页面/外层容器滚动,mindmap 大小不变 |
|
|
474
|
+
| AP-14 | **多块输出 · 单块编辑文本** | 先 `hover` 目标输出块 → **同一次** `run-code` 内 `click` → `getByLabel('编辑文本')` → 在块内 `textbox` 修改 → `click` → `getByRole('button', { name: '保存' })` | 回到 markdown 预览;用户说「编辑生成的结果」等走本步;取消可点「保存」旁关闭图标 |
|
|
450
475
|
|
|
451
476
|
##### AI 应用 · 稳定定位器速查
|
|
452
477
|
|
|
@@ -460,8 +485,9 @@ div.side-menu--item[to='/edu/courses']
|
|
|
460
485
|
| 收藏 / 已收藏 | `getByLabel('收藏')` / `getByLabel('已收藏')`(兼用 `getByText('收藏', { exact: true })`) | 取消收藏须见规约 E |
|
|
461
486
|
| 取消收藏 | `getByLabel('取消收藏')` | 触发二次确认 |
|
|
462
487
|
| 取消收藏 · 确认 | 弹层 `getByRole('button', { name: '确认' })`(文案以实测为准) | 必接动作;禁用 `dialog-accept` |
|
|
463
|
-
|
|
|
464
|
-
|
|
|
488
|
+
| 单块复制文本 | 目标块作用域内 `getByLabel('复制文本')` | 先 `hover` 该块;与 AP-10 一致 |
|
|
489
|
+
| 单块编辑文本 | 目标块作用域内 `getByLabel('编辑文本')` | 先 `hover` 该块;编辑态内 `textbox` + 「保存」;与 AP-14 一致 |
|
|
490
|
+
| 整块复制 | `getByLabel('全部复制')` | 勿与「复制文本」混用;无需 hover |
|
|
465
491
|
| 重新生成(单块) | 目标块作用域内 `getByLabel('重新生成')` | 先 `hover` 该块 |
|
|
466
492
|
| 分类入口 | `getByLabel('分类')` 优先;否则 `getByRole('button', { name: '分类' })` | 级联见规约 H |
|
|
467
493
|
| 应用卡片 · 标题 | `getByText('<应用主标题>', { exact: true })` | 多卡时先缩到目标卡片 |
|
|
@@ -774,19 +800,73 @@ helixlife-v5-cli run-code --filename=scripts/analysis-detail-upload-file.js
|
|
|
774
800
|
|
|
775
801
|
**说明**:`/edu/courses` 上切换顶栏「课程/训练营/直播」时,只有「课程」保持上述路径;点选训练营/直播子类会 push 到 `/edu/trainings?…`、`/edu/lives?…`(`category` 由后端配置,勿硬编码)。需确定回到课程列表时优先 `click` → `div.side-menu--item[to='/edu/courses']`,比顶栏 `getByText('课程')` 更稳。
|
|
776
802
|
|
|
803
|
+
#### 学习中心 · 一级 Tab 与子类消歧(Agent 必读)
|
|
804
|
+
|
|
805
|
+
> **核验记录**(2026-05-22):「课程」「训练营」「直播」均为**带下箭头的一级 Tab**;子类仅出现在**对应 Tab 展开的下拉菜单**内。子类名**可跨 Tab 重名**——实测 **「三十六策」** 同时存在于「课程」与「直播」下拉,但路由不同(`/edu/courses?category=…` vs `/edu/lives?category=…`)。
|
|
806
|
+
|
|
807
|
+
###### 一级 Tab 与子类枚举
|
|
808
|
+
|
|
809
|
+
| 一级 Tab | 路由(选子类后) | 子类(下拉内 · 2026-05-22 实测) |
|
|
810
|
+
| --- | --- | --- |
|
|
811
|
+
| **课程** | `/edu/courses` + `?category=…` | 全部课程、**三十六策**、套路体系、基金申请、基础科研、生信分析、临床研究、文献阅读、科研规划 |
|
|
812
|
+
| **训练营** | `/edu/trainings` + `?category=…` | 全部训练营、7天主题营、14天成长营、21天讲席营、30天陪读营 |
|
|
813
|
+
| **直播** | `/edu/lives` + `?category=…` | 全部直播、直播季、名师直播、陪读营、**三十六策**、直播大课 |
|
|
814
|
+
|
|
815
|
+
###### 跨 Tab 重名子类(必记)
|
|
816
|
+
|
|
817
|
+
| 子类名 | 出现的 Tab | 验收 |
|
|
818
|
+
| --- | --- | --- |
|
|
819
|
+
| **三十六策** | 课程、直播 | 课程:`pathname === '/edu/courses'` 且 `title` 以 `课程-` 开头;直播:`pathname === '/edu/lives'` 且 `title` 以 `直播-` 开头 |
|
|
820
|
+
|
|
821
|
+
> 运营后续若新增跨 Tab 重名,按同样格式追加本表;**勿**假设子类名全局唯一。
|
|
822
|
+
|
|
823
|
+
###### 用户话术 → 操作映射
|
|
824
|
+
|
|
825
|
+
| 用户说法 | 解析 | 操作 |
|
|
826
|
+
| --- | --- | --- |
|
|
827
|
+
| 「**课程**下的 XX / 切到课程 XX」 | 父 Tab = **课程** | `click` 顶栏「课程」Tab 块展开下拉 → 在下拉内 `click` → `getByText('XX', { exact: true })` |
|
|
828
|
+
| 「**直播**下的 XX / 切到直播 XX」 | 父 Tab = **直播** | 同上,父 Tab 换「直播」 |
|
|
829
|
+
| 「**训练营**下的 XX」 | 父 Tab = **训练营** | 同上,父 Tab 换「训练营」 |
|
|
830
|
+
| 仅说「三十六策」等**重名子类**、未给父 Tab | 歧义 | **向用户确认**「课程还是直播?」;或 `snapshot` 列出两 Tab 供选。**禁止**默认走直播 |
|
|
831
|
+
|
|
832
|
+
###### Agent 决策树(切换学习中心子类时必走)
|
|
833
|
+
|
|
834
|
+
1. **`snapshot`(必做)**。
|
|
835
|
+
2. 从用户句中解析**父 Tab 关键词**(课程 / 训练营 / 直播):
|
|
836
|
+
- **已明确**(如「课程下的三十六策」)→ 锁定该 Tab,**禁止**因子类名出现在其它 Tab 枚举而改道。
|
|
837
|
+
- **未明确**且子类名在「跨 Tab 重名」表 → **追问用户**或列出选项。
|
|
838
|
+
- **未明确**且子类名**仅**出现在某一 Tab 的子类枚举 → 可推断该 Tab(如「7天主题营」→ 训练营)。
|
|
839
|
+
3. **`click` 对应一级 Tab**(带下箭头的块,非整页裸 `getByText`)**展开下拉**。
|
|
840
|
+
4. **在该 Tab 的下拉菜单作用域内** `click` 目标子类(推荐先缩到 Tab 块再点,避免 strict / 误触另一 Tab 同名项):
|
|
841
|
+
|
|
842
|
+
```js
|
|
843
|
+
const tab = page.locator('main').locator('div').filter({ hasText: /^课程$/ }).first();
|
|
844
|
+
await tab.click();
|
|
845
|
+
await tab.getByText('三十六策', { exact: true }).click();
|
|
846
|
+
```
|
|
847
|
+
|
|
848
|
+
5. **验收**(必做):`pathname` 与 `document.title` 前缀须与**父 Tab**一致(见上表);`category=` 由后端配置,勿硬编码 UUID。
|
|
849
|
+
|
|
850
|
+
**反模式**
|
|
851
|
+
|
|
852
|
+
- **禁止**未确定父 Tab 就对全页 `getByText('三十六策')`(`.first()` 可能点到错误 Tab 或 strict 失败)。
|
|
853
|
+
- **禁止**用户已说「课程下的…」仍因文档/live 枚举含该名而跳转到 `/edu/lives`。
|
|
854
|
+
- **禁止**用搜索页 S-18 的「课程/直播」结果 Tab 代替列表页 S-14 的一级 Tab 下拉(除非当前已在 `/edu/search`)。
|
|
855
|
+
|
|
777
856
|
#### 信息架构与功能区块
|
|
778
857
|
|
|
779
858
|
| 层级 | 区块 | 功能要点 |
|
|
780
859
|
| --- | --- | --- |
|
|
781
860
|
| 全局 | 左侧主导航 | `div.side-menu--item[to='/edu/courses']`(S-07) |
|
|
782
861
|
| 列表公共顶栏 | 搜索 | 见 S-18;与应用/数据分析同一占位「请输入搜索关键词」+ 按钮「搜索」。数据分析同页内搜索见 S-13 |
|
|
783
|
-
| 列表 | 一级 Tab |
|
|
862
|
+
| 列表 | 一级 Tab | 「课程」「训练营」「直播」:均为**带下箭头下拉**的一级 Tab;`getByText('课程')` 等须配合展开后再点子类 |
|
|
863
|
+
| 课程 | 子类 | 全部课程、三十六策、套路体系、基金申请、基础科研、生信分析、临床研究、文献阅读、科研规划 → `/edu/courses?category=…`(**「三十六策」与直播下拉重名**,须先确定父 Tab,见「一级 Tab 与子类消歧」) |
|
|
784
864
|
| 课程列表 | 排序与筛选 | 「最新」「最热」(`paragraph` 可点);`getByRole('checkbox', { name: '只显示我学习的' })` |
|
|
785
865
|
| 课程列表 | 课程卡片 | 难度、已学人数、时长、已学进度(如「已学4%」);点击进入 `/edu/courses/…/learn`(S-19) |
|
|
786
866
|
| 训练营 | 子类 | 全部训练营、7天主题营、14天成长营、21天讲席营、30天陪读营 → `/edu/trainings?category=…` |
|
|
787
867
|
| 训练营列表 | 筛选 | 「全部」;「最新」「最热」;`getByRole('checkbox', { name: '只显示我报名的' })` |
|
|
788
868
|
| 训练营列表 | 卡片 | 营名、营类型、人数/状态(如「待开营」)、时长;点击进入 `/edu/trainings/{id}`(S-20) |
|
|
789
|
-
| 直播 | 子类 | 全部直播、直播季、名师直播、陪读营、三十六策、直播大课 → `/edu/lives?category
|
|
869
|
+
| 直播 | 子类 | 全部直播、直播季、名师直播、陪读营、三十六策、直播大课 → `/edu/lives?category=…`(**「三十六策」与课程下拉重名**,须先确定父 Tab) |
|
|
790
870
|
| 直播列表 | 讲师筛选 | 全部、酸菜、老谈、雪球、虾仁、猫大、AW、大空熠等;`getByText('雪球')` 等 |
|
|
791
871
|
| 直播列表 | 个人筛选 | `getByRole('checkbox', { name: '只显示我预约的' })` |
|
|
792
872
|
| 直播列表 | 卡片 | 时间、标题、讲师·预约人数;状态标签「预约中」「回放」;推荐直接点标题进入详情(S-21) |
|
|
@@ -954,9 +1034,10 @@ async page => {
|
|
|
954
1034
|
| 进入学习中心 | `div.side-menu--item[to='/edu/courses']` | 与全局侧栏表一致 |
|
|
955
1035
|
| 顶栏搜索框 | `getByRole('textbox', { name: '请输入搜索关键词' })` | 列表/搜索页通用 |
|
|
956
1036
|
| 顶栏搜索按钮 | `getByRole('button', { name: '搜索' })` | 点击后常**新开标签**(S-18) |
|
|
957
|
-
| 一级 Tab | `getByText('课程')`、`getByText('训练营')`、`getByText('直播')` |
|
|
958
|
-
|
|
|
959
|
-
|
|
|
1037
|
+
| 一级 Tab | `getByText('课程')`、`getByText('训练营')`、`getByText('直播')` | 切换子类须先 `click` Tab 块**展开下拉**,再点下拉内子类;跨 Tab 重名见「一级 Tab 与子类消歧」 |
|
|
1038
|
+
| 课程子类 | `getByText('三十六策')` 等 | **须**先展开「课程」Tab,并在该 Tab 作用域内点击 |
|
|
1039
|
+
| 训练营子类 | `getByText('7天主题营')` 等 | 须先展开「训练营」Tab |
|
|
1040
|
+
| 直播子类 | `getByText('名师直播')` 等 | 须先展开「直播」Tab;「三十六策」与课程重名,**禁止**全页裸点 |
|
|
960
1041
|
| 课程 · 最新/最热 | `getByText('最新')`、`getByText('最热')` | 与直播/训练营列表同文案 |
|
|
961
1042
|
| 课程 · 仅看我的学习 | `getByRole('checkbox', { name: '只显示我学习的' })` | |
|
|
962
1043
|
| 训练营 · 仅看我的报名 | `getByRole('checkbox', { name: '只显示我报名的' })` | |
|
|
@@ -1045,7 +1126,7 @@ async page => {
|
|
|
1045
1126
|
|
|
1046
1127
|
#### S-12:AI 应用 · 标准操作
|
|
1047
1128
|
|
|
1048
|
-
> **细则**见上文「AI 应用 `/application/`」(规约 A~H + AP-1~AP-
|
|
1129
|
+
> **细则**见上文「AI 应用 `/application/`」(规约 A~H + AP-1~AP-14)。本节为最短串联步骤;每个关键交互后 `snapshot` 一次直至验收通过。
|
|
1049
1130
|
|
|
1050
1131
|
1. **进入模块**:AP-1。验收:`pathname` `/application`/`/application/`;`title` 以 `AI应用-` 开头。
|
|
1051
1132
|
2. **(可选)搜索**:AP-2。验收:列表刷新。
|
|
@@ -1054,10 +1135,13 @@ async page => {
|
|
|
1054
1135
|
5. **(可选)`aria-label` 高频图标**(历史记录/回到顶部 等):AP-5(规约 A)。
|
|
1055
1136
|
6. **(可选)收藏/取消收藏**:AP-7/AP-8(取消收藏必接二次确认弹层,见规约 E)。
|
|
1056
1137
|
7. **进入某一应用(新标签)**:AP-6(规约 D);`tab-list` 记录 → `click` 卡片 → `tab-select` 切到新标签。勿在详情标签上 `go-back`。
|
|
1057
|
-
8. **应用详情 · 多块输入输出**(规约 C/F
|
|
1058
|
-
-
|
|
1059
|
-
-
|
|
1060
|
-
-
|
|
1138
|
+
8. **应用详情 · 多块输入输出**(规约 C/F · 硬门禁见上文「复制/编辑输出」):
|
|
1139
|
+
- 单块复制(「复制文本 / 复制这段」)→ 先 `hover` 该块 → AP-10(`getByLabel('复制文本')`);
|
|
1140
|
+
- 单块编辑(「编辑生成的结果 / 编辑文本 / 修改输出」)→ 先 `hover` 该块 → AP-14(`getByLabel('编辑文本')` → 改 `textbox` → 「保存」);
|
|
1141
|
+
- 单块其它操作(重新生成等)→ 先 `hover` 该块 → AP-9;
|
|
1142
|
+
- 整块操作(全部复制等)→ AP-11(**无需** hover);
|
|
1143
|
+
- hover 与 click 须在同一次 `run-code` 内连续执行,勿分两条命令;
|
|
1144
|
+
- 勿把 `复制文本` 与 `全部复制` 互换。
|
|
1061
1145
|
9. **(可选)mindmap**:缩放 → AP-12(`hover` 画布内);滚动页面/外层 → AP-13(`hover` 画布外、容器内安全空白区)。
|
|
1062
1146
|
10. **收尾**:返回列表用 `tab-close`(详情标签)→ `tab-select` 回 `/application` 标签。
|
|
1063
1147
|
|
|
@@ -1102,11 +1186,11 @@ async page => {
|
|
|
1102
1186
|
|
|
1103
1187
|
1. S-07 → `click` → `div.side-menu--item[to='/edu/courses']`。
|
|
1104
1188
|
2. **验收**:`location.pathname` 为 `/edu/courses`;`title` 以 `课程-` 开头;`main` 内可见顶栏「搜索」与「课程/训练营/直播」。
|
|
1105
|
-
3. **切换一级形态**(按需,均禁止对 `/edu/**` 使用 `goto
|
|
1106
|
-
-
|
|
1107
|
-
-
|
|
1108
|
-
-
|
|
1109
|
-
4. **优化**:子类名、讲师名以运营配置为准;失效时用 `snapshot` 更新本文枚举,不要猜 `category` UUID
|
|
1189
|
+
3. **切换一级形态**(按需,均禁止对 `/edu/**` 使用 `goto`;**子类切换细则见「一级 Tab 与子类消歧」**):
|
|
1190
|
+
- **课程 · 子类**:`click` 顶栏「课程」Tab 块展开下拉 → `click` → `getByText('<子类名>', { exact: true })`(须在该 Tab 作用域内)。验收:`pathname` 为 `/edu/courses` 且带 `category=`;`title` 以 `课程-` 开头。例:「课程下的三十六策」→ 课程 Tab → 三十六策,**勿**走直播。
|
|
1191
|
+
- **训练营 · 子类**:`click` → `getByText('训练营')` → 展开后 `click` → `getByText('<子类名>')`(如 7天主题营)。验收:`pathname` 为 `/edu/trainings` 且带 `category=`;`title` 以 `训练营-` 开头。
|
|
1192
|
+
- **直播 · 子类**:`click` 顶栏「直播」Tab 块展开下拉 → `click` → `getByText('<子类名>', { exact: true })`(须在该 Tab 作用域内)。验收:`pathname` 为 `/edu/lives` 且带 `category=`;`title` 以 `直播-` 开头。
|
|
1193
|
+
4. **优化**:子类名、讲师名以运营配置为准;失效时用 `snapshot` 更新本文枚举,不要猜 `category` UUID。跨 Tab 重名子类须回写「跨 Tab 重名子类」表。
|
|
1110
1194
|
|
|
1111
1195
|
#### S-17:学习中心 · 课程列表排序与个人课单筛选
|
|
1112
1196
|
|