mobile-mcp-ai 2.1.2__py3-none-any.whl → 2.5.8__py3-none-any.whl
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.
- mobile_mcp/__init__.py +34 -0
- mobile_mcp/config.py +142 -0
- mobile_mcp/core/basic_tools_lite.py +3266 -0
- {core → mobile_mcp/core}/device_manager.py +2 -2
- mobile_mcp/core/dynamic_config.py +272 -0
- mobile_mcp/core/ios_client_wda.py +569 -0
- mobile_mcp/core/ios_device_manager_wda.py +306 -0
- {core → mobile_mcp/core}/mobile_client.py +279 -39
- mobile_mcp/core/template_matcher.py +429 -0
- mobile_mcp/core/templates/close_buttons/auto_x_0112_151217.png +0 -0
- mobile_mcp/core/templates/close_buttons/auto_x_0112_152037.png +0 -0
- mobile_mcp/core/templates/close_buttons/auto_x_0112_152840.png +0 -0
- mobile_mcp/core/templates/close_buttons/auto_x_0112_153256.png +0 -0
- mobile_mcp/core/templates/close_buttons/auto_x_0112_154847.png +0 -0
- mobile_mcp/core/templates/close_buttons/gray_x_stock_ad.png +0 -0
- {core → mobile_mcp/core}/utils/smart_wait.py +3 -3
- mobile_mcp/mcp_tools/__init__.py +10 -0
- mobile_mcp/mcp_tools/mcp_server.py +1071 -0
- mobile_mcp_ai-2.5.8.dist-info/METADATA +469 -0
- mobile_mcp_ai-2.5.8.dist-info/RECORD +32 -0
- mobile_mcp_ai-2.5.8.dist-info/entry_points.txt +2 -0
- mobile_mcp_ai-2.5.8.dist-info/licenses/LICENSE +201 -0
- mobile_mcp_ai-2.5.8.dist-info/top_level.txt +1 -0
- core/ai/__init__.py +0 -11
- core/ai/ai_analyzer.py +0 -197
- core/ai/ai_config.py +0 -116
- core/ai/ai_platform_adapter.py +0 -399
- core/ai/smart_test_executor.py +0 -520
- core/ai/test_generator.py +0 -365
- core/ai/test_generator_from_history.py +0 -391
- core/ai/test_generator_standalone.py +0 -293
- core/assertion/__init__.py +0 -9
- core/assertion/smart_assertion.py +0 -341
- core/basic_tools.py +0 -377
- core/h5/__init__.py +0 -10
- core/h5/h5_handler.py +0 -548
- core/ios_client.py +0 -219
- core/ios_device_manager.py +0 -252
- core/locator/__init__.py +0 -10
- core/locator/cursor_ai_auto_analyzer.py +0 -119
- core/locator/cursor_vision_helper.py +0 -414
- core/locator/mobile_smart_locator.py +0 -1640
- core/locator/position_analyzer.py +0 -813
- core/locator/script_updater.py +0 -157
- core/nl_test_runner.py +0 -585
- core/smart_app_launcher.py +0 -334
- core/smart_tools.py +0 -311
- mcp/__init__.py +0 -8
- mcp/mcp_server.py +0 -1919
- mcp/mcp_server_simple.py +0 -476
- mobile_mcp_ai-2.1.2.dist-info/METADATA +0 -567
- mobile_mcp_ai-2.1.2.dist-info/RECORD +0 -45
- mobile_mcp_ai-2.1.2.dist-info/entry_points.txt +0 -2
- mobile_mcp_ai-2.1.2.dist-info/top_level.txt +0 -4
- vision/__init__.py +0 -10
- vision/vision_locator.py +0 -404
- {core → mobile_mcp/core}/__init__.py +0 -0
- {core → mobile_mcp/core}/utils/__init__.py +0 -0
- {core → mobile_mcp/core}/utils/logger.py +0 -0
- {core → mobile_mcp/core}/utils/operation_history_manager.py +0 -0
- {utils → mobile_mcp/utils}/__init__.py +0 -0
- {utils → mobile_mcp/utils}/logger.py +0 -0
- {utils → mobile_mcp/utils}/xml_formatter.py +0 -0
- {utils → mobile_mcp/utils}/xml_parser.py +0 -0
- {mobile_mcp_ai-2.1.2.dist-info → mobile_mcp_ai-2.5.8.dist-info}/WHEEL +0 -0
|
@@ -1,567 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: mobile-mcp-ai
|
|
3
|
-
Version: 2.1.2
|
|
4
|
-
Summary: 移动端自动化 MCP Server - 支持 Android/iOS,AI 功能可选(基础工具不需要 AI)
|
|
5
|
-
Home-page: https://github.com/test111ddff-hash/mobile-mcp-ai
|
|
6
|
-
Author: douzi
|
|
7
|
-
Author-email: 1492994674@qq.com
|
|
8
|
-
Project-URL: Documentation, https://github.com/test111ddff-hash/mobile-mcp-ai
|
|
9
|
-
Project-URL: Source, https://github.com/test111ddff-hash/mobile-mcp-ai
|
|
10
|
-
Project-URL: Tracker, https://github.com/test111ddff-hash/mobile-mcp-ai/issues
|
|
11
|
-
Keywords: mobile,automation,testing,android,ios,mcp,ai,pytest,cursor
|
|
12
|
-
Classifier: Development Status :: 4 - Beta
|
|
13
|
-
Classifier: Intended Audience :: Developers
|
|
14
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
-
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
-
Classifier: Topic :: Software Development :: Testing
|
|
21
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
22
|
-
Requires-Python: >=3.8
|
|
23
|
-
Description-Content-Type: text/markdown
|
|
24
|
-
Requires-Dist: uiautomator2>=2.16.0
|
|
25
|
-
Requires-Dist: adbutils>=1.2.0
|
|
26
|
-
Requires-Dist: Pillow>=10.0.0
|
|
27
|
-
Requires-Dist: mcp>=0.9.0
|
|
28
|
-
Requires-Dist: python-dotenv>=1.0.0
|
|
29
|
-
Provides-Extra: ai
|
|
30
|
-
Requires-Dist: dashscope>=1.10.0; extra == "ai"
|
|
31
|
-
Requires-Dist: openai>=1.0.0; extra == "ai"
|
|
32
|
-
Requires-Dist: anthropic>=0.3.0; extra == "ai"
|
|
33
|
-
Provides-Extra: test
|
|
34
|
-
Requires-Dist: pytest>=8.0.0; extra == "test"
|
|
35
|
-
Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
|
|
36
|
-
Requires-Dist: allure-pytest>=2.13.0; extra == "test"
|
|
37
|
-
Provides-Extra: dev
|
|
38
|
-
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
39
|
-
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
40
|
-
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
41
|
-
Requires-Dist: build>=0.10.0; extra == "dev"
|
|
42
|
-
Provides-Extra: ios
|
|
43
|
-
Requires-Dist: Appium-Python-Client>=3.0.0; extra == "ios"
|
|
44
|
-
Provides-Extra: h5
|
|
45
|
-
Requires-Dist: Appium-Python-Client>=3.0.0; extra == "h5"
|
|
46
|
-
Requires-Dist: selenium>=4.0.0; extra == "h5"
|
|
47
|
-
Provides-Extra: all
|
|
48
|
-
Requires-Dist: dashscope>=1.10.0; extra == "all"
|
|
49
|
-
Requires-Dist: openai>=1.0.0; extra == "all"
|
|
50
|
-
Requires-Dist: anthropic>=0.3.0; extra == "all"
|
|
51
|
-
Requires-Dist: Appium-Python-Client>=3.0.0; extra == "all"
|
|
52
|
-
Requires-Dist: selenium>=4.0.0; extra == "all"
|
|
53
|
-
Requires-Dist: pytest>=8.0.0; extra == "all"
|
|
54
|
-
Requires-Dist: pytest-asyncio>=0.21.0; extra == "all"
|
|
55
|
-
Requires-Dist: allure-pytest>=2.13.0; extra == "all"
|
|
56
|
-
Dynamic: author
|
|
57
|
-
Dynamic: author-email
|
|
58
|
-
Dynamic: classifier
|
|
59
|
-
Dynamic: description
|
|
60
|
-
Dynamic: description-content-type
|
|
61
|
-
Dynamic: home-page
|
|
62
|
-
Dynamic: keywords
|
|
63
|
-
Dynamic: project-url
|
|
64
|
-
Dynamic: provides-extra
|
|
65
|
-
Dynamic: requires-dist
|
|
66
|
-
Dynamic: requires-python
|
|
67
|
-
Dynamic: summary
|
|
68
|
-
|
|
69
|
-
# Mobile MCP AI
|
|
70
|
-
|
|
71
|
-
移动端自动化 MCP Server - 为 Cursor AI 提供移动设备控制能力,支持 Android/iOS
|
|
72
|
-
|
|
73
|
-
<div align="center">
|
|
74
|
-
|
|
75
|
-
[](https://pypi.org/project/mobile-mcp-ai/)
|
|
76
|
-
[](https://www.python.org/downloads/)
|
|
77
|
-
[](LICENSE)
|
|
78
|
-
[](https://gitee.com/chang-xinping/mobile-automation-mcp-service)
|
|
79
|
-
|
|
80
|
-
**⭐ 如果这个项目对你有帮助,请给个 Star 支持一下!⭐**
|
|
81
|
-
|
|
82
|
-
**🆕 v2.1.0 重大更新:智能验证系统 - 彻底解决"假成功"问题**
|
|
83
|
-
|
|
84
|
-
**✨ 核心改进:**
|
|
85
|
-
- ✅ **所有操作支持智能验证**:click、input、swipe、press_key 全部验证
|
|
86
|
-
- ✅ **实时检测操作结果**:页面变化、文本验证、内容变化检测
|
|
87
|
-
- ✅ **搜索键智能回退**:SEARCH 无效时自动尝试 ENTER
|
|
88
|
-
- ✅ **详细验证反馈**:返回验证状态、实际结果、警告信息
|
|
89
|
-
- ✅ **向后兼容**:默认启用验证,可选 `verify=False` 快速模式
|
|
90
|
-
|
|
91
|
-
</div>
|
|
92
|
-
|
|
93
|
-
## ✨ 核心特性
|
|
94
|
-
|
|
95
|
-
### 🎯 AI 功能可选化
|
|
96
|
-
- **基础模式**:不需要配置 AI 密钥,Cursor AI 提供所有智能能力
|
|
97
|
-
- **智能模式**:可选配置 AI 密钥,适合构建自动化测试平台
|
|
98
|
-
- **零成本起步**:基础工具完全免费,无需额外 AI API 费用
|
|
99
|
-
- **灵活选择**:根据使用场景自由选择是否启用 AI 功能
|
|
100
|
-
|
|
101
|
-
### 🧪 智能测试脚本生成(v2.0.3 新增)
|
|
102
|
-
- **操作录制**:AI 操作手机时自动记录所有步骤
|
|
103
|
-
- **一键生成**:生成独立的 pytest 测试脚本
|
|
104
|
-
- **智能等待**:自动添加页面加载、跳转等待逻辑
|
|
105
|
-
- **弹窗处理**:智能检测和跳过可选弹窗
|
|
106
|
-
- **开箱即用**:生成的脚本只依赖 uiautomator2,无需 mobile-mcp-ai
|
|
107
|
-
|
|
108
|
-
### 📦 工具架构
|
|
109
|
-
|
|
110
|
-
#### 基础工具(9个,不需要 AI)
|
|
111
|
-
- `mobile_list_elements` - 列出所有可交互元素
|
|
112
|
-
- `mobile_click_by_id` - 通过 resource-id 精确点击
|
|
113
|
-
- `mobile_click_by_text` - 通过文本内容点击
|
|
114
|
-
- `mobile_click_at_coords` - 点击指定坐标
|
|
115
|
-
- `mobile_input_text_by_id` - 在输入框输入文本
|
|
116
|
-
- `mobile_find_elements_by_class` - 按类名查找元素
|
|
117
|
-
- `mobile_wait_for_element` - 等待元素出现
|
|
118
|
-
- `mobile_take_screenshot` - 截取屏幕(支持 Cursor AI 视觉识别)
|
|
119
|
-
- `mobile_take_screenshot_region` - 区域截图
|
|
120
|
-
|
|
121
|
-
#### 智能工具(4个,需要 AI,可选)
|
|
122
|
-
- `mobile_smart_click` - 自然语言智能点击
|
|
123
|
-
- `mobile_smart_input` - 自然语言智能输入
|
|
124
|
-
- `mobile_analyze_screenshot` - AI 视觉识别定位
|
|
125
|
-
- `mobile_get_ai_status` - 检查 AI 功能状态
|
|
126
|
-
|
|
127
|
-
#### 测试工具(1个,不需要 AI)✨ 新增
|
|
128
|
-
- `mobile_generate_test_script` - 生成 pytest 测试脚本
|
|
129
|
-
|
|
130
|
-
#### 通用工具(4个)
|
|
131
|
-
- `mobile_snapshot` - 获取页面结构
|
|
132
|
-
- `mobile_launch_app` - 启动应用
|
|
133
|
-
- `mobile_swipe` - 滑动屏幕
|
|
134
|
-
- `mobile_press_key` - 按键操作(支持智能验证 ✨ 新增)
|
|
135
|
-
|
|
136
|
-
### 🌐 跨平台支持
|
|
137
|
-
- **双平台支持**:完美支持 Android 和 iOS
|
|
138
|
-
- **统一接口**:通过适配器模式实现代码复用
|
|
139
|
-
- **设备管理**:自动检测和管理连接的设备
|
|
140
|
-
|
|
141
|
-
### 🤖 与 Cursor AI 深度集成
|
|
142
|
-
- **MCP 协议**:基于 Model Context Protocol,无缝集成
|
|
143
|
-
- **18 个工具**:丰富的移动端操作工具
|
|
144
|
-
- **视觉识别**:Cursor AI 可以直接分析截图并操作
|
|
145
|
-
- **测试生成**:AI 操作后一键生成 pytest 脚本
|
|
146
|
-
|
|
147
|
-
## 📦 安装
|
|
148
|
-
|
|
149
|
-
### 基础安装(推荐)
|
|
150
|
-
```bash
|
|
151
|
-
# 不需要 AI 密钥,完全免费
|
|
152
|
-
pip install mobile-mcp-ai
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### 完整安装(可选)
|
|
156
|
-
```bash
|
|
157
|
-
# 如果需要智能工具或构建自动化平台
|
|
158
|
-
pip install mobile-mcp-ai[ai]
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### 升级到最新版本
|
|
162
|
-
|
|
163
|
-
**⚠️ 重要:如果你已经安装了旧版本,强烈建议升级到 v2.1.0!**
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
# 升级到最新版本
|
|
167
|
-
pip install --upgrade mobile-mcp-ai
|
|
168
|
-
|
|
169
|
-
# 验证版本
|
|
170
|
-
pip show mobile-mcp-ai
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
**v2.1.0 升级说明**:
|
|
174
|
-
- ✅ **向后兼容**:无需修改现有代码
|
|
175
|
-
- ✅ **默认启用验证**:所有操作自动验证,更可靠
|
|
176
|
-
- ✅ **可选快速模式**:如需要可设置 `verify=False`
|
|
177
|
-
- ✅ **无破坏性更改**:平滑升级,放心使用
|
|
178
|
-
|
|
179
|
-
**升级后重启 Cursor**:升级完成后需要完全退出并重新启动 Cursor 才能生效。
|
|
180
|
-
|
|
181
|
-
## 🚀 快速开始
|
|
182
|
-
|
|
183
|
-
### 1. 配置 Cursor MCP
|
|
184
|
-
|
|
185
|
-
编辑 `~/.cursor/mcp.json`(macOS/Linux)或 `%APPDATA%\Cursor\mcp.json`(Windows):
|
|
186
|
-
|
|
187
|
-
**基础模式(推荐,默认使用 Cursor AI,完全免费)**:
|
|
188
|
-
```json
|
|
189
|
-
{
|
|
190
|
-
"mcpServers": {
|
|
191
|
-
"mobile-automation": {
|
|
192
|
-
"command": "python",
|
|
193
|
-
"args": ["-m", "mobile_mcp.mcp.mcp_server_simple"],
|
|
194
|
-
"cwd": "/path/to/your/project",
|
|
195
|
-
"env": {}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
> 🎯 **默认行为**:
|
|
202
|
-
> - ✅ 在 Cursor 中运行时,**自动使用 Cursor AI**(免费,无需配置)
|
|
203
|
-
> - ✅ 智能定位、视觉识别等 AI 功能开箱即用
|
|
204
|
-
> - ✅ 不会消耗你的 API 额度,完全零成本
|
|
205
|
-
>
|
|
206
|
-
> ⚙️ **工作区配置**(重要):
|
|
207
|
-
> - `"cwd"`: 设置为你的项目根目录路径
|
|
208
|
-
> - 生成的测试脚本会保存到 `项目目录/tests/`
|
|
209
|
-
> - 如果不配置,脚本会生成到用户主目录(不推荐)
|
|
210
|
-
|
|
211
|
-
**智能模式(可选,使用其他 AI 平台)**:
|
|
212
|
-
```json
|
|
213
|
-
{
|
|
214
|
-
"mcpServers": {
|
|
215
|
-
"mobile-automation": {
|
|
216
|
-
"command": "python",
|
|
217
|
-
"args": ["-m", "mobile_mcp.mcp.mcp_server_simple"],
|
|
218
|
-
"cwd": "/path/to/your/project",
|
|
219
|
-
"env": {
|
|
220
|
-
"AI_PROVIDER": "qwen",
|
|
221
|
-
"QWEN_API_KEY": "sk-your-api-key"
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
> 💡 **提示**:只有在以下情况才需要配置 AI 密钥:
|
|
229
|
-
> - 想使用通义千问、Claude、OpenAI 等其他 AI 平台
|
|
230
|
-
> - 构建独立的自动化测试平台(非 Cursor 环境)
|
|
231
|
-
> - 需要离线运行或集成到 CI/CD
|
|
232
|
-
|
|
233
|
-
详细配置说明:[用户配置指南](docs/USER_CONFIGURATION_GUIDE.md)
|
|
234
|
-
|
|
235
|
-
### 2. 连接设备
|
|
236
|
-
|
|
237
|
-
```bash
|
|
238
|
-
# Android 设备
|
|
239
|
-
adb devices # 确认设备可见
|
|
240
|
-
|
|
241
|
-
# iOS 设备(可选)
|
|
242
|
-
pip install mobile-mcp-ai[ios]
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
### 3. 重启 Cursor
|
|
246
|
-
|
|
247
|
-
配置完成后,**完全退出**并重新启动 Cursor。
|
|
248
|
-
|
|
249
|
-
### 4. 开始使用
|
|
250
|
-
|
|
251
|
-
#### 方式1:基础工具(明确指定元素)
|
|
252
|
-
```
|
|
253
|
-
@MCP 帮我测试登录:
|
|
254
|
-
1. 列出所有元素
|
|
255
|
-
2. 点击 resource-id 为 "com.app:id/login_btn"
|
|
256
|
-
3. 在 resource-id "com.app:id/username" 输入 "admin"
|
|
257
|
-
4. 截图保存
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
#### 方式2:让 Cursor AI 分析截图(推荐)
|
|
261
|
-
```
|
|
262
|
-
@MCP 帮我测试登录:
|
|
263
|
-
1. 先截图看看当前页面
|
|
264
|
-
2. 分析后点击"登录"按钮
|
|
265
|
-
3. 在"用户名"输入框输入 "admin"
|
|
266
|
-
4. 截图确认
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
Cursor AI 会自动截图、分析图片、找到元素坐标并操作!
|
|
270
|
-
|
|
271
|
-
## 💡 使用示例
|
|
272
|
-
|
|
273
|
-
### 场景1:基础工具测试(明确元素)
|
|
274
|
-
```
|
|
275
|
-
@MCP 执行以下操作:
|
|
276
|
-
1. 启动应用 com.example.app
|
|
277
|
-
2. 列出所有可点击元素
|
|
278
|
-
3. 点击 resource-id "com.example:id/login_btn"
|
|
279
|
-
4. 等待元素 "com.example:id/home" 出现
|
|
280
|
-
5. 截图保存
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
### 场景2:Cursor AI 视觉分析(智能推荐)
|
|
284
|
-
```
|
|
285
|
-
@MCP 帮我测试登录功能:
|
|
286
|
-
1. 截图看看当前页面
|
|
287
|
-
2. 找到并点击"登录"按钮
|
|
288
|
-
3. 再截图,找到"用户名"输入框并输入 "test123"
|
|
289
|
-
4. 找到"密码"输入框并输入 "pass123"
|
|
290
|
-
5. 点击"确定"按钮
|
|
291
|
-
6. 截图确认结果
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### 场景3:智能工具(需要配置 AI)
|
|
295
|
-
```
|
|
296
|
-
@MCP 检查 AI 功能状态
|
|
297
|
-
@MCP 用智能方式点击"登录"按钮
|
|
298
|
-
@MCP 在"用户名"输入框输入 "test123"
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### 场景4:生成测试脚本(推荐)✨ 新增
|
|
302
|
-
```
|
|
303
|
-
@MCP 帮我测试登录功能:
|
|
304
|
-
1. 启动应用 com.example.app
|
|
305
|
-
2. 截图,找到"登录"按钮并点击
|
|
306
|
-
3. 在"用户名"输入 "test123"
|
|
307
|
-
4. 在"密码"输入 "pass123"
|
|
308
|
-
5. 点击"提交"按钮
|
|
309
|
-
|
|
310
|
-
@MCP 生成刚才操作的测试脚本
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
AI 会自动生成一个完整的 pytest 测试脚本:
|
|
314
|
-
- ✅ 保存到你的项目 `tests/` 目录
|
|
315
|
-
- ✅ 包含智能等待逻辑(页面加载、跳转、输入)
|
|
316
|
-
- ✅ 自动处理弹窗(存在则点击,不存在跳过)
|
|
317
|
-
- ✅ 支持多设备(自动检测设备ID)
|
|
318
|
-
- ✅ 独立运行(只需要 `pip install uiautomator2 pytest`)
|
|
319
|
-
|
|
320
|
-
生成的脚本示例:
|
|
321
|
-
```python
|
|
322
|
-
def test_登录(device):
|
|
323
|
-
d = device
|
|
324
|
-
|
|
325
|
-
# 步骤1: 点击"登录"
|
|
326
|
-
d.click(540, 338)
|
|
327
|
-
time.sleep(2.0) # 智能等待页面跳转
|
|
328
|
-
|
|
329
|
-
# 步骤2: 输入用户名
|
|
330
|
-
d(resourceId="com.example:id/username").set_text("test123")
|
|
331
|
-
time.sleep(1.5)
|
|
332
|
-
|
|
333
|
-
# 步骤3: 点击提交
|
|
334
|
-
d.click(972, 1200)
|
|
335
|
-
time.sleep(2.0)
|
|
336
|
-
|
|
337
|
-
assert d(text="首页").exists()
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
## 🛠️ 工具列表
|
|
341
|
-
|
|
342
|
-
### 基础工具(不需要 AI,共 9 个)
|
|
343
|
-
| 工具 | 说明 | 示例 |
|
|
344
|
-
|------|------|------|
|
|
345
|
-
| `mobile_list_elements` | 列出所有可交互元素 | 显示 resource_id, text, bounds |
|
|
346
|
-
| `mobile_click_by_id` | 通过 resource-id 点击 | 精确可靠 |
|
|
347
|
-
| `mobile_click_by_text` | 通过文本点击 | 文本完全匹配 |
|
|
348
|
-
| `mobile_click_at_coords` | 点击坐标 | 配合截图分析使用 |
|
|
349
|
-
| `mobile_input_text_by_id` | 输入文本 | 通过 resource-id |
|
|
350
|
-
| `mobile_find_elements_by_class` | 按类名查找 | 如 EditText |
|
|
351
|
-
| `mobile_wait_for_element` | 等待元素出现 | 等待页面加载 |
|
|
352
|
-
| `mobile_take_screenshot` | 截屏 | 供 Cursor AI 视觉识别 |
|
|
353
|
-
| `mobile_take_screenshot_region` | 区域截屏 | 局部分析 |
|
|
354
|
-
|
|
355
|
-
### 智能工具(需要 AI,可选,共 4 个)
|
|
356
|
-
| 工具 | 说明 | 使用场景 |
|
|
357
|
-
|------|------|----------|
|
|
358
|
-
| `mobile_smart_click` | 自然语言点击 | 平台自动化 |
|
|
359
|
-
| `mobile_smart_input` | 自然语言输入 | 批量测试 |
|
|
360
|
-
| `mobile_analyze_screenshot` | AI 分析截图 | 复杂场景 |
|
|
361
|
-
| `mobile_get_ai_status` | 检查 AI 状态 | 调试配置 |
|
|
362
|
-
|
|
363
|
-
### 测试工具(不需要 AI,共 1 个)✨ 新增
|
|
364
|
-
| 工具 | 说明 | 特点 |
|
|
365
|
-
|------|------|------|
|
|
366
|
-
| `mobile_generate_test_script` | 生成 pytest 测试脚本 | 智能等待、弹窗处理、独立运行 |
|
|
367
|
-
|
|
368
|
-
### 通用工具(共 4 个)
|
|
369
|
-
| 工具 | 说明 |
|
|
370
|
-
|------|------|
|
|
371
|
-
| `mobile_snapshot` | 获取页面结构 |
|
|
372
|
-
| `mobile_launch_app` | 启动应用 |
|
|
373
|
-
| `mobile_swipe` | 滑动屏幕 |
|
|
374
|
-
| `mobile_press_key` | 按键操作(支持智能验证 ✨ 新增)|
|
|
375
|
-
|
|
376
|
-
**总计:18 个工具**
|
|
377
|
-
|
|
378
|
-
## 🎯 智能验证功能详解
|
|
379
|
-
|
|
380
|
-
### `mobile_press_key` - 彻底解决"假成功"问题
|
|
381
|
-
|
|
382
|
-
**问题背景:**
|
|
383
|
-
|
|
384
|
-
传统按键操作只检查命令是否执行,不验证按键是否真的生效,导致:
|
|
385
|
-
- ✗ 命令执行成功 ≠ 按键生效
|
|
386
|
-
- ✗ 测试显示通过,实际操作失败
|
|
387
|
-
- ✗ 搜索键在某些应用/输入法中不起作用
|
|
388
|
-
|
|
389
|
-
**智能验证方案:**
|
|
390
|
-
|
|
391
|
-
```python
|
|
392
|
-
# 方式1: 验证模式(推荐,默认)
|
|
393
|
-
await press_key("search", verify=True)
|
|
394
|
-
# ✅ 自动检测页面变化
|
|
395
|
-
# ✅ 搜索键无效时自动尝试回车键
|
|
396
|
-
# ✅ 返回真实操作结果
|
|
397
|
-
|
|
398
|
-
# 方式2: 快速模式
|
|
399
|
-
await press_key("back", verify=False)
|
|
400
|
-
# ⚡ 执行后立即返回
|
|
401
|
-
# ⚠️ 不保证按键效果
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
**工作原理:**
|
|
405
|
-
|
|
406
|
-
1. **操作前快照** - 记录当前页面状态
|
|
407
|
-
2. **执行按键** - 发送按键命令
|
|
408
|
-
3. **页面监测** - 等待并检测页面变化(最多2秒)
|
|
409
|
-
4. **智能判断** - 页面变化 > 5% 认为成功
|
|
410
|
-
5. **搜索键回退** - SEARCH 无效时自动尝试 ENTER
|
|
411
|
-
|
|
412
|
-
**使用示例:**
|
|
413
|
-
|
|
414
|
-
```
|
|
415
|
-
@MCP 帮我搜索:
|
|
416
|
-
1. 在搜索框输入 "测试内容"
|
|
417
|
-
2. 按搜索键(自动验证)
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
返回结果:
|
|
421
|
-
```json
|
|
422
|
-
{
|
|
423
|
-
"success": true,
|
|
424
|
-
"key": "search",
|
|
425
|
-
"keycode": 84,
|
|
426
|
-
"verified": true,
|
|
427
|
-
"page_changed": true,
|
|
428
|
-
"fallback_used": false,
|
|
429
|
-
"message": "搜索键(SEARCH)生效"
|
|
430
|
-
}
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
如果 SEARCH 键无效:
|
|
434
|
-
```json
|
|
435
|
-
{
|
|
436
|
-
"success": true,
|
|
437
|
-
"key": "search",
|
|
438
|
-
"keycode": 66,
|
|
439
|
-
"verified": true,
|
|
440
|
-
"page_changed": true,
|
|
441
|
-
"fallback_used": true,
|
|
442
|
-
"message": "搜索键(SEARCH)无效,已使用ENTER键替代并成功"
|
|
443
|
-
}
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
如果按键无效:
|
|
447
|
-
```json
|
|
448
|
-
{
|
|
449
|
-
"success": false,
|
|
450
|
-
"key": "search",
|
|
451
|
-
"verified": true,
|
|
452
|
-
"page_changed": false,
|
|
453
|
-
"message": "按键命令执行成功但页面未变化,可能按键未生效"
|
|
454
|
-
}
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
**使用建议:**
|
|
458
|
-
|
|
459
|
-
| 场景 | 模式 | 原因 |
|
|
460
|
-
|------|------|------|
|
|
461
|
-
| 搜索、提交等关键操作 | `verify=True` | 确保操作真的成功 |
|
|
462
|
-
| 返回上一页 | `verify=True` | 确保页面跳转 |
|
|
463
|
-
| 连续快速导航 | `verify=False` | 提高执行速度 |
|
|
464
|
-
| 调试/测试 | `verify=True` | 发现潜在问题 |
|
|
465
|
-
|
|
466
|
-
**性能对比:**
|
|
467
|
-
|
|
468
|
-
- 快速模式:~0.05秒(不保证效果)
|
|
469
|
-
- 验证模式:~0.5-2秒(确保成功)
|
|
470
|
-
- 额外耗时:小于2秒,换来可靠性
|
|
471
|
-
|
|
472
|
-
**支持的按键:**
|
|
473
|
-
|
|
474
|
-
- `enter` / `回车` - Enter键 (keycode=66)
|
|
475
|
-
- `search` / `搜索` - 搜索键 (keycode=84, 自动回退到66)
|
|
476
|
-
- `back` / `返回` - 返回键 (keycode=4)
|
|
477
|
-
- `home` - Home键 (keycode=3)
|
|
478
|
-
- 直接使用keycode数字(如 `66`)
|
|
479
|
-
|
|
480
|
-
**演示脚本:**
|
|
481
|
-
|
|
482
|
-
运行 `python backend/mobile_mcp/examples/press_key_verification_demo.py` 查看完整演示
|
|
483
|
-
|
|
484
|
-
## 📚 文档
|
|
485
|
-
|
|
486
|
-
- [用户配置指南](docs/USER_CONFIGURATION_GUIDE.md) - AI 密钥配置、常见问题
|
|
487
|
-
- [启动指南](docs/START_GUIDE.md) - 完整的安装和配置步骤
|
|
488
|
-
- [测试脚本生成](docs/如何生成测试脚本.md) - 如何生成 pytest 测试脚本
|
|
489
|
-
- [自动化行为配置说明](docs/自动化行为配置说明.md) - 控制屏幕方向和自动关闭广告
|
|
490
|
-
|
|
491
|
-
## 🎯 使用场景选择
|
|
492
|
-
|
|
493
|
-
### 个人使用 Cursor(推荐新手)
|
|
494
|
-
- 只装基础版:`pip install mobile-mcp-ai`
|
|
495
|
-
- 不配置 AI key
|
|
496
|
-
- 通过 Cursor AI 使用(Cursor AI 自带视觉识别)
|
|
497
|
-
- 💰 **完全免费**
|
|
498
|
-
|
|
499
|
-
### 平台开发(推荐开发者)
|
|
500
|
-
- 装完整版:`pip install mobile-mcp-ai[ai]`
|
|
501
|
-
- 配置 AI key
|
|
502
|
-
- 可以脱离 Cursor 独立使用
|
|
503
|
-
- 适合做自动化测试平台、CI/CD 集成
|
|
504
|
-
- 💸 需要 AI API 费用
|
|
505
|
-
|
|
506
|
-
## 🆕 更新日志
|
|
507
|
-
|
|
508
|
-
### v2.0.3 (最新)
|
|
509
|
-
- ✨ **测试脚本生成**:AI 操作后一键生成 pytest 脚本
|
|
510
|
-
- ⏱️ **智能等待优化**:从固定 3 秒改为智能检测页面稳定(2-8秒)
|
|
511
|
-
- 🎯 **弹窗智能处理**:自动检测和跳过可选弹窗,避免测试失败
|
|
512
|
-
- 📱 **设备ID自动检测**:支持多设备环境
|
|
513
|
-
- 📂 **路径自动修复**:测试脚本保存到用户项目目录
|
|
514
|
-
- 🚀 **超时优化**:MCP 操作超时从 25.9秒降至 8秒(69% 提升)
|
|
515
|
-
- 🔧 **等待时间优化**:根据操作类型智能调整(页面跳转 2秒,搜索 2.5秒)
|
|
516
|
-
|
|
517
|
-
### v2.0.2
|
|
518
|
-
- 🐛 修复独立测试脚本生成问题
|
|
519
|
-
- 📦 优化依赖管理
|
|
520
|
-
|
|
521
|
-
### v2.0.1
|
|
522
|
-
- 🐛 修复测试脚本 `append()` 语法错误
|
|
523
|
-
- 📝 更新文档
|
|
524
|
-
|
|
525
|
-
### v2.0.0
|
|
526
|
-
- ✨ AI 功能可选化:基础工具不需要 AI 密钥
|
|
527
|
-
- 🚀 新增 3 个工具:截图、区域截图、AI 视觉识别
|
|
528
|
-
- 📦 依赖优化:核心依赖最小化
|
|
529
|
-
- 🏗️ 架构重构:分离基础工具和智能工具
|
|
530
|
-
- 🐛 修复 AI 响应解析问题
|
|
531
|
-
- 📝 完善用户文档
|
|
532
|
-
|
|
533
|
-
### 向后兼容
|
|
534
|
-
- ✅ 完全兼容之前的使用方式
|
|
535
|
-
- ✅ 已配置 AI 的用户无需修改
|
|
536
|
-
- ✅ 新用户可以选择不配置 AI
|
|
537
|
-
|
|
538
|
-
## 📊 技术栈
|
|
539
|
-
|
|
540
|
-
- **MCP 协议**:与 Cursor AI 无缝集成
|
|
541
|
-
- **UIAutomator2**:Android 自动化引擎
|
|
542
|
-
- **Appium**:iOS 自动化支持(可选)
|
|
543
|
-
- **多 AI 支持**:通义千问、OpenAI、Claude(可选)
|
|
544
|
-
|
|
545
|
-
## 🤝 贡献
|
|
546
|
-
|
|
547
|
-
欢迎提交 Issue 和 Pull Request!
|
|
548
|
-
|
|
549
|
-
有问题或建议?欢迎在 Issues 中反馈。
|
|
550
|
-
|
|
551
|
-
## 📄 License
|
|
552
|
-
|
|
553
|
-
Apache License 2.0
|
|
554
|
-
|
|
555
|
-
---
|
|
556
|
-
|
|
557
|
-
<div align="center">
|
|
558
|
-
|
|
559
|
-
**⭐ 如果这个项目对你有帮助,请给个 Star 支持一下!⭐**
|
|
560
|
-
|
|
561
|
-
[](https://gitee.com/chang-xinping/mobile-automation-mcp-service/stargazers)
|
|
562
|
-
|
|
563
|
-
[Gitee 仓库](https://gitee.com/chang-xinping/mobile-automation-mcp-service) | [GitHub 仓库](https://github.com/test111ddff-hash/mobile-mcp-ai) | [PyPI 发布](https://pypi.org/project/mobile-mcp-ai/)
|
|
564
|
-
|
|
565
|
-
**让移动端测试更简单!** 🚀
|
|
566
|
-
|
|
567
|
-
</div>
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
core/__init__.py,sha256=ndMy-cLAIsQDG5op7gM_AIplycqZSZPWEkec1pEhvEY,170
|
|
2
|
-
core/basic_tools.py,sha256=UcAKVTRUGku_h-IWzsY5DgzAIkguY3o0YIrkVPU8chg,12608
|
|
3
|
-
core/device_manager.py,sha256=PX3-B5bJFnKNt6C8fT7FSY8JwD-ngZ3toF88bcOV9qA,8766
|
|
4
|
-
core/ios_client.py,sha256=DCPmB7IfPAmE7-WqUrI3m3cvYSHnEj4EKdFlJgMg9Ws,6999
|
|
5
|
-
core/ios_device_manager.py,sha256=3fZUrUs0nXbeSMqWsn3qzJt_mlos6-xNzpgCqEBRHpc,8628
|
|
6
|
-
core/mobile_client.py,sha256=j8FHroagzblvn6Hh7X_7cSjcluK80U8zHwZV42iKIeM,51887
|
|
7
|
-
core/nl_test_runner.py,sha256=OTTKelRc3EqKnh6KRHzw_mwSNVDGUTF2vc7W5icuaa4,23039
|
|
8
|
-
core/smart_app_launcher.py,sha256=IREISumydoZoQmc7_mx0D14RNHgQQUSYsEgwTazLnbI,13240
|
|
9
|
-
core/smart_tools.py,sha256=rnbcCV3jpJUniNwbUf8RWAlDT9wUAsn52rNSCdhkJ6Y,11861
|
|
10
|
-
core/ai/__init__.py,sha256=aZDI74p0ytVwVy0EWSL4Ajt9dPMe0ZuYoQfqjzzxoYw,162
|
|
11
|
-
core/ai/ai_analyzer.py,sha256=BbuE44Cdk-CV0XJUqgYDDcc0R0zJgpt6f-epKiPQlmo,7293
|
|
12
|
-
core/ai/ai_config.py,sha256=MVW5v1YM466UHqUnCM87-fZ8czlkEuBJlwyukmMGNuA,3421
|
|
13
|
-
core/ai/ai_platform_adapter.py,sha256=eKqrd7oolO2c_Ij_t3eWrVe7D00uew8WcOHbzngTH1c,13513
|
|
14
|
-
core/ai/smart_test_executor.py,sha256=N4G5jN7nyKRtct6bA4dBa4TJfe5tKFyQFaibQsefQa0,19318
|
|
15
|
-
core/ai/test_generator.py,sha256=JhvAV-NsviD3Z6JtcWXLPDRi8Ji0IRiuU-L0B2mo5mc,18091
|
|
16
|
-
core/ai/test_generator_from_history.py,sha256=pi3qGM9dcjSiUfZ2OYloIASSTngHfywTBUBTsm8Roas,19687
|
|
17
|
-
core/ai/test_generator_standalone.py,sha256=Lbu6WaqxBMvmYyBkndilT6DuaJIDNvM_3aPTYETIhdI,10287
|
|
18
|
-
core/assertion/__init__.py,sha256=qgqhSOtGvcFpLajWOhftk8VPg6GuosiWdrMjtSLbyrw,143
|
|
19
|
-
core/assertion/smart_assertion.py,sha256=jddTZIfqw84mBqgOugL_jPGIEkpWvpmbpIciHCpQWc0,11945
|
|
20
|
-
core/h5/__init__.py,sha256=hJ4_s10BXzmy-nrffxm_ZeHfncR7dgcYWv7Y_uS9Yoc,171
|
|
21
|
-
core/h5/h5_handler.py,sha256=rFSpA6FXpo-UeM9aa2P3lt-Gxcc2Q9Gm06Kdlwj0IOw,20432
|
|
22
|
-
core/locator/__init__.py,sha256=vINnuy4K0LTQEpr45E7EWCi6GFOCLHVzFtru-ofLw9I,129
|
|
23
|
-
core/locator/cursor_ai_auto_analyzer.py,sha256=WxC4D4YYE5q9jAoMTh0bxx-0tO-ASdweOPb6VFovHIc,3999
|
|
24
|
-
core/locator/cursor_vision_helper.py,sha256=wuJtLcJyPn0MJpv5KF6Ty4LbTVG6CYpfgF8Hf7Assck,16070
|
|
25
|
-
core/locator/mobile_smart_locator.py,sha256=QZau7HMrJ38oo-jKYiyXe3XMcGI0eH8hNRukGyzKwxQ,87075
|
|
26
|
-
core/locator/position_analyzer.py,sha256=-ujqJB274wLpitbZaHa5kXfkxnlXw9riDAzFGcjOsXo,31292
|
|
27
|
-
core/locator/script_updater.py,sha256=DOkhMwcdwamJuc7lkKt0YOwyATusN7RGrhaMherUHlo,5484
|
|
28
|
-
core/utils/__init__.py,sha256=RhMMsPszmEn8Q8GoNufypVSHJxyM9lio9U6jjpnuoPI,378
|
|
29
|
-
core/utils/logger.py,sha256=XXQAHUwT1jc70pq_tYFmL6f_nKrFlYm3hcgl-5RYRg0,3402
|
|
30
|
-
core/utils/operation_history_manager.py,sha256=gi8S8HJAMqvkUrY7_-kVbko3Xt7c4GAUziEujRd-N-Y,4792
|
|
31
|
-
core/utils/smart_wait.py,sha256=PvKXImfN9Irru3bQJUjf4FLGn8LjY2VLzUNEl-i7xLE,8601
|
|
32
|
-
mcp/__init__.py,sha256=3_ryxk2fcARzpw4HI4gg5ClAlbpWuRnWiZIodx71iZ4,107
|
|
33
|
-
mcp/mcp_server.py,sha256=WcX4kz6Y7dX4wmOFUucunpG2sUE3vB1uqXHOAKcPdY8,84276
|
|
34
|
-
mcp/mcp_server_simple.py,sha256=F-0s48y0MapaHkGSZ6L83MFolb9J5-zteWX8NojDGhU,19650
|
|
35
|
-
utils/__init__.py,sha256=8EH0i7UGtx1y_j_GEgdN-cZdWn2sRtZSEOLlNF9HRnY,158
|
|
36
|
-
utils/logger.py,sha256=Sqq2Nr0Y4p03erqcrbYKVPCGiFaNGHMcE_JwCkeOfU4,3626
|
|
37
|
-
utils/xml_formatter.py,sha256=uwTRb3vLbqhT8O-udzWT7s7LsV-DyDUz2DkofD3hXOE,4556
|
|
38
|
-
utils/xml_parser.py,sha256=QhL8CWbdmNDzmBLjtx6mEnjHgMFZzJeHpCL15qfXSpI,3926
|
|
39
|
-
vision/__init__.py,sha256=S_fu_WGTFefnw2Gyxr1DhAW0P9Jo3yZT7HgOs_mx1Iw,128
|
|
40
|
-
vision/vision_locator.py,sha256=d0vkoeeZOQa-LTbjEDVhznebsdqRgnAZKToYKMHB2Us,14922
|
|
41
|
-
mobile_mcp_ai-2.1.2.dist-info/METADATA,sha256=FbhdMKfGfU-srnzASnmhmgDbG9xTvyn54lDGMaLrnqo,18495
|
|
42
|
-
mobile_mcp_ai-2.1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
43
|
-
mobile_mcp_ai-2.1.2.dist-info/entry_points.txt,sha256=xGgGmMIRfLyYyuzlh8p6yy__n0VnCa0HZazY3wfEDMM,69
|
|
44
|
-
mobile_mcp_ai-2.1.2.dist-info/top_level.txt,sha256=juzI5dDypBaeQMveGEyN3-P5aH54mlmtt_fkKtJXWN0,22
|
|
45
|
-
mobile_mcp_ai-2.1.2.dist-info/RECORD,,
|