Skills Plugins MCP Prompt Model 博客 我的中心

ui-testscript-enhancer

"对已生成的 Playwright + POM + Pytest UI 测试脚本做自动化增强,补充智能等待、验证码识别、弹窗处理、iframe 切换、异常重试、失败截图录屏等能力,提升脚本运行稳定性。当用户需要以下场景时触发:增强测试脚本、脚本健壮性优化、添加智能等待、处理验证码、处理弹窗、iframe 处理、异常重试、失败截图、测试稳定性提升、脚本加固。即使用户只是说"脚本跑不稳定"、"经常失败"、"flaky test",也应使用此技能。"

DeepseekModel 官方收录技能 质量 良好 · 64 v1.0.0

获取

https://deepseekmodel.com/api/download.php?id=zhoujinjian-skills-skills-ui-testscript-enhancer-skill-md&format=skill
下载 .skill 标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用
.skill 文件中 system_prompt 字段的实际内容。
name ui-testscript-enhancer description "对已生成的 Playwright + POM + Pytest UI 测试脚本做自动化增强,补充智能等待、验证码识别、弹窗处理、iframe 切换、异常重试、失败截图录屏等能力,提升脚本运行稳定性。当用户需要以下场景时触发:增强测试脚本、脚本健壮性优化、添加智能等待、处理验证码、处理弹窗、iframe 处理、异常重试、失败截图、测试稳定性提升、脚本加固。即使用户只是说"脚本跑不稳定"、"经常失败"、"flaky test",也应使用此技能。" ui-testscript-enhancer — UI 测试脚本增强技能 技能定位 对 ui-testscript-generator 输出的基础 UI 测试脚本做 健壮性增强 ,解决以下常见问题: 页面加载慢 / 元素未就绪导致定位失败 验证码阻断自动化流程 意外弹窗(广告、权限申请)干扰执行 iframe / Shadow DOM 内元素无法定位 网络抖动 / 页面无响应导致脚本中断 失败后缺乏追溯信息(截图、录屏、网络日志) 增强原则 :不改变原有测试逻辑和业务断言,只在脚本外围包裹稳定性机制。 输入识别 输入 必需 说明 基础测试脚本 是 ui-testscript-generator 输出的 POM + test 文件 页面交互规则 否 用户提供的特殊处理规则(验证码类型、弹窗触发条件、异步加载模式等) 脚本定位 如果用户没有指定具体文件路径,按以下顺序查找: 当前目录及子目录下的 pages/ 和 tests/ 目录 ui-test-automation/ 项目目录 用户直接提供的文件内容 工作流程 Phase 1:扫描基础脚本,识别增强点 读取基础测试脚本,逐文件分析需要增强的场景: 1.1 扫描 POM 类 对每个 _page.py 文件检查: 检查项 增强动作 navigate() 方法使用 page.goto(url) 替换为 page.goto(url, wait_until="networkidle") 直接 .click() 无等待 替换为 safe_click() (先等待可见再点击) 直接 .fill() 无等待 替换为 safe_fill() (先等待可编辑再填写) 无异常捕获的操作方法 添加重试装饰器 页面跳转方法无等待目标页 添加 expect(page).to_have_url() 等待 含 iframe/Shadow DOM 的页面 生成 iframe 切换方法 登录页含验证码逻辑 接入验证码识别方案 1.2 扫描测试脚本 对每个 test_*.py 文件检查: 检查项 增强动作 无失败截图机制 注入 pytest hook 自动截图 无 Trace 录制配置 添加 playwright.cfg 配置 弹窗未处理 添加 page.on("dialog") 监听 无网络请求监控 添加 page.on("response") 日志 无全局异常处理 添加 pytest_exception_interact hook 1.3 输出增强清单 📋 增强计划: pages/auth/login_page.py: ✅ navigate → 添加 networkidle 等待 ✅ click_login → 替换为 safe_click + 重试 ✅ fill_captcha → 接入验证码识别 ⚠️ 新增: _handle_unexpected_dialog 弹窗处理 tests/auth/test_login.py: ✅ 添加 conftest 失败自动截图 hook ✅ 添加网络请求日志记录 全局: ✅ enhanced_base_page.py → 替换原有 base_page.py ✅ utils/retry_decorator.py → 重试机制 ✅ utils/captcha_solver.py → 验证码识别 Phase 2:增强 BasePage 基类 将原有的 base_page.py 替换为增强版 enhanced_base_page.py ,新增以下能力: 智能等待方法 def wait_for_page_ready ( self, timeout: int = 30000 ): """等待页面完全加载(网络空闲 + DOM 稳定)""" self .page.wait_for_load_state( "networkidle" , timeout=timeout) self .page.wait_for_load_state( "domcontentloaded" , timeout=timeout) def wait_for_ajax ( self, api_pattern: str = "**/api/**" , timeout: int = 15000 ): """等待指定 API 请求完成""" with self .page.expect_response(api_pattern, timeout=timeout) as resp: yield resp.value def wait_for_animation ( self, locator: Locator, timeout: int = 5000 ): """等待 CSS 动画/过渡完成""" locator.wait_for(state= "visible" , timeout=timeout) self .page.wait_for_timeout( 300 ) # transition buffer def safe_click ( self, locator: Locator, retries: int = 3 ): """安全点击:等待 → 重试 → 截图""" ... def safe_fill ( self, locator: Locator, value: str , retries: int = 3 ): """安全填写:等待可编辑 → 清空 → 填写""" ... 详细实现参考 assets/enhanced_base_page.py 。 弹窗自动处理 def dismiss_unexpected_dialog ( self ): """自动关闭意外弹窗(alert/confirm/prompt)""" self .page.on( "dialog" , lambda dialog: dialog.dismiss()) iframe 穿透 def enter_iframe ( self, iframe_selector: str ) -> FrameLocator: return self .page.frame_locator(iframe_selector) def leave_iframe ( self ): """自动回到主框架""" # FrameLocator 操作完自动回主框架 详细方法参考 references/popup_iframe_guide.md 。 Phase 3:添加重试与容错机制 3.1 操作级重试装饰器 为 POM 方法添加 @retry_on_failure 装饰器: @retry_on_failure( max_retries= 3 , delay= 1.0 , screenshot= True ) def click_login ( self ) -> "HomePage" : self ._login_button.click() return HomePage( self .page) 元素未找到 → 重试 超时 → 重试 重试耗尽 → 自动截图 + 记录日志 + 抛出异常 详细实现参考 assets/retry_decorator.py 。 3.2 页面级恢复机制 def recover_page ( self ): """页面崩溃/无响应时自动恢复""" try : self .page.reload(wait_until= "networkidle" ) except Exception: self .page.goto( self .page.url, wait_until= "networkidle" ) Phase 4:验证码识别方案 根据用户提供的验证码类型,选择对应的识别策略: 验证码类型 识别方案 说明 图形验证码 OCR(ddddocr) 开源 OCR,离线识别 滑动验证码 视觉分析 + 模拟拖拽 计算滑块偏移量 文字点选验证码 OCR + 坐标匹配 识别文字位置 计算题验证码 表达式解析 提取并计算 短信验证码 API/数据库查询 从后端获取 第三方验证码 打码平台 API 2Captcha / 超级鹰等 集成方式 在 POM 类中替换硬编码的验证码值: # 增强前 def fill_captcha ( self, code: str ) -> "LoginPage" : self ._captcha_input.fill(code) return self # 增强后 def fill_captcha ( self ) -> "LoginPage" : code = self ._solve_captcha() self ._captcha_input.fill(code) return self def _solve_captcha ( self ) -> str : """自动识别验证码""" captcha_image = self ._captcha_image.screenshot() return CaptchaSolver.solve_image(captcha_image) 详细方案参考 references/captcha_guide.md 。 Phase 5:失败追溯增强 5.1 自动截图 在 conftest.py 中添加 pytest hook: @pytest.hookimpl( hookwrapper= True ) def pytest_runtest_makereport ( item, call ): outcome = yield report = outcome.get_result() if report.when == "call" and report.failed: page = item.funcargs.get( "page" ) if page: screenshot_path = f"screenshots/ {item.name} .png" page.screenshot(path=screenshot_path, full_page= True ) report.extra = [{ "name" : "screenshot" , ...}] 5.2 Trace 录制配置 在 conftest.py 的 browser context 配置中添加: @pytest.fixture( scope= "session" ) def browser_context_args ( browser_context_args ): return { **browser_context_args, "record_trace" : True , "record_video" : True , "screenshot" : "only-on-failure" , "trace" : "retain-on-failure" , "video" : "retain-on-failure" , } 5.3 网络请求日志 @pytest.fixture( autouse= True ) def log_network_requests ( page, request ): """自动记录每个测试的网络请求""" logs = [] page.on( "response" , lambda resp: logs.append( f" {resp.status} {resp.url} " )) yield if hasattr (request.node, "rep_call" ) and request.node.rep_call.failed: with open ( f"reports/network_ {request.node.name} .log" , "w" ) as f: f.write( "\n" .join(logs)) 详细配置参考 references/failure_trace_guide.md 。 Phase 6:生成增强报告 增强完成后,输出增强摘要: 📦 增强完成: 修改文件: 4 个 ✅ pages/base_page.py → enhanced_base_page.py(新增 8 个方法) ✅ pages/auth/login_page.py(3 处增强) ✅ pages/auth/register_page.py(2 处增强) ✅ tests/conftest.py(新增 3 个 hook) 新增文件: 3 个 ✅ utils/retry_decorator.py ✅ utils/captcha_solver.py ✅ utils/popup_handler.py 增强统计: 智能等待: 6 处 重试机制: 3 个方法 弹窗处理: 2 处 失败截图: 全局 hook Trace 录制: 全局配置 ⚠️ 需要手动确认: 验证码类型 → 当前按"图形验证码"处理,如类型不同请告知 打码平台 API Key → 需在 config/settings.py 中配置 验证码识别专项检测(独立使用) 提供独立脚本,可脱离测试项目单独运行,快速验证验证码识别功能是否有效。 使用场景 验证码集成到 POM 之前,先确认 OCR 识别准确率 页面验证码类型变更后,快速校验识别是否仍然有效 对比不同识别方案(OCR vs 打码平台)的准确率 运行方式 SCRIPT_DIR=~/.claude/skills/ui-testscript-enhancer/scripts # 基础用法:单次识别 python3 " ${SCRIPT_DIR} /test_captcha.py" http://localhost:3000/login # 多轮识别(刷新验证码,统计准确率) python3 " ${SCRIPT_DIR} /test_captcha.py" http://localhost:3000/login --rounds 5 # 自定义验证码选择器(自动定位失败时) python3 " ${SCRIPT_DIR} /test_captcha.py" http://localhost:3000/login --selector "img.captcha-img" # 有头模式(观察浏览器行为) python3 " ${SCRIPT_DIR} /test_captcha.py" http://localhost:3000/login --headed # 指定输出目录 python3 " ${SCRIPT_DIR} /test_captcha.py" http://localhost:3000/login -o ./my_captcha_test 输出示例 ============================================================ 验证码识别专项测试 ============================================================ 目标 URL: http://localhost:3000/login 识别轮数: 3 输出目录: ./captcha_test_output/20260529_100000 --- 第 1/3 轮 --- 定位选择器: img[src*='captcha'] 图片尺寸: 120x40 图片 src: /api/captcha?t=1748... 识别结果: 【a7k2】 页面截图: ./captcha_test_output/20260529_100000/round_1/page_context.png --- 第 2/3 轮 --- ... ============================================================ 识别汇总 ============================================================ 总轮数: 3 成功识别: 3 识别失败: 0 各轮识别结果: 轮 1: 【a7k2】 轮 2: 【x9m4】 轮 3: 【p3f8】 📂 所有截图保存在: ./captcha_test_output/20260529_100000 请打开截图与识别结果对比,验证识别准确度 输出文件结构 captcha_test_output/20260529_100000/ ├── round_1/ │ ├── captcha_raw.png # 验证码图片原始截图 │ └── page_context.png # 页面完整截图(含验证码上下文) ├── round_2/ │ ├── captcha_raw.png │ └── page_context.png └── round_3/ ├── captcha_raw.png └── page_context.png 用户打开 captcha_raw.png 可直接看到验证码原图,与终端输出的 识别结果 文字对比,即可判断 OCR 准确度。 定位器优先级 脚本内置多种验证码选择器,按优先级依次尝试: img[src*='captcha'] — src 包含 captcha img[src*='verify'] — src 包含 verify
Agent 识别该技能的关键词,点击任意一个即可复制。

该技能未提供触发词。

下载的 .skill 包内含以下字段。
字段 说明
format格式标识(skill/v1)
skill_id技能唯一 ID
name技能名称
version版本号
description技能描述
category所属分类(数组)
trigger_words触发词列表
tags标签列表
source来源标识
source_url来源链接(本页地址)
exported_at导出时间(每次下载生成)
system_prompt系统提示词正文
model_config模型参数:provider / model / temperature / max_tokens / top_p
examples示例
install_guide各平台导入说明(Coze / Dify / Claude / 自定义框架)
同一份技能可按不同平台格式导出。
.skill 标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用 下载
.skillpro 增强格式,额外含脚本 / 工具 / 依赖 / 钩子占位 下载
.json 纯 JSON 导出,只含 system_prompt 与模型参数 下载
Coze 带 frontmatter 的 Markdown,Coze 平台导入用 下载
Dify Dify DSL,创建应用后直接导入 下载

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。