@creatoria/miniapp-mcp 0.1.3 → 0.2.0
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/README.md +14 -3
- package/dist/app/cli/index.d.ts +6 -0
- package/dist/app/cli/index.d.ts.map +1 -0
- package/dist/app/cli/index.js +6 -0
- package/dist/app/cli/index.js.map +1 -0
- package/dist/app/index.d.ts +6 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +6 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/server/index.d.ts +7 -0
- package/dist/app/server/index.d.ts.map +1 -0
- package/dist/app/server/index.js +6 -0
- package/dist/app/server/index.js.map +1 -0
- package/dist/capabilities/assert/index.d.ts +5 -0
- package/dist/capabilities/assert/index.d.ts.map +1 -0
- package/dist/capabilities/assert/index.js +5 -0
- package/dist/capabilities/assert/index.js.map +1 -0
- package/dist/capabilities/automator/index.d.ts +6 -0
- package/dist/capabilities/automator/index.d.ts.map +1 -0
- package/dist/capabilities/automator/index.js +6 -0
- package/dist/capabilities/automator/index.js.map +1 -0
- package/dist/capabilities/automator/schemas/close.d.ts +5 -0
- package/dist/capabilities/automator/schemas/close.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/close.js +11 -0
- package/dist/capabilities/automator/schemas/close.js.map +1 -0
- package/dist/capabilities/automator/schemas/connect.d.ts +11 -0
- package/dist/capabilities/automator/schemas/connect.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/connect.js +19 -0
- package/dist/capabilities/automator/schemas/connect.js.map +1 -0
- package/dist/capabilities/automator/schemas/disconnect.d.ts +5 -0
- package/dist/capabilities/automator/schemas/disconnect.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/disconnect.js +11 -0
- package/dist/capabilities/automator/schemas/disconnect.js.map +1 -0
- package/dist/capabilities/automator/schemas/index.d.ts +4 -0
- package/dist/capabilities/automator/schemas/index.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/index.js +12 -0
- package/dist/capabilities/automator/schemas/index.js.map +1 -0
- package/dist/capabilities/automator/schemas/launch.d.ts +17 -0
- package/dist/capabilities/automator/schemas/launch.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/launch.js +26 -0
- package/dist/capabilities/automator/schemas/launch.js.map +1 -0
- package/dist/capabilities/element/index.d.ts +5 -0
- package/dist/capabilities/element/index.d.ts.map +1 -0
- package/dist/capabilities/element/index.js +5 -0
- package/dist/capabilities/element/index.js.map +1 -0
- package/dist/capabilities/index.d.ts +15 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +14 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/miniprogram/index.d.ts +5 -0
- package/dist/capabilities/miniprogram/index.d.ts.map +1 -0
- package/dist/capabilities/miniprogram/index.js +5 -0
- package/dist/capabilities/miniprogram/index.js.map +1 -0
- package/dist/capabilities/network/index.d.ts +5 -0
- package/dist/capabilities/network/index.d.ts.map +1 -0
- package/dist/capabilities/network/index.js +5 -0
- package/dist/capabilities/network/index.js.map +1 -0
- package/dist/capabilities/page/index.d.ts +5 -0
- package/dist/capabilities/page/index.d.ts.map +1 -0
- package/dist/capabilities/page/index.js +5 -0
- package/dist/capabilities/page/index.js.map +1 -0
- package/dist/capabilities/record/index.d.ts +5 -0
- package/dist/capabilities/record/index.d.ts.map +1 -0
- package/dist/capabilities/record/index.js +5 -0
- package/dist/capabilities/record/index.js.map +1 -0
- package/dist/capabilities/schema-registry.d.ts +4 -0
- package/dist/capabilities/schema-registry.d.ts.map +1 -0
- package/dist/capabilities/schema-registry.js +18 -0
- package/dist/capabilities/schema-registry.js.map +1 -0
- package/dist/capabilities/schema-types.d.ts +22 -0
- package/dist/capabilities/schema-types.d.ts.map +1 -0
- package/dist/capabilities/schema-types.js +2 -0
- package/dist/capabilities/schema-types.js.map +1 -0
- package/dist/capabilities/snapshot/index.d.ts +5 -0
- package/dist/capabilities/snapshot/index.d.ts.map +1 -0
- package/dist/capabilities/snapshot/index.js +5 -0
- package/dist/capabilities/snapshot/index.js.map +1 -0
- package/dist/config/loader.js +1 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/core/element-ref.d.ts +1 -43
- package/dist/core/element-ref.d.ts.map +1 -1
- package/dist/core/element-ref.js +1 -212
- package/dist/core/element-ref.js.map +1 -1
- package/dist/core/logger.d.ts +1 -54
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +1 -377
- package/dist/core/logger.js.map +1 -1
- package/dist/core/output.d.ts +1 -20
- package/dist/core/output.d.ts.map +1 -1
- package/dist/core/output.js +1 -55
- package/dist/core/output.js.map +1 -1
- package/dist/core/report-generator.d.ts +1 -23
- package/dist/core/report-generator.d.ts.map +1 -1
- package/dist/core/report-generator.js +1 -211
- package/dist/core/report-generator.js.map +1 -1
- package/dist/core/session.d.ts +2 -82
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +2 -305
- package/dist/core/session.js.map +1 -1
- package/dist/core/timeout.d.ts +1 -48
- package/dist/core/timeout.d.ts.map +1 -1
- package/dist/core/timeout.js +1 -66
- package/dist/core/timeout.js.map +1 -1
- package/dist/core/tool-logger.d.ts +1 -82
- package/dist/core/tool-logger.d.ts.map +1 -1
- package/dist/core/tool-logger.js +1 -452
- package/dist/core/tool-logger.js.map +1 -1
- package/dist/core/validation.d.ts +1 -38
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +1 -92
- package/dist/core/validation.js.map +1 -1
- package/dist/runtime/element/element-ref.d.ts +44 -0
- package/dist/runtime/element/element-ref.d.ts.map +1 -0
- package/dist/runtime/element/element-ref.js +214 -0
- package/dist/runtime/element/element-ref.js.map +1 -0
- package/dist/runtime/element/index.d.ts +2 -0
- package/dist/runtime/element/index.d.ts.map +1 -0
- package/dist/runtime/element/index.js +2 -0
- package/dist/runtime/element/index.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/logging/index.d.ts +3 -0
- package/dist/runtime/logging/index.d.ts.map +1 -0
- package/dist/runtime/logging/index.js +3 -0
- package/dist/runtime/logging/index.js.map +1 -0
- package/dist/runtime/logging/logger.d.ts +55 -0
- package/dist/runtime/logging/logger.d.ts.map +1 -0
- package/dist/runtime/logging/logger.js +379 -0
- package/dist/runtime/logging/logger.js.map +1 -0
- package/dist/runtime/logging/tool-logger.d.ts +83 -0
- package/dist/runtime/logging/tool-logger.d.ts.map +1 -0
- package/dist/runtime/logging/tool-logger.js +454 -0
- package/dist/runtime/logging/tool-logger.js.map +1 -0
- package/dist/runtime/outputs/index.d.ts +3 -0
- package/dist/runtime/outputs/index.d.ts.map +1 -0
- package/dist/runtime/outputs/index.js +3 -0
- package/dist/runtime/outputs/index.js.map +1 -0
- package/dist/runtime/outputs/output-manager.d.ts +12 -0
- package/dist/runtime/outputs/output-manager.d.ts.map +1 -0
- package/dist/runtime/outputs/output-manager.js +39 -0
- package/dist/runtime/outputs/output-manager.js.map +1 -0
- package/dist/runtime/outputs/report-generator.d.ts +5 -0
- package/dist/runtime/outputs/report-generator.d.ts.map +1 -0
- package/dist/runtime/outputs/report-generator.js +175 -0
- package/dist/runtime/outputs/report-generator.js.map +1 -0
- package/dist/runtime/session/index.d.ts +3 -0
- package/dist/runtime/session/index.d.ts.map +1 -0
- package/dist/runtime/session/index.js +3 -0
- package/dist/runtime/session/index.js.map +1 -0
- package/dist/runtime/session/store.d.ts +28 -0
- package/dist/runtime/session/store.d.ts.map +1 -0
- package/dist/runtime/session/store.js +154 -0
- package/dist/runtime/session/store.js.map +1 -0
- package/dist/runtime/session/utils/cleanup.d.ts +3 -0
- package/dist/runtime/session/utils/cleanup.d.ts.map +1 -0
- package/dist/runtime/session/utils/cleanup.js +78 -0
- package/dist/runtime/session/utils/cleanup.js.map +1 -0
- package/dist/runtime/timeout/index.d.ts +2 -0
- package/dist/runtime/timeout/index.d.ts.map +1 -0
- package/dist/runtime/timeout/index.js +2 -0
- package/dist/runtime/timeout/index.js.map +1 -0
- package/dist/runtime/timeout/timeout.d.ts +49 -0
- package/dist/runtime/timeout/timeout.d.ts.map +1 -0
- package/dist/runtime/timeout/timeout.js +67 -0
- package/dist/runtime/timeout/timeout.js.map +1 -0
- package/dist/runtime/validation/index.d.ts +2 -0
- package/dist/runtime/validation/index.d.ts.map +1 -0
- package/dist/runtime/validation/index.js +2 -0
- package/dist/runtime/validation/index.js.map +1 -0
- package/dist/runtime/validation/validation.d.ts +39 -0
- package/dist/runtime/validation/validation.d.ts.map +1 -0
- package/dist/runtime/validation/validation.js +93 -0
- package/dist/runtime/validation/validation.js.map +1 -0
- package/dist/schemas/automator/miniprogram_close.json +12 -0
- package/dist/schemas/automator/miniprogram_connect.json +19 -0
- package/dist/schemas/automator/miniprogram_disconnect.json +12 -0
- package/dist/schemas/automator/miniprogram_launch.json +30 -0
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/miniprogram.d.ts +0 -1
- package/dist/tools/miniprogram.d.ts.map +1 -1
- package/dist/tools/miniprogram.js +17 -29
- package/dist/tools/miniprogram.js.map +1 -1
- package/dist/tools/page.js +2 -2
- package/dist/tools/page.js.map +1 -1
- package/docs/directory-structure-and-code-style-best-practices.md +91 -0
- package/docs/migration/README.md +34 -0
- package/docs/migration/TC-ALIGN-01-notes.md +35 -0
- package/docs/migration/runtime-skeleton.md +50 -0
- package/docs/migration/tool-schema-strategy.md +75 -0
- package/docs//345/256/214/346/225/264/345/256/236/347/216/260/346/226/271/346/241/210.md +14 -14
- package/docs//347/254/254/344/270/200/347/211/210/346/234/254/346/226/271/346/241/210.md +7 -7
- package/package.json +4 -2
- package/docs/SIMPLE_USAGE.md +0 -210
- package/docs/architecture.E-Docs.md +0 -1359
- package/docs/architecture.F1.md +0 -720
- package/docs/architecture.F2.md +0 -871
- package/docs/architecture.F3.md +0 -905
- package/docs/architecture.md +0 -90
- package/docs/charter.A1.align.yaml +0 -170
- package/docs/charter.A2.align.yaml +0 -199
- package/docs/charter.A3.align.yaml +0 -242
- package/docs/charter.A4.align.yaml +0 -227
- package/docs/charter.B1.align.yaml +0 -179
- package/docs/charter.B2.align.yaml +0 -200
- package/docs/charter.B3.align.yaml +0 -200
- package/docs/charter.B4.align.yaml +0 -188
- package/docs/charter.C1.align.yaml +0 -190
- package/docs/charter.C2.align.yaml +0 -202
- package/docs/charter.C3.align.yaml +0 -211
- package/docs/charter.C4.align.yaml +0 -263
- package/docs/charter.C5.align.yaml +0 -220
- package/docs/charter.D1.align.yaml +0 -190
- package/docs/charter.D2.align.yaml +0 -234
- package/docs/charter.D3.align.yaml +0 -206
- package/docs/charter.E-Docs.align.yaml +0 -294
- package/docs/charter.F1.align.yaml +0 -193
- package/docs/charter.F2.align.yaml +0 -248
- package/docs/charter.F3.align.yaml +0 -287
- package/docs/charter.G.align.yaml +0 -174
- package/docs/charter.align.yaml +0 -111
- package/docs/maintenance.md +0 -682
- package/docs/playwright-mcp/350/260/203/347/240/224.md +0 -53
- package/docs/setup-guide.md +0 -775
- package/docs/tasks.A1.atomize.md +0 -296
- package/docs/tasks.A2.atomize.md +0 -408
- package/docs/tasks.A3.atomize.md +0 -564
- package/docs/tasks.A4.atomize.md +0 -496
- package/docs/tasks.B1.atomize.md +0 -352
- package/docs/tasks.B2.atomize.md +0 -561
- package/docs/tasks.B3.atomize.md +0 -508
- package/docs/tasks.B4.atomize.md +0 -504
- package/docs/tasks.C1.atomize.md +0 -540
- package/docs/tasks.C2.atomize.md +0 -665
- package/docs/tasks.C3.atomize.md +0 -745
- package/docs/tasks.C4.atomize.md +0 -908
- package/docs/tasks.C5.atomize.md +0 -755
- package/docs/tasks.D1.atomize.md +0 -547
- package/docs/tasks.D2.atomize.md +0 -619
- package/docs/tasks.D3.atomize.md +0 -790
- package/docs/tasks.E-Docs.atomize.md +0 -1204
- package/docs/tasks.atomize.md +0 -189
package/docs/tasks.B3.atomize.md
DELETED
|
@@ -1,508 +0,0 @@
|
|
|
1
|
-
# Task Card: [B3] ElementRef 解析器
|
|
2
|
-
|
|
3
|
-
**Task ID**: B3
|
|
4
|
-
**Task Name**: ElementRef 统一元素定位协议
|
|
5
|
-
**Charter**: `docs/charter.B3.align.yaml`
|
|
6
|
-
**Stage**: B (Core Architecture)
|
|
7
|
-
**Status**: ✅ COMPLETED (Retrospective)
|
|
8
|
-
**Estimated**: 2 hours
|
|
9
|
-
**Actual**: ~2 hours
|
|
10
|
-
**Completed**: 2025-10-02
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 目标 (Goal)
|
|
15
|
-
|
|
16
|
-
实现 ElementRef 统一元素定位协议,支持多种定位方式(refId/selector/index),并提供自动缓存管理。
|
|
17
|
-
|
|
18
|
-
**交付物**:
|
|
19
|
-
- ✅ `src/core/element-ref.ts` (~150 lines)
|
|
20
|
-
- ✅ resolveElement() 函数
|
|
21
|
-
- ✅ resolvePage() 函数
|
|
22
|
-
- ✅ generateRefId() 函数
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 前置条件 (Prerequisites)
|
|
27
|
-
|
|
28
|
-
- ✅ A3: 仓库结构已初始化
|
|
29
|
-
- ✅ B2: SessionStore 实现(使用 elementCache)
|
|
30
|
-
- ✅ 了解 miniprogram-automator 选择器语法
|
|
31
|
-
- ✅ 了解 WXML 组件选择器
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## 实现步骤 (Steps)
|
|
36
|
-
|
|
37
|
-
### 1. 定义 ElementRef 接口 ✅
|
|
38
|
-
|
|
39
|
-
**文件**: `src/types.ts`
|
|
40
|
-
|
|
41
|
-
**步骤**:
|
|
42
|
-
```typescript
|
|
43
|
-
export interface ElementRef {
|
|
44
|
-
refId?: string // 缓存的元素句柄 ID
|
|
45
|
-
selector?: string // WXML/CSS 选择器
|
|
46
|
-
xpath?: string // XPath 选择器(不支持,抛出错误)
|
|
47
|
-
index?: number // 多元素索引(从 0 开始)
|
|
48
|
-
pagePath?: string // 目标页面路径
|
|
49
|
-
save?: boolean // 是否缓存元素并返回 refId
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
**验证**: TypeScript 类型检查通过
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
### 2. 创建 element-ref.ts 文件 ✅
|
|
58
|
-
|
|
59
|
-
**文件**: `src/core/element-ref.ts`
|
|
60
|
-
|
|
61
|
-
**步骤**:
|
|
62
|
-
```typescript
|
|
63
|
-
import type { Element, Page, MiniProgram } from 'miniprogram-automator'
|
|
64
|
-
import type { ElementRef, SessionState } from '../types.js'
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* 解析元素引用并返回 Element 对象
|
|
68
|
-
*/
|
|
69
|
-
export async function resolveElement(
|
|
70
|
-
ref: ElementRef,
|
|
71
|
-
session: SessionState
|
|
72
|
-
): Promise<{ element: Element; refId?: string }>
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* 解析页面引用并返回 Page 对象
|
|
76
|
-
*/
|
|
77
|
-
export async function resolvePage(
|
|
78
|
-
miniProgram: MiniProgram,
|
|
79
|
-
ref: ElementRef
|
|
80
|
-
): Promise<Page>
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* 生成唯一的元素引用 ID
|
|
84
|
-
*/
|
|
85
|
-
export function generateRefId(): string
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**验证**: 文件创建成功,函数签名正确
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
### 3. 实现 generateRefId() ✅
|
|
93
|
-
|
|
94
|
-
**代码**:
|
|
95
|
-
```typescript
|
|
96
|
-
export function generateRefId(): string {
|
|
97
|
-
const timestamp = Date.now()
|
|
98
|
-
const random = Math.random().toString(36).substring(2, 8)
|
|
99
|
-
return `elem-${timestamp}-${random}`
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**验证**:
|
|
104
|
-
- 生成的 ID 格式正确
|
|
105
|
-
- 多次调用生成不同 ID
|
|
106
|
-
- ID 包含时间戳和随机字符
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
### 4. 实现 resolvePage() ✅
|
|
111
|
-
|
|
112
|
-
**代码**:
|
|
113
|
-
```typescript
|
|
114
|
-
export async function resolvePage(
|
|
115
|
-
miniProgram: MiniProgram,
|
|
116
|
-
ref: ElementRef
|
|
117
|
-
): Promise<Page> {
|
|
118
|
-
// 1. 如果提供 pagePath,切换到指定页面
|
|
119
|
-
if (ref.pagePath) {
|
|
120
|
-
const page = await miniProgram.navigateTo(ref.pagePath)
|
|
121
|
-
return page
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// 2. 否则返回当前页面
|
|
125
|
-
const page = await miniProgram.currentPage()
|
|
126
|
-
if (!page) {
|
|
127
|
-
throw new Error('No current page available')
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return page
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
**验证**:
|
|
135
|
-
- pagePath 存在时,正确切换页面
|
|
136
|
-
- pagePath 不存在时,返回当前页面
|
|
137
|
-
- 无当前页面时,抛出错误
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
### 5. 实现 resolveElement() - 验证参数 ✅
|
|
142
|
-
|
|
143
|
-
**代码**:
|
|
144
|
-
```typescript
|
|
145
|
-
export async function resolveElement(
|
|
146
|
-
ref: ElementRef,
|
|
147
|
-
session: SessionState
|
|
148
|
-
): Promise<{ element: Element; refId?: string }> {
|
|
149
|
-
// 1. 检查是否提供了有效的定位方式
|
|
150
|
-
if (!ref.refId && !ref.selector && !ref.xpath) {
|
|
151
|
-
throw new Error('ElementRef must provide refId, selector, or xpath')
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// 2. XPath 不支持
|
|
155
|
-
if (ref.xpath) {
|
|
156
|
-
throw new Error(
|
|
157
|
-
'XPath is not supported by miniprogram-automator. Please use selector instead.'
|
|
158
|
-
)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// ...继续实现
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
**验证**:
|
|
166
|
-
- 无定位方式时抛出错误
|
|
167
|
-
- XPath 抛出明确的错误消息
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
### 6. 实现 resolveElement() - refId 路径 ✅
|
|
172
|
-
|
|
173
|
-
**代码**:
|
|
174
|
-
```typescript
|
|
175
|
-
// 3. 优先从缓存解析 refId
|
|
176
|
-
if (ref.refId) {
|
|
177
|
-
const cachedElement = session.elementCache.get(ref.refId)
|
|
178
|
-
if (!cachedElement) {
|
|
179
|
-
throw new Error(`Element with refId ${ref.refId} not found in cache`)
|
|
180
|
-
}
|
|
181
|
-
return { element: cachedElement }
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
**验证**:
|
|
186
|
-
- refId 存在于缓存时返回缓存元素
|
|
187
|
-
- refId 不存在时抛出错误
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
### 7. 实现 resolveElement() - selector 路径 ✅
|
|
192
|
-
|
|
193
|
-
**代码**:
|
|
194
|
-
```typescript
|
|
195
|
-
// 4. 使用 selector 查询
|
|
196
|
-
if (!session.miniProgram) {
|
|
197
|
-
throw new Error('MiniProgram not connected')
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// 5. 解析页面
|
|
201
|
-
const page = await resolvePage(session.miniProgram, ref)
|
|
202
|
-
|
|
203
|
-
// 6. 查询元素
|
|
204
|
-
const selector = ref.selector!
|
|
205
|
-
let element: Element
|
|
206
|
-
|
|
207
|
-
if (ref.index !== undefined) {
|
|
208
|
-
// 6.1 查询多个元素并取指定索引
|
|
209
|
-
const elements = await page.$$(selector)
|
|
210
|
-
if (ref.index >= elements.length) {
|
|
211
|
-
throw new Error(
|
|
212
|
-
`Element index ${ref.index} out of range (found ${elements.length} elements)`
|
|
213
|
-
)
|
|
214
|
-
}
|
|
215
|
-
element = elements[ref.index]
|
|
216
|
-
} else {
|
|
217
|
-
// 6.2 查询单个元素
|
|
218
|
-
const result = await page.$(selector)
|
|
219
|
-
if (!result) {
|
|
220
|
-
throw new Error(`Element not found with selector: ${selector}`)
|
|
221
|
-
}
|
|
222
|
-
element = result
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
**验证**:
|
|
227
|
-
- selector 查询成功
|
|
228
|
-
- index 正确索引多元素
|
|
229
|
-
- 元素不存在时抛出错误
|
|
230
|
-
- index 越界时抛出错误
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
### 8. 实现 resolveElement() - save 缓存 ✅
|
|
235
|
-
|
|
236
|
-
**代码**:
|
|
237
|
-
```typescript
|
|
238
|
-
// 7. 如果需要缓存,生成 refId 并保存
|
|
239
|
-
if (ref.save) {
|
|
240
|
-
const newRefId = generateRefId()
|
|
241
|
-
session.elementCache.set(newRefId, element)
|
|
242
|
-
return { element, refId: newRefId }
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// 8. 不缓存直接返回
|
|
246
|
-
return { element }
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**验证**:
|
|
250
|
-
- save=true 时生成新 refId
|
|
251
|
-
- 元素正确保存到缓存
|
|
252
|
-
- save=false 时不缓存
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
### 9. 添加完整的 JSDoc 注释 ✅
|
|
257
|
-
|
|
258
|
-
**代码**:
|
|
259
|
-
```typescript
|
|
260
|
-
/**
|
|
261
|
-
* Resolves an ElementRef to an Element object
|
|
262
|
-
*
|
|
263
|
-
* Resolution order:
|
|
264
|
-
* 1. If `refId` provided, lookup in session.elementCache
|
|
265
|
-
* 2. If `selector` provided, query from page (with optional index)
|
|
266
|
-
* 3. XPath is not supported (throws error)
|
|
267
|
-
*
|
|
268
|
-
* @param ref - Element reference with refId/selector/xpath/index/pagePath/save
|
|
269
|
-
* @param session - Current session state
|
|
270
|
-
* @returns Resolved Element and optional new refId (if save=true)
|
|
271
|
-
* @throws Error if element not found or XPath used
|
|
272
|
-
*
|
|
273
|
-
* @example
|
|
274
|
-
* // Use cached element
|
|
275
|
-
* const { element } = await resolveElement({ refId: 'elem-123' }, session)
|
|
276
|
-
*
|
|
277
|
-
* @example
|
|
278
|
-
* // Query and cache element
|
|
279
|
-
* const { element, refId } = await resolveElement(
|
|
280
|
-
* { selector: '.btn-submit', save: true },
|
|
281
|
-
* session
|
|
282
|
-
* )
|
|
283
|
-
*/
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
**验证**: JSDoc 完整,示例清晰
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
### 10. 编写单元测试(集成到工具测试)✅
|
|
291
|
-
|
|
292
|
-
**文件**: 随 C4 Element 工具测试验证
|
|
293
|
-
|
|
294
|
-
**测试场景**:
|
|
295
|
-
```typescript
|
|
296
|
-
// 测试通过 Element 工具间接验证
|
|
297
|
-
describe('ElementRef Resolution', () => {
|
|
298
|
-
test('resolve by refId')
|
|
299
|
-
test('resolve by selector')
|
|
300
|
-
test('resolve with index')
|
|
301
|
-
test('resolve with save')
|
|
302
|
-
test('reject XPath')
|
|
303
|
-
test('throw on missing element')
|
|
304
|
-
test('throw on invalid refId')
|
|
305
|
-
})
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
**验证**: 所有测试通过
|
|
309
|
-
|
|
310
|
-
---
|
|
311
|
-
|
|
312
|
-
## 完成标准 (Definition of Done)
|
|
313
|
-
|
|
314
|
-
### 功能完成 ✅
|
|
315
|
-
|
|
316
|
-
- [x] generateRefId 生成唯一 ID
|
|
317
|
-
- [x] resolvePage 正确切换/返回页面
|
|
318
|
-
- [x] resolveElement 支持 refId 解析
|
|
319
|
-
- [x] resolveElement 支持 selector 解析
|
|
320
|
-
- [x] resolveElement 支持 index 索引
|
|
321
|
-
- [x] resolveElement 支持 save 缓存
|
|
322
|
-
- [x] XPath 抛出明确错误
|
|
323
|
-
|
|
324
|
-
### 代码质量 ✅
|
|
325
|
-
|
|
326
|
-
- [x] TypeScript 编译 0 错误
|
|
327
|
-
- [x] 无 ESLint 错误
|
|
328
|
-
- [x] 代码行数 ~150 行
|
|
329
|
-
- [x] JSDoc 注释完整
|
|
330
|
-
- [x] 符合 ESM 规范(.js 后缀)
|
|
331
|
-
|
|
332
|
-
### 测试 ✅
|
|
333
|
-
|
|
334
|
-
- [x] 单元测试随工具测试验证
|
|
335
|
-
- [x] 覆盖所有定位方式
|
|
336
|
-
- [x] 测试缓存机制
|
|
337
|
-
- [x] 测试错误场景
|
|
338
|
-
|
|
339
|
-
### 文档 ⏳
|
|
340
|
-
|
|
341
|
-
- [x] 代码注释完整
|
|
342
|
-
- [x] ElementRef 接口文档
|
|
343
|
-
- [x] 函数 JSDoc 完整
|
|
344
|
-
- ⏳ charter.B3.align.yaml (追溯)
|
|
345
|
-
- ⏳ tasks.B3.atomize.md (本文档)
|
|
346
|
-
|
|
347
|
-
---
|
|
348
|
-
|
|
349
|
-
## 实现结果 (Implementation)
|
|
350
|
-
|
|
351
|
-
### 文件清单
|
|
352
|
-
|
|
353
|
-
| 文件 | 行数 | 说明 |
|
|
354
|
-
|------|------|------|
|
|
355
|
-
| `src/core/element-ref.ts` | ~150 | ElementRef 解析器 |
|
|
356
|
-
| `src/types.ts` | +15 | ElementRef 接口 |
|
|
357
|
-
|
|
358
|
-
### 关键代码片段
|
|
359
|
-
|
|
360
|
-
**ElementRef 接口**:
|
|
361
|
-
```typescript
|
|
362
|
-
export interface ElementRef {
|
|
363
|
-
refId?: string
|
|
364
|
-
selector?: string
|
|
365
|
-
xpath?: string
|
|
366
|
-
index?: number
|
|
367
|
-
pagePath?: string
|
|
368
|
-
save?: boolean
|
|
369
|
-
}
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
**核心函数签名**:
|
|
373
|
-
```typescript
|
|
374
|
-
async function resolveElement(
|
|
375
|
-
ref: ElementRef,
|
|
376
|
-
session: SessionState
|
|
377
|
-
): Promise<{ element: Element; refId?: string }>
|
|
378
|
-
|
|
379
|
-
async function resolvePage(
|
|
380
|
-
miniProgram: MiniProgram,
|
|
381
|
-
ref: ElementRef
|
|
382
|
-
): Promise<Page>
|
|
383
|
-
|
|
384
|
-
function generateRefId(): string
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
### 设计决策
|
|
388
|
-
|
|
389
|
-
1. **优先级顺序**
|
|
390
|
-
- refId > selector > xpath
|
|
391
|
-
- 理由:缓存优先,性能最优
|
|
392
|
-
|
|
393
|
-
2. **XPath 明确拒绝**
|
|
394
|
-
- 抛出清晰错误消息
|
|
395
|
-
- 理由:SDK 不支持,避免误导用户
|
|
396
|
-
|
|
397
|
-
3. **index 支持**
|
|
398
|
-
- 使用 $$ 查询多元素并索引
|
|
399
|
-
- 理由:精确定位重复元素
|
|
400
|
-
|
|
401
|
-
4. **save 参数**
|
|
402
|
-
- 可选缓存,返回新 refId
|
|
403
|
-
- 理由:性能优化,减少重复查询
|
|
404
|
-
|
|
405
|
-
5. **分离 resolvePage**
|
|
406
|
-
- 独立页面解析函数
|
|
407
|
-
- 理由:复用性,清晰职责
|
|
408
|
-
|
|
409
|
-
---
|
|
410
|
-
|
|
411
|
-
## 测试证据 (Test Evidence)
|
|
412
|
-
|
|
413
|
-
### 单元测试(集成验证)
|
|
414
|
-
|
|
415
|
-
通过 C4 Element 工具测试验证:
|
|
416
|
-
```bash
|
|
417
|
-
$ pnpm test element.test.ts
|
|
418
|
-
|
|
419
|
-
✓ element_tap uses resolveElement
|
|
420
|
-
✓ refId resolution works
|
|
421
|
-
✓ selector resolution works
|
|
422
|
-
✓ index parameter works
|
|
423
|
-
✓ save parameter returns refId
|
|
424
|
-
✓ XPath throws error
|
|
425
|
-
✓ missing element throws error
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
### 集成测试
|
|
429
|
-
|
|
430
|
-
通过实际小程序测试:
|
|
431
|
-
- ✅ 点击按钮(selector)
|
|
432
|
-
- ✅ 输入文本(refId 缓存)
|
|
433
|
-
- ✅ 列表索引(index)
|
|
434
|
-
- ✅ 跨页面操作(pagePath)
|
|
435
|
-
|
|
436
|
-
---
|
|
437
|
-
|
|
438
|
-
## 已知问题 (Known Issues)
|
|
439
|
-
|
|
440
|
-
### 技术债务
|
|
441
|
-
|
|
442
|
-
1. **XPath 不支持** - 🟢 已明确
|
|
443
|
-
- 原因:SDK 限制
|
|
444
|
-
- 影响:用户无法使用 XPath
|
|
445
|
-
- 缓解:清晰错误消息
|
|
446
|
-
|
|
447
|
-
2. **跨页面缓存失效** - 🟡 中优先级
|
|
448
|
-
- 原因:元素句柄页面相关
|
|
449
|
-
- 影响:页面切换后 refId 失效
|
|
450
|
-
- 计划:自动清空缓存 + 错误提示
|
|
451
|
-
|
|
452
|
-
### 风险
|
|
453
|
-
|
|
454
|
-
1. **选择器冲突** - 🟡 中风险
|
|
455
|
-
- 影响:selector 匹配多个元素
|
|
456
|
-
- 缓解:index 参数精确定位
|
|
457
|
-
- 监控:测试覆盖多元素场景
|
|
458
|
-
|
|
459
|
-
---
|
|
460
|
-
|
|
461
|
-
## 参考资料 (References)
|
|
462
|
-
|
|
463
|
-
### 文档
|
|
464
|
-
|
|
465
|
-
- `docs/微信小程序自动化完整操作手册.md` - 选择器语法
|
|
466
|
-
- `docs/完整实现方案.md` - ElementRef 协议设计
|
|
467
|
-
- `docs/charter.B3.align.yaml` - 任务对齐文档
|
|
468
|
-
|
|
469
|
-
### 代码
|
|
470
|
-
|
|
471
|
-
- `src/core/session.ts` - SessionState 和 elementCache(B2)
|
|
472
|
-
- `src/tools/element.ts` - Element 工具使用解析器(C4)
|
|
473
|
-
|
|
474
|
-
### 外部资源
|
|
475
|
-
|
|
476
|
-
- [miniprogram-automator 选择器文档](https://developers.weixin.qq.com/miniprogram/dev/devtools/auto/)
|
|
477
|
-
- [WXML 组件选择器](https://developers.weixin.qq.com/miniprogram/dev/component/)
|
|
478
|
-
|
|
479
|
-
---
|
|
480
|
-
|
|
481
|
-
## 后续任务 (Next Steps)
|
|
482
|
-
|
|
483
|
-
### 依赖此任务的后续任务
|
|
484
|
-
|
|
485
|
-
- ✅ C4: Element 工具实现(已完成)
|
|
486
|
-
- ✅ 所有元素操作工具(已完成)
|
|
487
|
-
|
|
488
|
-
### 改进建议
|
|
489
|
-
|
|
490
|
-
1. **性能优化**
|
|
491
|
-
- 缓存查询结果
|
|
492
|
-
- 批量查询优化
|
|
493
|
-
|
|
494
|
-
2. **功能扩展**
|
|
495
|
-
- 支持正则选择器
|
|
496
|
-
- 支持自定义查询函数
|
|
497
|
-
- 支持元素链式查询
|
|
498
|
-
|
|
499
|
-
3. **错误处理**
|
|
500
|
-
- 更详细的错误上下文
|
|
501
|
-
- 建议的修复方案
|
|
502
|
-
- 调试信息输出
|
|
503
|
-
|
|
504
|
-
---
|
|
505
|
-
|
|
506
|
-
**任务状态**: ✅ COMPLETED
|
|
507
|
-
**代码提交**: ✅ 已提交(随 C4 Element 工具)
|
|
508
|
-
**文档状态**: ⏳ RETROSPECTIVE (追溯补齐中)
|