weixin-devtools-mcp 0.0.1 → 0.1.1

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 (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -128
  3. package/build/MiniProgramContext.d.ts +317 -0
  4. package/build/MiniProgramContext.d.ts.map +1 -0
  5. package/build/MiniProgramContext.js +696 -0
  6. package/build/MiniProgramContext.js.map +1 -0
  7. package/build/collectors/Collector.d.ts +127 -0
  8. package/build/collectors/Collector.d.ts.map +1 -0
  9. package/build/collectors/Collector.js +252 -0
  10. package/build/collectors/Collector.js.map +1 -0
  11. package/build/collectors/ConsoleCollector.d.ts +104 -0
  12. package/build/collectors/ConsoleCollector.d.ts.map +1 -0
  13. package/build/collectors/ConsoleCollector.js +157 -0
  14. package/build/collectors/ConsoleCollector.js.map +1 -0
  15. package/build/collectors/NetworkCollector.d.ts +167 -0
  16. package/build/collectors/NetworkCollector.d.ts.map +1 -0
  17. package/build/collectors/NetworkCollector.js +265 -0
  18. package/build/collectors/NetworkCollector.js.map +1 -0
  19. package/build/collectors/index.d.ts +13 -0
  20. package/build/collectors/index.d.ts.map +1 -0
  21. package/build/collectors/index.js +17 -0
  22. package/build/collectors/index.js.map +1 -0
  23. package/build/config/tool-profile.d.ts +30 -0
  24. package/build/config/tool-profile.d.ts.map +1 -0
  25. package/build/config/tool-profile.js +138 -0
  26. package/build/config/tool-profile.js.map +1 -0
  27. package/build/connection/adapters.d.ts +3 -0
  28. package/build/connection/adapters.d.ts.map +1 -0
  29. package/build/connection/adapters.js +134 -0
  30. package/build/connection/adapters.js.map +1 -0
  31. package/build/connection/errors.d.ts +34 -0
  32. package/build/connection/errors.d.ts.map +1 -0
  33. package/build/connection/errors.js +101 -0
  34. package/build/connection/errors.js.map +1 -0
  35. package/build/connection/health-probe.d.ts +4 -0
  36. package/build/connection/health-probe.d.ts.map +1 -0
  37. package/build/connection/health-probe.js +60 -0
  38. package/build/connection/health-probe.js.map +1 -0
  39. package/build/connection/index.d.ts +6 -0
  40. package/build/connection/index.d.ts.map +1 -0
  41. package/build/connection/index.js +6 -0
  42. package/build/connection/index.js.map +1 -0
  43. package/build/connection/manager.d.ts +19 -0
  44. package/build/connection/manager.d.ts.map +1 -0
  45. package/build/connection/manager.js +227 -0
  46. package/build/connection/manager.js.map +1 -0
  47. package/build/connection/resolver.d.ts +3 -0
  48. package/build/connection/resolver.d.ts.map +1 -0
  49. package/build/connection/resolver.js +99 -0
  50. package/build/connection/resolver.js.map +1 -0
  51. package/build/connection/types.d.ts +95 -0
  52. package/build/connection/types.d.ts.map +1 -0
  53. package/build/connection/types.js +16 -0
  54. package/build/connection/types.js.map +1 -0
  55. package/build/core/assertion.d.ts +22 -0
  56. package/build/core/assertion.d.ts.map +1 -0
  57. package/build/core/assertion.js +318 -0
  58. package/build/core/assertion.js.map +1 -0
  59. package/build/core/connection.d.ts +37 -0
  60. package/build/core/connection.d.ts.map +1 -0
  61. package/build/core/connection.js +745 -0
  62. package/build/core/connection.js.map +1 -0
  63. package/build/core/index.d.ts +13 -0
  64. package/build/core/index.d.ts.map +1 -0
  65. package/build/core/index.js +19 -0
  66. package/build/core/index.js.map +1 -0
  67. package/build/core/interaction.d.ts +22 -0
  68. package/build/core/interaction.d.ts.map +1 -0
  69. package/build/core/interaction.js +185 -0
  70. package/build/core/interaction.js.map +1 -0
  71. package/build/core/navigation.d.ts +26 -0
  72. package/build/core/navigation.d.ts.map +1 -0
  73. package/build/core/navigation.js +210 -0
  74. package/build/core/navigation.js.map +1 -0
  75. package/build/core/query.d.ts +14 -0
  76. package/build/core/query.d.ts.map +1 -0
  77. package/build/core/query.js +191 -0
  78. package/build/core/query.js.map +1 -0
  79. package/build/core/screenshot.d.ts +10 -0
  80. package/build/core/screenshot.d.ts.map +1 -0
  81. package/build/core/screenshot.js +93 -0
  82. package/build/core/screenshot.js.map +1 -0
  83. package/build/core/snapshot.d.ts +17 -0
  84. package/build/core/snapshot.d.ts.map +1 -0
  85. package/build/core/snapshot.js +225 -0
  86. package/build/core/snapshot.js.map +1 -0
  87. package/build/core/types.d.ts +250 -0
  88. package/build/core/types.d.ts.map +1 -0
  89. package/build/core/types.js +6 -0
  90. package/build/core/types.js.map +1 -0
  91. package/build/formatters/consoleFormatter.d.ts +50 -0
  92. package/build/formatters/consoleFormatter.d.ts.map +1 -0
  93. package/build/formatters/consoleFormatter.js +116 -0
  94. package/build/formatters/consoleFormatter.js.map +1 -0
  95. package/build/formatters/snapshotFormatter.d.ts +41 -0
  96. package/build/formatters/snapshotFormatter.d.ts.map +1 -0
  97. package/build/formatters/snapshotFormatter.js +156 -0
  98. package/build/formatters/snapshotFormatter.js.map +1 -0
  99. package/build/index.d.ts +11 -0
  100. package/build/index.d.ts.map +1 -0
  101. package/build/index.js +45 -9
  102. package/build/index.js.map +1 -0
  103. package/build/server.d.ts +7 -0
  104. package/build/server.d.ts.map +1 -0
  105. package/build/server.js +88 -32
  106. package/build/server.js.map +1 -0
  107. package/build/tools/ToolDefinition.d.ts +265 -0
  108. package/build/tools/ToolDefinition.d.ts.map +1 -0
  109. package/build/tools/ToolDefinition.js +16 -7
  110. package/build/tools/ToolDefinition.js.map +1 -0
  111. package/build/tools/assert.d.ts +17 -0
  112. package/build/tools/assert.d.ts.map +1 -0
  113. package/build/tools/assert.js +63 -103
  114. package/build/tools/assert.js.map +1 -0
  115. package/build/tools/connection.d.ts +13 -0
  116. package/build/tools/connection.d.ts.map +1 -0
  117. package/build/tools/connection.js +338 -611
  118. package/build/tools/connection.js.map +1 -0
  119. package/build/tools/console.d.ts +20 -0
  120. package/build/tools/console.d.ts.map +1 -0
  121. package/build/tools/console.js +162 -152
  122. package/build/tools/console.js.map +1 -0
  123. package/build/tools/diagnose.d.ts +22 -0
  124. package/build/tools/diagnose.d.ts.map +1 -0
  125. package/build/tools/diagnose.js +406 -13
  126. package/build/tools/diagnose.js.map +1 -0
  127. package/build/tools/index.d.ts +6 -0
  128. package/build/tools/index.d.ts.map +1 -0
  129. package/build/tools/index.js +3 -77
  130. package/build/tools/index.js.map +1 -0
  131. package/build/tools/input.d.ts +21 -0
  132. package/build/tools/input.d.ts.map +1 -0
  133. package/build/tools/input.js +73 -139
  134. package/build/tools/input.js.map +1 -0
  135. package/build/tools/navigate.d.ts +21 -0
  136. package/build/tools/navigate.d.ts.map +1 -0
  137. package/build/tools/navigate.js +63 -126
  138. package/build/tools/navigate.js.map +1 -0
  139. package/build/tools/network.d.ts +21 -0
  140. package/build/tools/network.d.ts.map +1 -0
  141. package/build/tools/network.js +214 -1044
  142. package/build/tools/network.js.map +1 -0
  143. package/build/tools/page.d.ts +13 -0
  144. package/build/tools/page.d.ts.map +1 -0
  145. package/build/tools/page.js +6 -3
  146. package/build/tools/page.js.map +1 -0
  147. package/build/tools/screenshot.d.ts +9 -0
  148. package/build/tools/screenshot.d.ts.map +1 -0
  149. package/build/tools/screenshot.js +3 -1
  150. package/build/tools/screenshot.js.map +1 -0
  151. package/build/tools/script.d.ts +6 -0
  152. package/build/tools/script.d.ts.map +1 -0
  153. package/build/tools/script.js +92 -0
  154. package/build/tools/script.js.map +1 -0
  155. package/build/tools/snapshot.d.ts +9 -0
  156. package/build/tools/snapshot.d.ts.map +1 -0
  157. package/build/tools/snapshot.js +78 -12
  158. package/build/tools/snapshot.js.map +1 -0
  159. package/build/tools/tools.d.ts +15 -0
  160. package/build/tools/tools.d.ts.map +1 -0
  161. package/build/tools/tools.js +63 -0
  162. package/build/tools/tools.js.map +1 -0
  163. package/build/tools.d.ts +431 -0
  164. package/build/tools.d.ts.map +1 -0
  165. package/build/tools.js +258 -118
  166. package/build/tools.js.map +1 -0
  167. package/build/types/errors.d.ts +189 -0
  168. package/build/types/errors.d.ts.map +1 -0
  169. package/build/types/errors.js +257 -0
  170. package/build/types/errors.js.map +1 -0
  171. package/build/utils/error.d.ts +6 -0
  172. package/build/utils/error.d.ts.map +1 -0
  173. package/build/utils/error.js +11 -0
  174. package/build/utils/error.js.map +1 -0
  175. package/build/utils/idGenerator.d.ts +21 -0
  176. package/build/utils/idGenerator.d.ts.map +1 -0
  177. package/build/utils/idGenerator.js +23 -0
  178. package/build/utils/idGenerator.js.map +1 -0
  179. package/build/version.d.ts +7 -0
  180. package/build/version.d.ts.map +1 -0
  181. package/build/version.js +10 -0
  182. package/build/version.js.map +1 -0
  183. package/package.json +31 -9
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Wooter Shen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -2,18 +2,19 @@
2
2
 
3
3
  > 强大的微信小程序自动化测试解决方案,基于 Model Context Protocol 实现
4
4
 
5
- [![Version](https://img.shields.io/badge/version-0.3.3-blue.svg)](https://github.com/yourusername/weixin-devtools-mcp)
5
+ [![Version](https://img.shields.io/badge/version-0.3.3-blue.svg)](https://github.com/wooter-s/weixin-devtools-mcp)
6
6
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7
7
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue.svg)](https://www.typescriptlang.org/)
8
8
 
9
9
  ## ✨ 核心特性
10
10
 
11
- - 🚀 **31个专业工具** - 覆盖连接、查询、交互、断言、导航、调试等完整测试场景
11
+ - 🚀 **31个专业工具(full profile)** - 覆盖连接、查询、交互、断言、导航、调试等完整测试场景
12
12
  - 🤖 **智能连接** - 支持 auto/launch/connect 三种模式,自动端口检测,无需手动配置
13
13
  - 🔍 **自动网络监控** - 连接时自动启动,实时拦截 wx.request/uploadFile/downloadFile
14
- - ✅ **完整断言体系** - 5类断言工具,验证元素存在、可见性、文本、属性、状态
14
+ - ✅ **完整断言体系** - 3类断言工具(`assert_text`/`assert_attribute`/`assert_state`),覆盖文本、属性与状态校验
15
15
  - 📸 **丰富调试能力** - 支持页面截图、Console 监听、网络请求追踪、诊断工具
16
16
  - 🏗️ **模块化架构** - 基于 chrome-devtools-mcp 架构模式,易于扩展和维护
17
+ - 🧩 **可配置工具暴露** - 默认 core profile(20个工具),支持按类别开启 Console/Network/Debug
17
18
  - 🧪 **全面测试覆盖** - 单元测试 + 集成测试,测试覆盖率 >80%
18
19
 
19
20
  ## 📦 安装
@@ -41,7 +42,7 @@ npm install -g weixin-devtools-mcp
41
42
 
42
43
  ```bash
43
44
  # 克隆项目
44
- git clone https://github.com/yourusername/weixin-devtools-mcp.git
45
+ git clone https://github.com/wooter-s/weixin-devtools-mcp.git
45
46
  cd weixin-devtools-mcp
46
47
 
47
48
  # 安装依赖
@@ -89,13 +90,56 @@ npm run build
89
90
 
90
91
  ### 配置方式三:开发者本地路径
91
92
 
92
- 如果从源码安装,使用绝对路径:
93
+ 如果从源码安装,推荐通过 Node.js 启动构建产物(跨平台):
93
94
 
94
95
  ```json
95
96
  {
96
97
  "mcpServers": {
97
98
  "weixin-devtools-mcp": {
98
- "command": "/path/to/weixin-devtools-mcp/build/server.js"
99
+ "command": "node",
100
+ "args": ["/path/to/weixin-devtools-mcp/build/server.js"]
101
+ }
102
+ }
103
+ }
104
+ ```
105
+
106
+ ### 工具 Profile 配置(v0.4+)
107
+
108
+ 服务器支持按 profile 控制暴露工具,降低默认工具数量:
109
+
110
+ - `core`(默认):20 个核心自动化工具
111
+ - `full`:31 个完整工具
112
+ - `minimal`:10 个最小工具
113
+
114
+ 也支持按类别增减:
115
+
116
+ - `--enable-categories=console,network,debug`
117
+ - `--disable-categories=console,network,debug,core`
118
+
119
+ `npx` 配置示例(启用 full):
120
+
121
+ ```json
122
+ {
123
+ "mcpServers": {
124
+ "weixin-devtools-mcp": {
125
+ "command": "npx",
126
+ "args": ["-y", "weixin-devtools-mcp", "--tools-profile=full"]
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ 本地构建产物示例(在 core 基础上启用 network + debug):
133
+
134
+ ```json
135
+ {
136
+ "mcpServers": {
137
+ "weixin-devtools-mcp": {
138
+ "command": "node",
139
+ "args": [
140
+ "/path/to/weixin-devtools-mcp/build/server.js",
141
+ "--enable-categories=network,debug"
142
+ ]
99
143
  }
100
144
  }
101
145
  }
@@ -106,130 +150,44 @@ npm run build
106
150
  ### 第一个自动化测试
107
151
 
108
152
  ```typescript
109
- // 1. 智能连接到微信开发者工具(自动检测端口)
110
- connect_devtools_enhanced({
153
+ // 1. 连接微信开发者工具(auto 策略)
154
+ connect_devtools({
111
155
  projectPath: "/path/to/your/miniprogram",
112
- mode: "auto",
156
+ strategy: "auto",
113
157
  verbose: true
114
158
  })
115
159
 
116
160
  // 2. 查找登录按钮
117
- $({ selector: "button.login-btn" })
161
+ query_selector({ selector: "button.login-btn" })
118
162
 
119
163
  // 3. 点击登录按钮
120
164
  click({ uid: "button.login-btn" })
121
165
 
122
166
  // 4. 等待登录成功
123
- waitFor({ selector: ".welcome-message", timeout: 5000 })
167
+ wait_for({ selector: ".welcome-message", timeout: 5000 })
124
168
 
125
169
  // 5. 验证登录成功
126
170
  assert_text({ uid: ".welcome-message", text: "欢迎回来" })
127
171
 
128
- // 6. 获取页面截图
172
+ // 6. 获取页面截图(需在服务启动参数中启用 --enable-categories=debug)
129
173
  screenshot({ path: "/tmp/login-success.png" })
130
174
  ```
131
175
 
132
176
  ## 🛠️ 功能概览
133
177
 
134
- 项目提供 **31个工具**,分为 8 大类别:
135
-
136
- | 类别 | 工具数 | 主要功能 |
137
- |------|--------|----------|
138
- | **连接管理** | 3个 | 智能连接、传统连接、获取当前页面 |
139
- | **页面查询** | 3个 | CSS选择器查找、条件等待、页面快照 |
140
- | **交互操作** | 7个 | 点击、输入、获取值、表单控件、选择器、开关、滑块 |
141
- | **断言验证** | 5个 | 存在性、可见性、文本、属性、状态断言 |
142
- | **页面导航** | 6个 | 跳转、返回、Tab切换、重启、重定向、页面信息 |
143
- | **调试工具** | 5个 | 截图、Console监听、日志获取、日志清空 |
144
- | **网络监控** | 5个 | 请求拦截、监听控制、请求获取、清空记录、拦截器诊断 |
145
- | **诊断工具** | 3个 | 连接诊断、环境检查、元素调试 |
146
-
147
- ### 工具详细列表
148
-
149
- <details>
150
- <summary><b>连接管理(3个工具)</b></summary>
151
-
152
- - `connect_devtools` - 传统连接方式(兼容性)
153
- - `connect_devtools_enhanced` - 智能连接,支持三种模式,自动端口检测(推荐)
154
- - `get_current_page` - 获取当前活动页面信息
155
-
156
- </details>
157
-
158
- <details>
159
- <summary><b>页面查询和快照(3个工具)</b></summary>
178
+ 当前工具暴露采用 profile 机制:
160
179
 
161
- - `$` - 通过CSS选择器查找元素,返回详细信息
162
- - `waitFor` - 等待条件满足(时间/元素出现/消失/文本匹配)
163
- - `get_page_snapshot` - 获取完整页面快照和所有元素UID
164
-
165
- </details>
166
-
167
- <details>
168
- <summary><b>交互操作(7个工具)</b></summary>
169
-
170
- - `click` - 点击元素(支持单击/双击)
171
- - `input_text` - 向input/textarea输入文本
172
- - `get_value` - 获取元素的值或文本内容
173
- - `set_form_control` - 设置表单控件的值
174
- - `select_picker` - 选择picker控件选项
175
- - `toggle_switch` - 切换switch开关状态
176
- - `set_slider` - 设置slider滑块值
177
-
178
- </details>
179
-
180
- <details>
181
- <summary><b>断言验证(5个工具)</b></summary>
182
-
183
- - `assert_exists` - 断言元素存在或不存在
184
- - `assert_visible` - 断言元素可见或不可见
185
- - `assert_text` - 断言元素文本内容(精确/包含/正则)
186
- - `assert_attribute` - 断言元素属性值
187
- - `assert_state` - 断言元素状态(选中/启用/聚焦/可见)
188
-
189
- </details>
190
-
191
- <details>
192
- <summary><b>页面导航(6个工具)</b></summary>
193
-
194
- - `navigate_to` - 跳转到指定页面
195
- - `navigate_back` - 返回上一页
196
- - `switch_tab` - 切换到指定Tab页
197
- - `relaunch` - 重启小程序并跳转到指定页面
198
- - `redirect_to` - 关闭当前页并跳转
199
- - `get_page_info` - 获取当前页面详细信息
200
-
201
- </details>
202
-
203
- <details>
204
- <summary><b>调试工具(5个工具)</b></summary>
205
-
206
- - `screenshot` - 页面截图(返回base64或保存文件)
207
- - `start_console_monitoring` - 开始监听console和exception
208
- - `stop_console_monitoring` - 停止console监听
209
- - `get_console` - 获取收集的console消息
210
- - `clear_console` - 清空console缓存
211
-
212
- </details>
213
-
214
- <details>
215
- <summary><b>网络监控(5个工具)</b></summary>
216
-
217
- - `start_network_monitoring` - 开始监听网络请求
218
- - `stop_network_monitoring` - 停止网络监听
219
- - `get_network_requests` - 获取拦截的网络请求(支持过滤)
220
- - `clear_network_requests` - 清空网络请求记录
221
- - `diagnose_interceptor` - 诊断网络拦截器状态
222
-
223
- </details>
224
-
225
- <details>
226
- <summary><b>诊断工具(3个工具)</b></summary>
227
-
228
- - `diagnose_connection` - 诊断连接问题,检查配置和环境
229
- - `check_environment` - 检查自动化环境配置
230
- - `debug_page_elements` - 调试页面元素获取问题
231
-
232
- </details>
180
+ - `core`(默认,20个):
181
+ - 连接/页面:`connect_devtools`、`reconnect_devtools`、`disconnect_devtools`、`get_connection_status`、`get_current_page`、`get_page_snapshot`、`query_selector`、`wait_for`
182
+ - 交互:`click`、`input_text`、`get_value`、`set_form_control`
183
+ - 断言:`assert_text`、`assert_attribute`、`assert_state`
184
+ - 导航:`navigate_to`、`navigate_back`、`switch_tab`、`relaunch`
185
+ - 脚本:`evaluate_script`
186
+ - 可选类别(默认关闭):
187
+ - `console`:`list_console_messages`、`get_console_message`
188
+ - `network`:`list_network_requests`、`get_network_request`、`stop_network_monitoring`、`clear_network_requests`
189
+ - `debug`:`screenshot`、`diagnose_connection`、`check_environment`、`debug_page_elements`、`debug_connection_flow`
190
+ - `full` profile:暴露全部 31 个工具。
233
191
 
234
192
  ## 💡 使用示例
235
193
 
@@ -237,31 +195,32 @@ screenshot({ path: "/tmp/login-success.png" })
237
195
 
238
196
  ```typescript
239
197
  // 连接到开发者工具
240
- connect_devtools_enhanced({
198
+ connect_devtools({
241
199
  projectPath: "/path/to/miniprogram",
242
- mode: "auto"
200
+ strategy: "auto"
243
201
  })
244
202
 
245
203
  // 输入用户名
246
- $({ selector: "input#username" })
204
+ query_selector({ selector: "input#username" })
247
205
  input_text({ uid: "input#username", text: "testuser" })
248
206
 
249
207
  // 输入密码
250
- $({ selector: "input#password" })
208
+ query_selector({ selector: "input#password" })
251
209
  input_text({ uid: "input#password", text: "password123" })
252
210
 
253
211
  // 点击登录按钮
254
- $({ selector: "button.login" })
212
+ query_selector({ selector: "button.login" })
255
213
  click({ uid: "button.login" })
256
214
 
257
215
  // 等待登录成功
258
- waitFor({ selector: ".welcome", timeout: 5000 })
216
+ wait_for({ selector: ".welcome", timeout: 5000 })
259
217
 
260
218
  // 验证欢迎消息
261
219
  assert_text({ uid: ".welcome", textContains: "欢迎" })
262
220
 
263
- // 检查网络请求
264
- get_network_requests({ urlPattern: "/api/login", successOnly: true })
221
+ // 检查网络请求(两阶段查询,需在服务启动参数中启用 --enable-categories=network)
222
+ const requests = list_network_requests({ urlPattern: "/api/login", successOnly: true })
223
+ get_network_request({ reqid: requests[0].reqid })
265
224
  ```
266
225
 
267
226
  ### 示例 2:表单填写和提交
@@ -272,22 +231,22 @@ input_text({ uid: "input#name", text: "张三" })
272
231
  input_text({ uid: "input#email", text: "zhangsan@example.com" })
273
232
 
274
233
  // 选择下拉框
275
- select_picker({ uid: "picker#city", value: "北京" })
234
+ set_form_control({ uid: "picker#city", value: "北京" })
276
235
 
277
236
  // 切换开关
278
- toggle_switch({ uid: "switch#agree", checked: true })
237
+ set_form_control({ uid: "switch#agree", value: true })
279
238
 
280
239
  // 设置滑块
281
- set_slider({ uid: "slider#age", value: 25 })
240
+ set_form_control({ uid: "slider#age", value: 25 })
282
241
 
283
242
  // 提交表单
284
243
  click({ uid: "button.submit" })
285
244
 
286
245
  // 等待提交成功
287
- waitFor({ selector: ".success-toast", timeout: 3000 })
246
+ wait_for({ selector: ".success-toast", timeout: 3000 })
288
247
 
289
248
  // 验证提交结果
290
- assert_visible({ uid: ".success-toast", visible: true })
249
+ assert_state({ uid: ".success-toast", visible: true })
291
250
  assert_text({ uid: ".success-toast", text: "提交成功" })
292
251
 
293
252
  // 截图保存结果
@@ -307,17 +266,35 @@ screenshot({ path: "/tmp/form-submit-success.png" })
307
266
 
308
267
  ### 构建和测试
309
268
 
269
+ 项目采用分层测试架构,分为协议测试、工具测试和集成测试:
270
+
310
271
  ```bash
311
272
  # 开发模式(监听文件变化)
312
273
  npm run watch
313
274
 
314
- # 运行单元测试
275
+ # 运行单元测试(协议 + 工具 + 工具类)
315
276
  npm test
316
277
 
278
+ # 分类运行单元测试
279
+ npm run test:protocol # 协议层测试
280
+ npm run test:tools # 工具逻辑测试
281
+
317
282
  # 运行集成测试(需要微信开发者工具)
318
283
  npm run test:integration
319
284
 
320
- # 运行所有测试
285
+ # 推荐:复用现有 DevTools 会话,避免反复重启项目(默认)
286
+ INTEGRATION_CLEANUP_MODE=reuse npm run test:integration
287
+
288
+ # 如需强制隔离环境(CI 或排查端口脏状态)
289
+ INTEGRATION_CLEANUP_MODE=force npm run test:integration
290
+
291
+ # 禁用跨 suite 会话复用(仅调试时建议)
292
+ INTEGRATION_REUSE_SESSION=false npm run test:integration
293
+
294
+ # 如需每个 suite 结束后强制断开(默认不强制)
295
+ INTEGRATION_FORCE_DISCONNECT_AFTER_EACH_SUITE=true npm run test:integration
296
+
297
+ # 运行所有测试(单元 + 集成)
321
298
  npm run test:all
322
299
 
323
300
  # 生成测试覆盖率报告
@@ -327,17 +304,39 @@ npm run test:coverage
327
304
  npm run inspector
328
305
  ```
329
306
 
307
+ ### 手工验证与诊断
308
+
309
+ - 连接诊断能力通过 MCP 工具提供:启用 `debug` 类别后调用 `diagnose_connection`、`check_environment`、`debug_connection_flow`
310
+ - 截图调试通过 MCP 工具提供:启用 `debug` 类别后调用 `screenshot`
311
+ - 集成测试夹具项目固定为 `playground/wx/`,请勿移动或删除目录
312
+ - 夹具关键文件白名单:`playground/wx/app.json`、`playground/wx/project.config.json`
313
+
330
314
  ### 添加新工具
331
315
 
332
316
  1. 在 `src/tools/` 下创建或修改工具模块
333
317
  2. 使用 `ToolDefinition` 框架定义工具
334
318
  3. 在 `src/tools/index.ts` 中导出工具
335
- 4. 编写单元测试(`tests/*.test.ts`)
336
- 5. 编写集成测试(`tests/*.integration.test.ts`)
319
+ 4. 编写单元测试(`tests/tools/*.test.ts` 或 `tests/protocol/*.test.ts`)
320
+ 5. 编写集成测试(`tests/integration/*.integration.test.ts`)
337
321
  6. 更新文档
338
322
 
339
323
  详细开发指南请参考 [CLAUDE.md](CLAUDE.md)
340
324
 
325
+ ### 测试架构
326
+
327
+ 项目采用三层测试架构(参考 chrome-devtools-mcp):
328
+
329
+ - **协议层测试** (`tests/protocol/`) - 测试 MCP 服务器协议实现
330
+ - **工具逻辑测试** (`tests/tools/`) - 直接测试工具 handler,无需服务器
331
+ - **集成测试** (`tests/integration/`) - 端到端测试,需要真实环境
332
+
333
+ 集成测试支持以下运行模式:
334
+ - `INTEGRATION_CLEANUP_MODE=reuse`:复用已有 DevTools 实例(默认)
335
+ - `INTEGRATION_CLEANUP_MODE=smart`:优雅关闭后重连
336
+ - `INTEGRATION_CLEANUP_MODE=force`:强制清理全部实例
337
+ - `INTEGRATION_REUSE_SESSION=true/false`:控制跨 suite 连接复用
338
+ - `INTEGRATION_FORCE_DISCONNECT_AFTER_EACH_SUITE=true/false`:控制每个 suite 结束后是否强制断连(默认 `false`)
339
+
341
340
  ## 📋 系统要求
342
341
 
343
342
  - **Node.js** >= 16.0.0
@@ -367,7 +366,7 @@ npm run inspector
367
366
 
368
367
  ## 📞 联系方式
369
368
 
370
- - 问题反馈:[GitHub Issues](https://github.com/yourusername/weixin-devtools-mcp/issues)
369
+ - 问题反馈:[GitHub Issues](https://github.com/wooter-s/weixin-devtools-mcp/issues)
371
370
  - 文档网站:[项目文档](docs/)
372
371
 
373
372
  ---