@creatoria/miniapp-mcp 0.1.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.
Files changed (160) hide show
  1. package/README.md +469 -0
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +144 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config/defaults.d.ts +73 -0
  7. package/dist/config/defaults.d.ts.map +1 -0
  8. package/dist/config/defaults.js +118 -0
  9. package/dist/config/defaults.js.map +1 -0
  10. package/dist/config/loader.d.ts +50 -0
  11. package/dist/config/loader.d.ts.map +1 -0
  12. package/dist/config/loader.js +189 -0
  13. package/dist/config/loader.js.map +1 -0
  14. package/dist/core/element-ref.d.ts +44 -0
  15. package/dist/core/element-ref.d.ts.map +1 -0
  16. package/dist/core/element-ref.js +213 -0
  17. package/dist/core/element-ref.js.map +1 -0
  18. package/dist/core/logger.d.ts +55 -0
  19. package/dist/core/logger.d.ts.map +1 -0
  20. package/dist/core/logger.js +378 -0
  21. package/dist/core/logger.js.map +1 -0
  22. package/dist/core/output.d.ts +21 -0
  23. package/dist/core/output.d.ts.map +1 -0
  24. package/dist/core/output.js +56 -0
  25. package/dist/core/output.js.map +1 -0
  26. package/dist/core/report-generator.d.ts +24 -0
  27. package/dist/core/report-generator.d.ts.map +1 -0
  28. package/dist/core/report-generator.js +212 -0
  29. package/dist/core/report-generator.js.map +1 -0
  30. package/dist/core/session.d.ts +83 -0
  31. package/dist/core/session.d.ts.map +1 -0
  32. package/dist/core/session.js +306 -0
  33. package/dist/core/session.js.map +1 -0
  34. package/dist/core/timeout.d.ts +49 -0
  35. package/dist/core/timeout.d.ts.map +1 -0
  36. package/dist/core/timeout.js +67 -0
  37. package/dist/core/timeout.js.map +1 -0
  38. package/dist/core/tool-logger.d.ts +83 -0
  39. package/dist/core/tool-logger.d.ts.map +1 -0
  40. package/dist/core/tool-logger.js +453 -0
  41. package/dist/core/tool-logger.js.map +1 -0
  42. package/dist/core/validation.d.ts +39 -0
  43. package/dist/core/validation.d.ts.map +1 -0
  44. package/dist/core/validation.js +93 -0
  45. package/dist/core/validation.js.map +1 -0
  46. package/dist/index.d.ts +7 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +6 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/server.d.ts +7 -0
  51. package/dist/server.d.ts.map +1 -0
  52. package/dist/server.js +85 -0
  53. package/dist/server.js.map +1 -0
  54. package/dist/tools/assert.d.ts +108 -0
  55. package/dist/tools/assert.d.ts.map +1 -0
  56. package/dist/tools/assert.js +291 -0
  57. package/dist/tools/assert.js.map +1 -0
  58. package/dist/tools/automator.d.ts +45 -0
  59. package/dist/tools/automator.d.ts.map +1 -0
  60. package/dist/tools/automator.js +186 -0
  61. package/dist/tools/automator.js.map +1 -0
  62. package/dist/tools/element.d.ts +253 -0
  63. package/dist/tools/element.d.ts.map +1 -0
  64. package/dist/tools/element.js +615 -0
  65. package/dist/tools/element.js.map +1 -0
  66. package/dist/tools/index.d.ts +97 -0
  67. package/dist/tools/index.d.ts.map +1 -0
  68. package/dist/tools/index.js +1565 -0
  69. package/dist/tools/index.js.map +1 -0
  70. package/dist/tools/miniprogram.d.ts +79 -0
  71. package/dist/tools/miniprogram.d.ts.map +1 -0
  72. package/dist/tools/miniprogram.js +245 -0
  73. package/dist/tools/miniprogram.js.map +1 -0
  74. package/dist/tools/network.d.ts +65 -0
  75. package/dist/tools/network.d.ts.map +1 -0
  76. package/dist/tools/network.js +205 -0
  77. package/dist/tools/network.js.map +1 -0
  78. package/dist/tools/page.d.ts +108 -0
  79. package/dist/tools/page.d.ts.map +1 -0
  80. package/dist/tools/page.js +307 -0
  81. package/dist/tools/page.js.map +1 -0
  82. package/dist/tools/record.d.ts +86 -0
  83. package/dist/tools/record.d.ts.map +1 -0
  84. package/dist/tools/record.js +316 -0
  85. package/dist/tools/record.js.map +1 -0
  86. package/dist/tools/snapshot.d.ts +82 -0
  87. package/dist/tools/snapshot.d.ts.map +1 -0
  88. package/dist/tools/snapshot.js +258 -0
  89. package/dist/tools/snapshot.js.map +1 -0
  90. package/dist/types.d.ts +240 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +5 -0
  93. package/dist/types.js.map +1 -0
  94. package/docs/SIMPLE_USAGE.md +210 -0
  95. package/docs/api/README.md +244 -0
  96. package/docs/api/assert.md +1015 -0
  97. package/docs/api/automator.md +345 -0
  98. package/docs/api/element.md +1454 -0
  99. package/docs/api/miniprogram.md +558 -0
  100. package/docs/api/network.md +883 -0
  101. package/docs/api/page.md +909 -0
  102. package/docs/api/record.md +963 -0
  103. package/docs/api/snapshot.md +792 -0
  104. package/docs/architecture.E-Docs.md +1359 -0
  105. package/docs/architecture.F1.md +720 -0
  106. package/docs/architecture.F2.md +871 -0
  107. package/docs/architecture.F3.md +905 -0
  108. package/docs/architecture.md +90 -0
  109. package/docs/charter.A1.align.yaml +170 -0
  110. package/docs/charter.A2.align.yaml +199 -0
  111. package/docs/charter.A3.align.yaml +242 -0
  112. package/docs/charter.A4.align.yaml +227 -0
  113. package/docs/charter.B1.align.yaml +179 -0
  114. package/docs/charter.B2.align.yaml +200 -0
  115. package/docs/charter.B3.align.yaml +200 -0
  116. package/docs/charter.B4.align.yaml +188 -0
  117. package/docs/charter.C1.align.yaml +190 -0
  118. package/docs/charter.C2.align.yaml +202 -0
  119. package/docs/charter.C3.align.yaml +211 -0
  120. package/docs/charter.C4.align.yaml +263 -0
  121. package/docs/charter.C5.align.yaml +220 -0
  122. package/docs/charter.D1.align.yaml +190 -0
  123. package/docs/charter.D2.align.yaml +234 -0
  124. package/docs/charter.D3.align.yaml +206 -0
  125. package/docs/charter.E-Docs.align.yaml +294 -0
  126. package/docs/charter.F1.align.yaml +193 -0
  127. package/docs/charter.F2.align.yaml +248 -0
  128. package/docs/charter.F3.align.yaml +287 -0
  129. package/docs/charter.G.align.yaml +174 -0
  130. package/docs/charter.align.yaml +111 -0
  131. package/docs/examples/session-report-usage.md +449 -0
  132. package/docs/maintenance.md +682 -0
  133. package/docs/playwright-mcp/350/260/203/347/240/224.md +53 -0
  134. package/docs/setup-guide.md +775 -0
  135. package/docs/tasks.A1.atomize.md +296 -0
  136. package/docs/tasks.A2.atomize.md +408 -0
  137. package/docs/tasks.A3.atomize.md +564 -0
  138. package/docs/tasks.A4.atomize.md +496 -0
  139. package/docs/tasks.B1.atomize.md +352 -0
  140. package/docs/tasks.B2.atomize.md +561 -0
  141. package/docs/tasks.B3.atomize.md +508 -0
  142. package/docs/tasks.B4.atomize.md +504 -0
  143. package/docs/tasks.C1.atomize.md +540 -0
  144. package/docs/tasks.C2.atomize.md +665 -0
  145. package/docs/tasks.C3.atomize.md +745 -0
  146. package/docs/tasks.C4.atomize.md +908 -0
  147. package/docs/tasks.C5.atomize.md +755 -0
  148. package/docs/tasks.D1.atomize.md +547 -0
  149. package/docs/tasks.D2.atomize.md +619 -0
  150. package/docs/tasks.D3.atomize.md +790 -0
  151. package/docs/tasks.E-Docs.atomize.md +1204 -0
  152. package/docs/tasks.atomize.md +189 -0
  153. package/docs/troubleshooting.md +855 -0
  154. package/docs//345/256/214/346/225/264/345/256/236/347/216/260/346/226/271/346/241/210.md +155 -0
  155. package/docs//345/274/200/345/217/221/344/273/273/345/212/241/350/256/241/345/210/222.md +110 -0
  156. package/docs//345/276/256/344/277/241/345/260/217/347/250/213/345/272/217/350/207/252/345/212/250/345/214/226API/345/256/214/346/225/264/346/226/207/346/241/243.md +894 -0
  157. package/docs//345/276/256/344/277/241/345/260/217/347/250/213/345/272/217/350/207/252/345/212/250/345/214/226/345/256/214/346/225/264/346/223/215/344/275/234/346/211/213/345/206/214.md +1885 -0
  158. package/docs//346/216/245/345/217/243/346/226/271/346/241/210.md +565 -0
  159. package/docs//347/254/254/344/270/200/347/211/210/346/234/254/346/226/271/346/241/210.md +380 -0
  160. package/package.json +87 -0
@@ -0,0 +1,855 @@
1
+ # 故障排除指南
2
+
3
+ 本文档汇总了使用 creatoria-miniapp-mcp 过程中的常见问题及解决方案。
4
+
5
+ ---
6
+
7
+ ## 📋 目录
8
+
9
+ - [安装和配置问题](#安装和配置问题)
10
+ - [连接和启动问题](#连接和启动问题)
11
+ - [元素查询问题](#元素查询问题)
12
+ - [导航和页面问题](#导航和页面问题)
13
+ - [断言失败问题](#断言失败问题)
14
+ - [录制回放问题](#录制回放问题)
15
+ - [性能和超时问题](#性能和超时问题)
16
+ - [调试技巧](#调试技巧)
17
+
18
+ ---
19
+
20
+ ## 安装和配置问题
21
+
22
+ ### 问题 1: pnpm install 失败
23
+
24
+ **症状**:
25
+ ```bash
26
+ ERR_PNPM_FETCH_404 GET https://registry.npmjs.org/...
27
+ ```
28
+
29
+ **原因**: 网络问题或 npm registry 配置错误
30
+
31
+ **解决方案**:
32
+ ```bash
33
+ # 切换到淘宝镜像
34
+ pnpm config set registry https://registry.npmmirror.com
35
+
36
+ # 清除缓存后重试
37
+ pnpm store prune
38
+ pnpm install
39
+ ```
40
+
41
+ ---
42
+
43
+ ### 问题 2: TypeScript 编译错误
44
+
45
+ **症状**:
46
+ ```bash
47
+ error TS2304: Cannot find name 'MiniProgram'
48
+ ```
49
+
50
+ **原因**: 类型定义缺失或 tsconfig 配置错误
51
+
52
+ **解决方案**:
53
+ ```bash
54
+ # 重新安装依赖
55
+ rm -rf node_modules pnpm-lock.yaml
56
+ pnpm install
57
+
58
+ # 检查 tsconfig.json
59
+ cat tsconfig.json # 确认 include 包含 src/**/*
60
+ ```
61
+
62
+ ---
63
+
64
+ ### 问题 3: MCP 客户端无法识别服务器
65
+
66
+ **症状**: Claude Desktop 中看不到 miniprogram 工具
67
+
68
+ **原因**: 配置文件路径错误或格式错误
69
+
70
+ **解决方案**:
71
+ ```json
72
+ // 检查 ~/Library/Application Support/Claude/claude_desktop_config.json
73
+ {
74
+ "mcpServers": {
75
+ "miniprogram": {
76
+ "command": "node",
77
+ "args": ["/absolute/path/to/creatoria-miniapp-mcp/dist/cli.js"],
78
+ "env": {
79
+ "PROJECT_PATH": "/absolute/path/to/your/miniprogram"
80
+ }
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ **注意**:
87
+ - 必须使用绝对路径
88
+ - Windows 路径使用反斜杠转义:`C:\\path\\to\\project`
89
+ - 重启 Claude Desktop 使配置生效
90
+
91
+ ---
92
+
93
+ ## 连接和启动问题
94
+
95
+ ### 问题 4: macOS 找不到微信开发者工具 CLI
96
+
97
+ **症状**:
98
+ ```
99
+ Error: WeChat DevTools CLI not found at: /Applications/wechatwebdevtools.app/Contents/MacOS/cli
100
+ ```
101
+
102
+ **原因**: 开发者工具未安装或安装在非默认位置
103
+
104
+ **解决方案**:
105
+ ```javascript
106
+ // 方案 1: 手动指定 CLI 路径
107
+ await miniprogram_launch({
108
+ projectPath: "/path/to/project",
109
+ cliPath: "/your/custom/path/to/cli"
110
+ })
111
+
112
+ // 方案 2: 配置环境变量
113
+ // 在 MCP 配置中添加 CLI_PATH
114
+ {
115
+ "env": {
116
+ "CLI_PATH": "/your/custom/path/to/cli",
117
+ "PROJECT_PATH": "/path/to/project"
118
+ }
119
+ }
120
+ ```
121
+
122
+ **查找 CLI 路径**:
123
+ ```bash
124
+ # macOS
125
+ ls -la "/Applications/wechatwebdevtools.app/Contents/MacOS/cli"
126
+
127
+ # 如果是稳定版
128
+ ls -la "/Applications/wechatwebdevtools.app/Contents/Resources/app.nw/bin/cli"
129
+ ```
130
+
131
+ ---
132
+
133
+ ### 问题 5: 端口 9420 被占用
134
+
135
+ **症状**:
136
+ ```
137
+ Error: Port 9420 is already in use
138
+ ```
139
+
140
+ **原因**: 端口已被其他程序占用
141
+
142
+ **解决方案**:
143
+ ```javascript
144
+ // 方案 1: 使用其他端口
145
+ await miniprogram_launch({
146
+ projectPath: "/path/to/project",
147
+ port: 9421 // 或其他可用端口
148
+ })
149
+
150
+ // 方案 2: 杀掉占用进程(谨慎使用)
151
+ // macOS/Linux
152
+ lsof -ti:9420 | xargs kill -9
153
+
154
+ // Windows
155
+ netstat -ano | findstr :9420
156
+ taskkill /PID <PID> /F
157
+ ```
158
+
159
+ ---
160
+
161
+ ### 问题 6: 连接超时
162
+
163
+ **症状**:
164
+ ```
165
+ Error: Failed to connect to WeChat DevTools at port 9420
166
+ ```
167
+
168
+ **原因**: 开发者工具未开启自动化端口
169
+
170
+ **解决方案**:
171
+ 1. 打开微信开发者工具
172
+ 2. 设置 → 安全设置 → 服务端口
173
+ 3. 勾选"开启"并确认端口号(默认 9420)
174
+ 4. 重启开发者工具
175
+ 5. 使用 `miniprogram_connect` 连接:
176
+
177
+ ```javascript
178
+ await miniprogram_connect({ port: 9420 })
179
+ ```
180
+
181
+ ---
182
+
183
+ ### 问题 7: 项目路径不存在
184
+
185
+ **症状**:
186
+ ```
187
+ Error: Project path does not exist: /path/to/project
188
+ ```
189
+
190
+ **解决方案**:
191
+ ```bash
192
+ # 检查路径是否正确
193
+ ls -la "/path/to/project"
194
+
195
+ # 检查是否是有效的小程序项目
196
+ ls "/path/to/project/app.json" # 必须存在
197
+
198
+ # 使用绝对路径
199
+ await miniprogram_launch({
200
+ projectPath: "/Users/username/projects/my-miniprogram" # 绝对路径
201
+ })
202
+ ```
203
+
204
+ ---
205
+
206
+ ## 元素查询问题
207
+
208
+ ### 问题 8: 元素查询失败
209
+
210
+ **症状**:
211
+ ```
212
+ Error: Element not found with selector: .my-button
213
+ ```
214
+
215
+ **原因**: 元素未渲染、选择器错误或在错误的页面
216
+
217
+ **解决方案**:
218
+ ```javascript
219
+ // 1. 等待元素出现
220
+ await page_wait_for({
221
+ selector: ".my-button",
222
+ timeout: 3000
223
+ })
224
+ const btn = await page_query({
225
+ selector: ".my-button",
226
+ save: true
227
+ })
228
+
229
+ // 2. 检查选择器语法
230
+ // ✅ 正确
231
+ ".my-button"
232
+ "#username"
233
+ ".list .item:first-child"
234
+
235
+ // ❌ 错误
236
+ "my-button" // 缺少类选择器符号
237
+ ".my-button:hover" // 不支持伪类
238
+
239
+ // 3. 验证页面路径
240
+ const pageStack = await miniprogram_get_page_stack()
241
+ console.log("当前页面:", pageStack.pages[pageStack.pages.length - 1].path)
242
+
243
+ // 4. 使用 snapshot_page 查看页面结构
244
+ const snapshot = await snapshot_page({
245
+ includeScreenshot: true
246
+ })
247
+ console.log("页面数据:", snapshot.data)
248
+ ```
249
+
250
+ ---
251
+
252
+ ### 问题 9: 元素引用失效
253
+
254
+ **症状**:
255
+ ```
256
+ Error: Element not found with refId: elem_abc123
257
+ ```
258
+
259
+ **原因**: 页面跳转后元素引用失效
260
+
261
+ **解决方案**:
262
+ ```javascript
263
+ // ❌ 错误:页面跳转后引用失效
264
+ const btn = await page_query({ selector: ".btn", save: true })
265
+ await miniprogram_navigate({ method: "navigateTo", url: "/other" })
266
+ await element_tap({ refId: btn.refId }) // 错误!
267
+
268
+ // ✅ 正确:跳转后重新查询
269
+ await miniprogram_navigate({ method: "navigateTo", url: "/other" })
270
+ const newBtn = await page_query({ selector: ".btn", save: true })
271
+ await element_tap({ refId: newBtn.refId })
272
+ ```
273
+
274
+ ---
275
+
276
+ ### 问题 10: 查询到多个元素但只返回第一个
277
+
278
+ **症状**: `page_query` 只返回第一个匹配的元素
279
+
280
+ **原因**: `page_query` 设计如此,需要使用 `page_query_all`
281
+
282
+ **解决方案**:
283
+ ```javascript
284
+ // 查询所有匹配元素
285
+ const items = await page_query_all({
286
+ selector: ".product-item",
287
+ save: true
288
+ })
289
+ console.log(`找到 ${items.count} 个元素`)
290
+
291
+ // 操作特定索引的元素
292
+ await element_tap({ refId: items.elements[2].refId }) // 第 3 个
293
+ ```
294
+
295
+ ---
296
+
297
+ ## 导航和页面问题
298
+
299
+ ### 问题 11: 页面栈溢出
300
+
301
+ **症状**:
302
+ ```
303
+ Error: Page stack overflow (maximum 10 pages)
304
+ ```
305
+
306
+ **原因**: 连续使用 `navigateTo` 导致页面栈超过 10 层
307
+
308
+ **解决方案**:
309
+ ```javascript
310
+ // 方案 1: 使用 redirectTo 代替 navigateTo
311
+ await miniprogram_navigate({
312
+ method: "redirectTo", // 不增加页面栈
313
+ url: "/pages/detail/detail"
314
+ })
315
+
316
+ // 方案 2: 使用 reLaunch 重置页面栈
317
+ await miniprogram_navigate({
318
+ method: "reLaunch",
319
+ url: "/pages/index/index"
320
+ })
321
+
322
+ // 方案 3: 监控页面栈深度
323
+ const pageStack = await miniprogram_get_page_stack()
324
+ if (pageStack.pages.length > 8) {
325
+ console.warn("页面栈接近上限,建议使用 redirectTo 或 reLaunch")
326
+ }
327
+ ```
328
+
329
+ ---
330
+
331
+ ### 问题 12: switchTab 无法带参数
332
+
333
+ **症状**:
334
+ ```
335
+ Error: switchTab cannot accept query parameters
336
+ ```
337
+
338
+ **原因**: `switchTab` 是小程序的限制,不支持 URL 参数
339
+
340
+ **解决方案**:
341
+ ```javascript
342
+ // ❌ 错误
343
+ await miniprogram_navigate({
344
+ method: "switchTab",
345
+ url: "/pages/cart/cart?from=detail" // 错误!
346
+ })
347
+
348
+ // ✅ 正确:使用全局数据或 setData
349
+ await page_set_data({
350
+ data: { from: "detail" }
351
+ })
352
+ await miniprogram_navigate({
353
+ method: "switchTab",
354
+ url: "/pages/cart/cart"
355
+ })
356
+
357
+ // 或使用 miniprogram_evaluate
358
+ await miniprogram_evaluate({
359
+ expression: "getApp().globalData.from = 'detail'"
360
+ })
361
+ ```
362
+
363
+ ---
364
+
365
+ ### 问题 13: navigateBack 返回失败
366
+
367
+ **症状**: 返回操作没有效果或报错
368
+
369
+ **原因**: 已经在首页或 `delta` 超过页面栈深度
370
+
371
+ **解决方案**:
372
+ ```javascript
373
+ // 检查页面栈深度
374
+ const pageStack = await miniprogram_get_page_stack()
375
+ if (pageStack.pages.length > 1) {
376
+ await miniprogram_navigate({
377
+ method: "navigateBack",
378
+ delta: 1
379
+ })
380
+ } else {
381
+ console.log("已在首页,无法返回")
382
+ }
383
+ ```
384
+
385
+ ---
386
+
387
+ ## 断言失败问题
388
+
389
+ ### 问题 14: 文本断言失败但看起来相同
390
+
391
+ **症状**:
392
+ ```
393
+ Assertion failed: Text mismatch. Expected: "Hello", Actual: "Hello "
394
+ ```
395
+
396
+ **原因**: 包含不可见的空白字符
397
+
398
+ **解决方案**:
399
+ ```javascript
400
+ // 方案 1: 使用 assert_text_contains(更宽松)
401
+ await assert_text_contains({
402
+ refId: el.refId,
403
+ expected: "Hello"
404
+ })
405
+
406
+ // 方案 2: 先 trim 再比较
407
+ const text = await element_get_text({ refId: el.refId })
408
+ if (text.text.trim() === "Hello") {
409
+ console.log("✅ 文本匹配")
410
+ }
411
+
412
+ // 方案 3: 获取实际文本查看
413
+ const result = await element_get_text({ refId: el.refId })
414
+ console.log("实际文本:", JSON.stringify(result.text))
415
+ // 输出: "实际文本: \"Hello \""(可以看到尾部空格)
416
+ ```
417
+
418
+ ---
419
+
420
+ ### 问题 15: 数据断言类型不匹配
421
+
422
+ **症状**:
423
+ ```
424
+ Assertion failed: Page data mismatch. Expected: 10, Actual: "10"
425
+ ```
426
+
427
+ **原因**: 数据类型不一致(数字 vs 字符串)
428
+
429
+ **解决方案**:
430
+ ```javascript
431
+ // 先获取实际数据类型
432
+ const data = await page_get_data({ path: "count" })
433
+ console.log("实际值:", data.data, "类型:", typeof data.data)
434
+
435
+ // 使用正确的类型进行断言
436
+ await assert_data({
437
+ path: "count",
438
+ expected: "10" // 字符串类型
439
+ })
440
+
441
+ // 或者
442
+ await assert_data({
443
+ path: "count",
444
+ expected: 10 // 数字类型
445
+ })
446
+ ```
447
+
448
+ ---
449
+
450
+ ### 问题 16: assert_visible 失败但元素明明可见
451
+
452
+ **症状**:
453
+ ```
454
+ Assertion failed: Element is not visible. Size: {"width":0,"height":0}
455
+ ```
456
+
457
+ **原因**: 元素正在动画中、display: none、或还未渲染完成
458
+
459
+ **解决方案**:
460
+ ```javascript
461
+ // 1. 等待动画完成
462
+ await page_wait_for({ timeout: 500 })
463
+ await assert_visible({ refId: el.refId })
464
+
465
+ // 2. 检查元素实际尺寸
466
+ const size = await element_get_size({ refId: el.refId })
467
+ console.log("元素尺寸:", size.size)
468
+
469
+ // 3. 截图查看
470
+ await miniprogram_screenshot({ filename: "debug-visibility.png" })
471
+ ```
472
+
473
+ ---
474
+
475
+ ## 录制回放问题
476
+
477
+ ### 问题 20: 录制未记录任何动作
478
+
479
+ **症状**: 使用 record_stop 时显示 0 个动作
480
+
481
+ **原因**:
482
+ - 未正确启动录制
483
+ - 录制期间没有执行工具调用
484
+ - 意外停止或丢弃录制
485
+
486
+ **解决方案**:
487
+ ```javascript
488
+ // 确认录制成功启动
489
+ const result = await record_start({ name: "Test" })
490
+ console.log(result.success) // 必须为 true
491
+
492
+ // 执行操作(这些会被自动记录)
493
+ await miniprogram_navigate({ method: "navigateTo", url: "/pages/test" })
494
+ await element_tap({ selector: ".btn" })
495
+
496
+ // 停止并保存
497
+ const stopResult = await record_stop()
498
+ console.log(`Recorded ${stopResult.actionCount} actions`) // 应该 > 0
499
+ ```
500
+
501
+ ---
502
+
503
+ ### 问题 21: 回放失败率高
504
+
505
+ **症状**: record_replay 时大量动作失败
506
+
507
+ **原因**:
508
+ - 环境状态与录制时不一致
509
+ - RefId 已失效
510
+ - 页面路径变化
511
+ - 动态数据不匹配
512
+
513
+ **解决方案**:
514
+ ```javascript
515
+ // 1. 确保初始状态一致
516
+ await automator_close() // 清理旧会话
517
+ await automator_launch({ projectPath: PROJECT_PATH })
518
+
519
+ // 2. 使用 selector 而非 refId 录制
520
+ // ✅ 推荐
521
+ await element_tap({ selector: ".login-btn" })
522
+
523
+ // ❌ 避免(refId 可能失效)
524
+ await element_tap({ refId: "elem_xxx" })
525
+
526
+ // 3. 使用 continueOnError 模式查看所有失败
527
+ const result = await record_replay({
528
+ sequenceId: "seq_xxx",
529
+ continueOnError: true // 继续执行,收集所有错误
530
+ })
531
+
532
+ console.log(`Failures: ${result.failureCount}`)
533
+ result.results.forEach((r, i) => {
534
+ if (!r.success) {
535
+ console.log(`Action ${i+1} (${r.toolName}): ${r.error}`)
536
+ }
537
+ })
538
+ ```
539
+
540
+ ---
541
+
542
+ ### 问题 22: 序列文件找不到或损坏
543
+
544
+ **症状**:
545
+ - `record_get`: `ENOENT: no such file`
546
+ - `record_replay`: `Unexpected token in JSON`
547
+
548
+ **原因**:
549
+ - 序列文件被删除或移动
550
+ - 录制时 stop 失败未完成写入
551
+ - 文件权限问题
552
+
553
+ **解决方案**:
554
+ ```bash
555
+ # 1. 检查序列文件位置
556
+ ls -la .mcp-artifacts/*/sequences/
557
+
558
+ # 2. 查看序列列表
559
+ # 在 Claude Code 中运行
560
+ const { sequences } = await record_list()
561
+ console.log(sequences.map(s => s.id))
562
+
563
+ # 3. 如果文件损坏,删除并重新录制
564
+ rm .mcp-artifacts/session_xxx/sequences/seq_xxx.json
565
+ # 重新录制
566
+ ```
567
+
568
+ ---
569
+
570
+ ### 问题 23: 回放速度过快导致失败
571
+
572
+ **症状**: 回放时元素未加载完成就执行下一步
573
+
574
+ **原因**: 回放不会等待录制时的时间间隔,连续执行所有动作
575
+
576
+ **解决方案**:
577
+ ```javascript
578
+ // 在录制时添加明确的等待步骤
579
+ await record_start({ name: "Stable Test" })
580
+
581
+ await element_tap({ selector: ".submit-btn" })
582
+
583
+ // ✅ 添加等待
584
+ await page_waitFor({
585
+ selector: ".result",
586
+ timeout: 5000
587
+ })
588
+
589
+ await assert_exists({ selector: ".result" })
590
+
591
+ await record_stop()
592
+
593
+ // 回放时会重新执行 page_waitFor
594
+ await record_replay({ sequenceId: "seq_xxx" })
595
+ ```
596
+
597
+ ---
598
+
599
+ ## 性能和超时问题
600
+
601
+ ### 问题 17: page_wait_for 超时
602
+
603
+ **症状**:
604
+ ```
605
+ Error: Timeout waiting for element: .loading-spinner
606
+ ```
607
+
608
+ **原因**: 元素未在指定时间内出现
609
+
610
+ **解决方案**:
611
+ ```javascript
612
+ // 方案 1: 增加超时时间
613
+ await page_wait_for({
614
+ selector: ".result",
615
+ timeout: 5000 // 5 秒
616
+ })
617
+
618
+ // 方案 2: 使用 try-catch 处理超时
619
+ try {
620
+ await page_wait_for({
621
+ selector: ".result",
622
+ timeout: 2000
623
+ })
624
+ } catch (error) {
625
+ console.log("元素未出现,继续执行其他逻辑")
626
+ // 或截图调试
627
+ await miniprogram_screenshot({ filename: "timeout-debug.png" })
628
+ }
629
+
630
+ // 方案 3: 检查页面数据状态
631
+ const isLoading = await page_get_data({ path: "isLoading" })
632
+ if (!isLoading.data) {
633
+ console.log("加载已完成")
634
+ }
635
+ ```
636
+
637
+ ---
638
+
639
+ ### 问题 18: 操作执行缓慢
640
+
641
+ **症状**: 每个工具调用都很慢
642
+
643
+ **原因**:
644
+ - 未使用元素引用缓存
645
+ - 频繁截图
646
+ - 网络延迟
647
+
648
+ **解决方案**:
649
+ ```javascript
650
+ // 1. 使用 save: true 缓存元素
651
+ const items = await page_query_all({
652
+ selector: ".item",
653
+ save: true // ✅ 缓存所有元素引用
654
+ })
655
+ for (const item of items.elements) {
656
+ await element_tap({ refId: item.refId }) // 直接使用 refId,无需重新查询
657
+ }
658
+
659
+ // 2. 减少截图频率
660
+ // ❌ 每步都截图
661
+ await element_tap({ refId: btn.refId })
662
+ await miniprogram_screenshot({ filename: "step1.png" })
663
+ await element_input({ refId: input.refId, value: "test" })
664
+ await miniprogram_screenshot({ filename: "step2.png" })
665
+
666
+ // ✅ 仅关键步骤截图
667
+ await element_tap({ refId: btn.refId })
668
+ await element_input({ refId: input.refId, value: "test" })
669
+ await miniprogram_screenshot({ filename: "form-filled.png" }) // 一次截图
670
+
671
+ // 3. 批量操作时使用 Promise.all(谨慎)
672
+ // 注意:并发操作可能导致竞态条件
673
+ ```
674
+
675
+ ---
676
+
677
+ ### 问题 19: 会话超时
678
+
679
+ **症状**:
680
+ ```
681
+ Error: Session expired. Please reconnect.
682
+ ```
683
+
684
+ **原因**: 30 分钟无活动导致会话自动清理
685
+
686
+ **解决方案**:
687
+ ```javascript
688
+ // 重新连接
689
+ await miniprogram_launch({
690
+ projectPath: "/path/to/project"
691
+ })
692
+
693
+ // 或使用 connect(如果开发者工具仍在运行)
694
+ await miniprogram_connect({ port: 9420 })
695
+ ```
696
+
697
+ ---
698
+
699
+ ## 调试技巧
700
+
701
+ ### 技巧 1: 使用快照调试
702
+
703
+ ```javascript
704
+ // 捕获完整应用状态
705
+ const snapshot = await snapshot_full({
706
+ filename: "debug-state",
707
+ includeScreenshot: true
708
+ })
709
+
710
+ console.log("系统信息:", snapshot.data.systemInfo)
711
+ console.log("页面栈:", snapshot.data.pageStack)
712
+ console.log("当前页面数据:", snapshot.data.currentPage.data)
713
+ console.log("快照文件:", snapshot.snapshotPath)
714
+ ```
715
+
716
+ ---
717
+
718
+ ### 技巧 2: 查看页面 HTML 结构
719
+
720
+ ```javascript
721
+ // 获取页面 HTML(通过 evaluate)
722
+ const html = await miniprogram_evaluate({
723
+ expression: "document.body.innerHTML"
724
+ })
725
+ console.log("页面 HTML:", html.result)
726
+ ```
727
+
728
+ ---
729
+
730
+ ### 技巧 3: 监控页面数据变化
731
+
732
+ ```javascript
733
+ // 操作前
734
+ const before = await page_get_data()
735
+ console.log("操作前:", before.data)
736
+
737
+ // 执行操作
738
+ await element_tap({ refId: btn.refId })
739
+ await page_wait_for({ timeout: 500 })
740
+
741
+ // 操作后
742
+ const after = await page_get_data()
743
+ console.log("操作后:", after.data)
744
+
745
+ // 对比
746
+ console.log("变化:", JSON.stringify(after.data) !== JSON.stringify(before.data))
747
+ ```
748
+
749
+ ---
750
+
751
+ ### 技巧 4: 错误时自动截图
752
+
753
+ ```javascript
754
+ async function runTestWithAutoScreenshot(testFn, testName) {
755
+ try {
756
+ await testFn()
757
+ console.log(`✅ ${testName} 通过`)
758
+ } catch (error) {
759
+ const filename = `error-${testName}-${Date.now()}.png`
760
+ await miniprogram_screenshot({ filename })
761
+ console.error(`❌ ${testName} 失败:`, error.message)
762
+ console.log(`📸 错误截图: ${filename}`)
763
+ throw error
764
+ }
765
+ }
766
+
767
+ // 使用
768
+ await runTestWithAutoScreenshot(async () => {
769
+ await element_tap({ refId: btn.refId })
770
+ await assert_exists({ selector: ".result" })
771
+ }, "button-click-test")
772
+ ```
773
+
774
+ ---
775
+
776
+ ### 技巧 5: 日志记录
777
+
778
+ ```javascript
779
+ // 在关键步骤添加日志
780
+ console.log("=== 测试开始 ===")
781
+ console.log("步骤 1: 启动小程序")
782
+ await miniprogram_launch({ projectPath: "/path" })
783
+
784
+ console.log("步骤 2: 导航到列表页")
785
+ await miniprogram_navigate({ method: "navigateTo", url: "/pages/list/list" })
786
+
787
+ console.log("步骤 3: 查询元素")
788
+ const items = await page_query_all({ selector: ".item", save: true })
789
+ console.log(`找到 ${items.count} 个元素`)
790
+
791
+ console.log("=== 测试完成 ===")
792
+ ```
793
+
794
+ ---
795
+
796
+ ### 技巧 6: 使用录制回放快速重现问题
797
+
798
+ **场景**: 需要快速重现复杂操作流程中的问题
799
+
800
+ ```javascript
801
+ // 1. 录制问题重现步骤
802
+ await record_start({ name: "Bug Reproduction" })
803
+
804
+ // 执行导致问题的操作序列
805
+ await miniprogram_navigate(...)
806
+ await element_input(...)
807
+ await element_tap(...)
808
+ // ... 问题出现
809
+
810
+ await record_stop()
811
+
812
+ // 2. 修改代码后,快速回放验证
813
+ await record_replay({
814
+ sequenceId: "seq_xxx",
815
+ continueOnError: true
816
+ })
817
+
818
+ // 3. 如果问题依然存在,捕获快照对比
819
+ await record_start({ name: "Debug Session" })
820
+ await record_replay({ sequenceId: "seq_xxx" })
821
+ await snapshot_page({ includeScreenshot: true })
822
+ await record_stop()
823
+ ```
824
+
825
+ **优点**:
826
+ - 无需手动重复操作
827
+ - 可在 CI/CD 中自动验证修复
828
+ - 保存为回归测试用例
829
+
830
+ ---
831
+
832
+ ## 获取帮助
833
+
834
+ 如果以上方案无法解决您的问题,请:
835
+
836
+ 1. **查看完整文档**:
837
+ - [API 参考](./api/README.md)
838
+ - [使用示例](../examples/README.md)
839
+ - [系统架构](./architecture.md)
840
+
841
+ 2. **提交 Issue**:
842
+ - [GitHub Issues](https://github.com/your-org/creatoria-miniapp-mcp/issues)
843
+ - 包含完整错误信息
844
+ - 附上最小可复现代码
845
+
846
+ 3. **参与讨论**:
847
+ - [GitHub Discussions](https://github.com/your-org/creatoria-miniapp-mcp/discussions)
848
+
849
+ 4. **查看源码**:
850
+ - [src/tools/](../src/tools/) - 工具实现
851
+ - [tests/](../tests/) - 测试用例
852
+
853
+ ---
854
+
855
+ **最后更新**: 2025-10-02