Install
openclaw skills install @yiziria/minium-test-fixerMinium 测试用例修复工具。自动修复测试中的元素定位错误,分析错误日志、读取 WXML 快照、找到正确元素定位并修复代码。当测试报错"找不到元素"、需要优化元素定位、或分析 WXML 结构时使用此技能。支持本地运行日志和云测平台报告。
openclaw skills install @yiziria/minium-test-fixer自动修复 Minium 测试用例中的元素定位错误。当测试用例因元素找不到而失败时,本技能自动分析错误日志、读取 WXML 快照、找到正确的元素定位并修复代码。
核心能力:
核心触发场景:用户提供 Minium 测试错误报告,要求修复用例
触发词:
支持的报告格式:
当用户提供错误报告时,禁止直接修复!
正确流程:
第 1 步:运行测试用例
→ minitest -m <模块名> --case <用例名> -c config.json -g
→ 等待测试失败,自动生成 error_wxml/error_page.xml
第 2 步:读取错误日志
→ 找到失败的元素定位(如 self.tap(self.xxx))
→ 记录元素变量名(如 xxx)
第 3 步:在 WXML 中搜索正确元素
→ 搜索元素文本或 class
→ 找到正确的定位方式
第 4 步:提供修复方案给用户确认
→ 展示当前定位和正确定位
→ 等待用户确认
第 5 步:更新代码
→ 修改对应的 Page Object 文件
错误示范(禁止!):
核心问题:页面里有多个同样的元素,直接点击会失败
正确做法:
# ❌ 错误做法(会失败)
self.tap_icon(self.element_name)
# ✅ 正确做法(获取第一个元素)
self.get_elements(self.element_name)[0].tap()
适用场景:
核心问题:长 XPath 依赖页面结构索引,页面结构变化就会失效
对比:
# ❌ 错误做法(长 XPath,不稳定)
element_name = "/page-wrapper/view/view/view[1]/view[3]/view[4]/view[3]/view[1]/home-sequence-list/view/view/view[6]/view[1]/view[2]"
# ✅ 正确做法(文本定位,稳定)
element_name = "//*[text()='按钮文本']"
定位优先级:
//*[text()='按钮文本']view.class-name//view[@data-key='xxx']当以下情况无法确定元素时:
element_1)正确做法:
这个元素的定位路径失效了,变量名是 `feed_follow_leader`。
在最新 WXML 中没找到唯一匹配的元素。
请问这个元素应该显示什么文本?或者截个图告诉我它是哪个按钮?
错误做法:
当修复用例时,禁止直接修改!
正确流程:
第 1 步:读取现有 Page Object 文件
→ 查看元素定义风格(CSS selector 还是 xpath)
→ 查看方法命名规范
第 2 步:总结现有规则
→ Page Object 命名规则
→ 元素定位规则
→ 测试用例结构
第 3 步:按现有规则修复
→ 新 Page Object 遵循已有命名和结构
→ 新测试用例遵循已有风格和格式
→ 不引入与现有代码冲突的规范
Page Object 核心规则:
先阅读用户的基类代码(如 basedef.py)
检查用户的封装方式
tap(), click(), click_element(), tap_icon() 等send_key(), input_text(), type() 等scroll_to(), scroll() 等不要照搬录制脚本的等待时间!
self.page.wait_for(x) 是录制工具自动生成的tap(), send_key())内部已有等待逻辑sleep() 或 wait_for()核心原则:改完之后一定要在本地先自己跑一遍确认没有报错
正确流程:
第 1 步:修复元素定位
→ 修改 Page Object 文件
第 2 步:本地运行测试
→ 激活微信开发者工具(AppActivate)
→ minitest -m <模块名> --case <用例名> -c config.json -g
第 3 步:确认测试结果
→ 看到 "case num:1, failed num:0, error num:0" 才算成功
→ 如果还有报错 → 继续修复其他元素
第 4 步:报告用户
→ 本地验证通过后再告知用户
→ 云测平台的用例让用户重新运行
错误示范(禁止!):
正确示范:
✅ 修复完成!
本地验证结果:
====================case num:1, failed num:0, error num:0====================
主人,本地测试已通过!你可以在云测平台重新运行了!
方法 A:使用窗口标题激活(推荐)
# 通过窗口标题激活微信开发者工具
$wshell = New-Object -ComObject wscript.shell
$wshell.AppActivate("微信开发者工具")
# 运行测试用例
minitest -m <模块路径> --case <用例名> -c config.json -g
方法 B:使用进程名激活
# 通过进程名激活
Add-Type -AssemblyName System.Windows.Forms
$proc = Get-Process | Where-Object { $_.ProcessName -like "*wechat*" -or $_.MainWindowTitle -like "*开发者工具*" }
if($proc) {
[System.Windows.Forms.SendKeys]::SendWait("%{TAB}")
Start-Sleep -Milliseconds 500
}
# 运行测试
minitest -m <模块路径> --case <用例名> -c config.json -g
注意:
AppActivate 直接激活指定窗口(比 Alt+Tab 更可靠)测试失败后,查看错误堆栈:
File "cases/case/pages/pages/xxx/xxx.py", line 399, in test_method
self.tap(self.element_name)
提取关键信息:
pages/pages/xxx/xxx.pyself.element_nameSelect-String -Path "<文件路径>" -Pattern "element_name\s*="
示例输出:
element_name = "//*[text()='按钮文本']"
Get-ChildItem "error_wxml\error_page.xml" | Select-Object LastWriteTime
在 WXML 中搜索正确元素:
# 搜索文本
Select-String -Path "error_wxml\error_page.xml" -Pattern "按钮文本"
# 搜索 class
Select-String -Path "error_wxml\error_page.xml" -Pattern "operate-btn|more"
# 搜索 custom-modal/popup
Select-String -Path "error_wxml\error_page.xml" -Pattern "custom-modal|popup"
向用户展示:
## 📊 分析结果
**当前元素定义**:
```python
element_name = "//*[text()='按钮文本']"
WXML 中实际结构:
<view class="actionsheet--sheet-item">按钮文本</view>
建议修复方案:
方案 1:使用 class 定位
element_name = "view.class='actionsheet--sheet-item'"
方案 2:使用 text 包含
element_name = "//*[contains(text(),'按钮')]"
主人,确认这个修改吗? 🔧
---
### 步骤 6:用户确认后更新代码
```python
# 使用 edit 工具精确替换
edit(
path="<文件路径>",
oldText='element_name = "//*[text()=\'按钮文本\']"',
newText='element_name = "view.class=\'actionsheet--sheet-item\'"'
)
⚠️ 重要:修复后必须在本地验证!
# 激活微信开发者工具
$wshell = New-Object -ComObject wscript.shell
$wshell.AppActivate("微信开发者工具")
# 运行测试
minitest -m <模块路径> --case <用例名> -c config.json -g
确认测试通过:
====================case num:1, failed num:0, error num:0====================
只有看到上述输出才算修复完成!
如果还有报错:
现象:元素定位正确,但点击失败
原因:页面里有多个同样的元素,tap_icon() 不知道点哪个
解决:使用 get_elements()[0].tap() 获取第一个
案例:
# feed_statistic 等按钮在 feed 列表中重复出现
self.get_elements(self.feed_statistic)[0].tap()
self.get_elements(self.feed_order_manage)[0].tap()
self.get_elements(self.feed_wait_thaw_payment)[0].tap()
现象:今天能跑,明天就失败
原因:XPath 依赖页面结构索引,页面结构一变就失效
解决:使用文本定位 //*[text()='按钮文本']
案例:
# ❌ 错误做法
element_name = "/page-wrapper/view/view/view[1]/view[3]/view[4]/view[3]/view[1]/home-sequence-list/view/view/view[6]/view[1]/view[2]"
# ✅ 正确做法
element_name = "//*[text()='按钮文本']"
现象:页面跳转超时 WaitTimeoutError
原因:微信开发者工具在后台,页面加载慢或卡住
解决:运行测试前用 AppActivate 激活开发者工具
案例:
$wshell = New-Object -ComObject wscript.shell
$wshell.AppActivate("微信开发者工具")
Start-Sleep -Milliseconds 2000
现象:修改后元素定义变成乱码
原因:PowerShell 字符串转义问题
解决:使用 Python 脚本修改文件
案例:
# fix_elements.py
import re
content = open('file.py', 'r', encoding='utf8').read()
content = re.sub(r'element_name = ".*?"', 'element_name = "//*[text()=\'按钮文本\']"', content)
open('file.py', 'w', encoding='utf8').write(content)
用户:
测试用例 test_xxx 报错了
Error Log:
File "pages/xxx.py", line 399
self.tap(self.element_name)
RuntimeError: 找不到元素
技能响应:
🦞 收到,我来帮你修复!
**第 1 步:运行测试获取最新 WXML**
```bash
minitest -m testcase.xxx --case test_xxx -c config.json -g
[运行测试...]
第 2 步:分析错误
element_name//*[text()='按钮文本']第 3 步:查找 WXML [搜索 WXML...]
第 4 步:修复方案 [提供方案...]
主人,确认修改吗?
---
### 示例 2:云测平台报告
**用户**:
测试用例 (testcase.xxx.TestXxx)test_xxx 测试结果 未通过 Error Log: Traceback (most recent call last): File "/home/runtest/minium/framework/libs/unittest/case.py", line 266, in testPartExecutor yield File "/home/runtest/minium/framework/libs/unittest/case.py", line 351, in run self._callTestMethod(testMethod) File "/home/runtest/minium/framework/minitest.py", line 1071, in _callTestMethod method() File "cases/case/testcase/xxx/xxx.py", line 49, in test_xxx self.xxx_page.xxx_method() File "cases/case/pages/pages/xxx/xxx.py", line 169, in xxx_method self.tap(self.element_name)
**技能响应**:
🦞 收到云测报告,我来帮你修复!
分析云测报告:
pages/pages/xxx/xxx.pyxxx_methodself.element_name第 1 步:本地运行测试获取 WXML
minitest -m testcase.xxx --case test_xxx -c config.json -g
[运行测试...]
第 2 步:在 WXML 中搜索元素 [搜索 WXML...]
第 3 步:提供修复方案 [提供方案...]
主人,确认修改吗?
---
### 示例 3:用户说"修复用例"
**用户**:
修复用例 testcase.xxx
**技能响应**:
🦞 好的,我来运行测试并修复!
运行测试:
minitest -m testcase.xxx --case test_xxx -c config.json -g
[等待测试失败 → 读取错误 → 查找 WXML → 提供方案]
---
## 📊 技能统计
| 指标 | 数值 |
|------|------|
| 支持的错误类型 | 元素找不到、元素定位过期、页面结构变化、多元素冲突 |
| 支持的定位方式 | 文本定位、CSS selector、XPath 属性、get_elements |
| 修复流程步骤 | 7 步 |
| 平均修复时间 | 2-5 分钟 |
---
## 🚀 快速开始
当你有 Minium 测试用例报错时,直接说:
修复用例 <用例名>
或者粘贴错误日志,我会自动帮你分析修复!