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.
- package/LICENSE +21 -0
- package/README.md +127 -128
- package/build/MiniProgramContext.d.ts +317 -0
- package/build/MiniProgramContext.d.ts.map +1 -0
- package/build/MiniProgramContext.js +696 -0
- package/build/MiniProgramContext.js.map +1 -0
- package/build/collectors/Collector.d.ts +127 -0
- package/build/collectors/Collector.d.ts.map +1 -0
- package/build/collectors/Collector.js +252 -0
- package/build/collectors/Collector.js.map +1 -0
- package/build/collectors/ConsoleCollector.d.ts +104 -0
- package/build/collectors/ConsoleCollector.d.ts.map +1 -0
- package/build/collectors/ConsoleCollector.js +157 -0
- package/build/collectors/ConsoleCollector.js.map +1 -0
- package/build/collectors/NetworkCollector.d.ts +167 -0
- package/build/collectors/NetworkCollector.d.ts.map +1 -0
- package/build/collectors/NetworkCollector.js +265 -0
- package/build/collectors/NetworkCollector.js.map +1 -0
- package/build/collectors/index.d.ts +13 -0
- package/build/collectors/index.d.ts.map +1 -0
- package/build/collectors/index.js +17 -0
- package/build/collectors/index.js.map +1 -0
- package/build/config/tool-profile.d.ts +30 -0
- package/build/config/tool-profile.d.ts.map +1 -0
- package/build/config/tool-profile.js +138 -0
- package/build/config/tool-profile.js.map +1 -0
- package/build/connection/adapters.d.ts +3 -0
- package/build/connection/adapters.d.ts.map +1 -0
- package/build/connection/adapters.js +134 -0
- package/build/connection/adapters.js.map +1 -0
- package/build/connection/errors.d.ts +34 -0
- package/build/connection/errors.d.ts.map +1 -0
- package/build/connection/errors.js +101 -0
- package/build/connection/errors.js.map +1 -0
- package/build/connection/health-probe.d.ts +4 -0
- package/build/connection/health-probe.d.ts.map +1 -0
- package/build/connection/health-probe.js +60 -0
- package/build/connection/health-probe.js.map +1 -0
- package/build/connection/index.d.ts +6 -0
- package/build/connection/index.d.ts.map +1 -0
- package/build/connection/index.js +6 -0
- package/build/connection/index.js.map +1 -0
- package/build/connection/manager.d.ts +19 -0
- package/build/connection/manager.d.ts.map +1 -0
- package/build/connection/manager.js +227 -0
- package/build/connection/manager.js.map +1 -0
- package/build/connection/resolver.d.ts +3 -0
- package/build/connection/resolver.d.ts.map +1 -0
- package/build/connection/resolver.js +99 -0
- package/build/connection/resolver.js.map +1 -0
- package/build/connection/types.d.ts +95 -0
- package/build/connection/types.d.ts.map +1 -0
- package/build/connection/types.js +16 -0
- package/build/connection/types.js.map +1 -0
- package/build/core/assertion.d.ts +22 -0
- package/build/core/assertion.d.ts.map +1 -0
- package/build/core/assertion.js +318 -0
- package/build/core/assertion.js.map +1 -0
- package/build/core/connection.d.ts +37 -0
- package/build/core/connection.d.ts.map +1 -0
- package/build/core/connection.js +745 -0
- package/build/core/connection.js.map +1 -0
- package/build/core/index.d.ts +13 -0
- package/build/core/index.d.ts.map +1 -0
- package/build/core/index.js +19 -0
- package/build/core/index.js.map +1 -0
- package/build/core/interaction.d.ts +22 -0
- package/build/core/interaction.d.ts.map +1 -0
- package/build/core/interaction.js +185 -0
- package/build/core/interaction.js.map +1 -0
- package/build/core/navigation.d.ts +26 -0
- package/build/core/navigation.d.ts.map +1 -0
- package/build/core/navigation.js +210 -0
- package/build/core/navigation.js.map +1 -0
- package/build/core/query.d.ts +14 -0
- package/build/core/query.d.ts.map +1 -0
- package/build/core/query.js +191 -0
- package/build/core/query.js.map +1 -0
- package/build/core/screenshot.d.ts +10 -0
- package/build/core/screenshot.d.ts.map +1 -0
- package/build/core/screenshot.js +93 -0
- package/build/core/screenshot.js.map +1 -0
- package/build/core/snapshot.d.ts +17 -0
- package/build/core/snapshot.d.ts.map +1 -0
- package/build/core/snapshot.js +225 -0
- package/build/core/snapshot.js.map +1 -0
- package/build/core/types.d.ts +250 -0
- package/build/core/types.d.ts.map +1 -0
- package/build/core/types.js +6 -0
- package/build/core/types.js.map +1 -0
- package/build/formatters/consoleFormatter.d.ts +50 -0
- package/build/formatters/consoleFormatter.d.ts.map +1 -0
- package/build/formatters/consoleFormatter.js +116 -0
- package/build/formatters/consoleFormatter.js.map +1 -0
- package/build/formatters/snapshotFormatter.d.ts +41 -0
- package/build/formatters/snapshotFormatter.d.ts.map +1 -0
- package/build/formatters/snapshotFormatter.js +156 -0
- package/build/formatters/snapshotFormatter.js.map +1 -0
- package/build/index.d.ts +11 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +45 -9
- package/build/index.js.map +1 -0
- package/build/server.d.ts +7 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +88 -32
- package/build/server.js.map +1 -0
- package/build/tools/ToolDefinition.d.ts +265 -0
- package/build/tools/ToolDefinition.d.ts.map +1 -0
- package/build/tools/ToolDefinition.js +16 -7
- package/build/tools/ToolDefinition.js.map +1 -0
- package/build/tools/assert.d.ts +17 -0
- package/build/tools/assert.d.ts.map +1 -0
- package/build/tools/assert.js +63 -103
- package/build/tools/assert.js.map +1 -0
- package/build/tools/connection.d.ts +13 -0
- package/build/tools/connection.d.ts.map +1 -0
- package/build/tools/connection.js +338 -611
- package/build/tools/connection.js.map +1 -0
- package/build/tools/console.d.ts +20 -0
- package/build/tools/console.d.ts.map +1 -0
- package/build/tools/console.js +162 -152
- package/build/tools/console.js.map +1 -0
- package/build/tools/diagnose.d.ts +22 -0
- package/build/tools/diagnose.d.ts.map +1 -0
- package/build/tools/diagnose.js +406 -13
- package/build/tools/diagnose.js.map +1 -0
- package/build/tools/index.d.ts +6 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +3 -77
- package/build/tools/index.js.map +1 -0
- package/build/tools/input.d.ts +21 -0
- package/build/tools/input.d.ts.map +1 -0
- package/build/tools/input.js +73 -139
- package/build/tools/input.js.map +1 -0
- package/build/tools/navigate.d.ts +21 -0
- package/build/tools/navigate.d.ts.map +1 -0
- package/build/tools/navigate.js +63 -126
- package/build/tools/navigate.js.map +1 -0
- package/build/tools/network.d.ts +21 -0
- package/build/tools/network.d.ts.map +1 -0
- package/build/tools/network.js +214 -1044
- package/build/tools/network.js.map +1 -0
- package/build/tools/page.d.ts +13 -0
- package/build/tools/page.d.ts.map +1 -0
- package/build/tools/page.js +6 -3
- package/build/tools/page.js.map +1 -0
- package/build/tools/screenshot.d.ts +9 -0
- package/build/tools/screenshot.d.ts.map +1 -0
- package/build/tools/screenshot.js +3 -1
- package/build/tools/screenshot.js.map +1 -0
- package/build/tools/script.d.ts +6 -0
- package/build/tools/script.d.ts.map +1 -0
- package/build/tools/script.js +92 -0
- package/build/tools/script.js.map +1 -0
- package/build/tools/snapshot.d.ts +9 -0
- package/build/tools/snapshot.d.ts.map +1 -0
- package/build/tools/snapshot.js +78 -12
- package/build/tools/snapshot.js.map +1 -0
- package/build/tools/tools.d.ts +15 -0
- package/build/tools/tools.d.ts.map +1 -0
- package/build/tools/tools.js +63 -0
- package/build/tools/tools.js.map +1 -0
- package/build/tools.d.ts +431 -0
- package/build/tools.d.ts.map +1 -0
- package/build/tools.js +258 -118
- package/build/tools.js.map +1 -0
- package/build/types/errors.d.ts +189 -0
- package/build/types/errors.d.ts.map +1 -0
- package/build/types/errors.js +257 -0
- package/build/types/errors.js.map +1 -0
- package/build/utils/error.d.ts +6 -0
- package/build/utils/error.d.ts.map +1 -0
- package/build/utils/error.js +11 -0
- package/build/utils/error.js.map +1 -0
- package/build/utils/idGenerator.d.ts +21 -0
- package/build/utils/idGenerator.d.ts.map +1 -0
- package/build/utils/idGenerator.js +23 -0
- package/build/utils/idGenerator.js.map +1 -0
- package/build/version.d.ts +7 -0
- package/build/version.d.ts.map +1 -0
- package/build/version.js +10 -0
- package/build/version.js.map +1 -0
- 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
|
-
[](https://github.com/
|
|
5
|
+
[](https://github.com/wooter-s/weixin-devtools-mcp)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](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
|
-
- ✅ **完整断言体系** -
|
|
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/
|
|
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": "
|
|
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
|
-
|
|
153
|
+
// 1. 连接微信开发者工具(auto 策略)
|
|
154
|
+
connect_devtools({
|
|
111
155
|
projectPath: "/path/to/your/miniprogram",
|
|
112
|
-
|
|
156
|
+
strategy: "auto",
|
|
113
157
|
verbose: true
|
|
114
158
|
})
|
|
115
159
|
|
|
116
160
|
// 2. 查找登录按钮
|
|
117
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
162
|
-
- `
|
|
163
|
-
- `
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- `
|
|
171
|
-
- `
|
|
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
|
-
|
|
198
|
+
connect_devtools({
|
|
241
199
|
projectPath: "/path/to/miniprogram",
|
|
242
|
-
|
|
200
|
+
strategy: "auto"
|
|
243
201
|
})
|
|
244
202
|
|
|
245
203
|
// 输入用户名
|
|
246
|
-
|
|
204
|
+
query_selector({ selector: "input#username" })
|
|
247
205
|
input_text({ uid: "input#username", text: "testuser" })
|
|
248
206
|
|
|
249
207
|
// 输入密码
|
|
250
|
-
|
|
208
|
+
query_selector({ selector: "input#password" })
|
|
251
209
|
input_text({ uid: "input#password", text: "password123" })
|
|
252
210
|
|
|
253
211
|
// 点击登录按钮
|
|
254
|
-
|
|
212
|
+
query_selector({ selector: "button.login" })
|
|
255
213
|
click({ uid: "button.login" })
|
|
256
214
|
|
|
257
215
|
// 等待登录成功
|
|
258
|
-
|
|
216
|
+
wait_for({ selector: ".welcome", timeout: 5000 })
|
|
259
217
|
|
|
260
218
|
// 验证欢迎消息
|
|
261
219
|
assert_text({ uid: ".welcome", textContains: "欢迎" })
|
|
262
220
|
|
|
263
|
-
//
|
|
264
|
-
|
|
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
|
-
|
|
234
|
+
set_form_control({ uid: "picker#city", value: "北京" })
|
|
276
235
|
|
|
277
236
|
// 切换开关
|
|
278
|
-
|
|
237
|
+
set_form_control({ uid: "switch#agree", value: true })
|
|
279
238
|
|
|
280
239
|
// 设置滑块
|
|
281
|
-
|
|
240
|
+
set_form_control({ uid: "slider#age", value: 25 })
|
|
282
241
|
|
|
283
242
|
// 提交表单
|
|
284
243
|
click({ uid: "button.submit" })
|
|
285
244
|
|
|
286
245
|
// 等待提交成功
|
|
287
|
-
|
|
246
|
+
wait_for({ selector: ".success-toast", timeout: 3000 })
|
|
288
247
|
|
|
289
248
|
// 验证提交结果
|
|
290
|
-
|
|
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/
|
|
369
|
+
- 问题反馈:[GitHub Issues](https://github.com/wooter-s/weixin-devtools-mcp/issues)
|
|
371
370
|
- 文档网站:[项目文档](docs/)
|
|
372
371
|
|
|
373
372
|
---
|