بنقرة واحدة
playwright-skill
浏览器自动化执行工具。用于执行 Web 页面测试、表单填写、登录验证、截图等浏览器操作。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
浏览器自动化执行工具。用于执行 Web 页面测试、表单填写、登录验证、截图等浏览器操作。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
| name | playwright-skill |
| description | 浏览器自动化执行工具。用于执行 Web 页面测试、表单填写、登录验证、截图等浏览器操作。 |
执行浏览器自动化任务,支持页面测试、表单操作、登录验证等。
禁止猜测选择器!禁止通过截图识别元素!
打开任何页面后,必须立即调用 helpers.describePageForAI(page) 获取页面元素列表,然后根据返回的选择器进行操作。
// 打开页面后第一件事:获取页面结构
await page.goto('http://example.com');
const desc = await helpers.describePageForAI(page);
console.log(desc); // 输出所有可交互元素及其选择器
输出示例:
## Page: WHartTest
URL: http://192.168.150.114:8913/login
### Input Fields (2)
- text: selector="#username" placeholder="请输入用户名"
- password: selector="#password" placeholder="请输入密码"
### Buttons (1)
- "登录": selector="button[type="submit"]"
然后根据输出的选择器进行操作:
await page.fill('#username', 'admin');
await page.fill('#password', '123456');
await page.click('button[type="submit"]');
通过 execute_skill_script 工具调用,传入 inline 代码:
node run.js "your playwright code here"
重要:代码必须写在一行,语句用分号分隔。run.js 会自动包装 async IIFE 和 require 语句。禁止添加 --session、--inline、--eval 等参数,run.js 不支持这些参数。
必须使用环境变量 process.env.SCREENSHOT_DIR 作为截图保存目录。系统会自动设置该变量指向 playwright-skill 目录下的 media/screenshots/ 子目录。
截图命名建议:case_{case_id}_step{step_number}.png
示例:
const screenshotDir = process.env.SCREENSHOT_DIR || './media/screenshots';
await page.screenshot({ path: `${screenshotDir}/case_11_step1.png` });
node run.js "const dir = process.env.SCREENSHOT_DIR; const browser = await chromium.launch({ headless: false }); const page = await browser.newPage(); await page.goto('http://example.com'); await page.screenshot({ path: dir + '/example.png' }); console.log('截图已保存:', dir + '/example.png'); await browser.close();"
node run.js "const dir = process.env.SCREENSHOT_DIR; const browser = await chromium.launch({ headless: false, slowMo: 100 }); const page = await browser.newPage(); await page.goto('http://192.168.150.114:8913/'); await page.screenshot({ path: dir + '/step1_open.png' }); await page.fill('input[type=\"text\"]', 'admin'); await page.fill('input[type=\"password\"]', 'admin123456'); await page.screenshot({ path: dir + '/step2_filled.png' }); await page.click('button[type=\"submit\"]'); await page.waitForTimeout(2000); await page.screenshot({ path: dir + '/step3_result.png' }); console.log('截图已保存到', dir); await browser.close();"
node run.js "const browser = await chromium.launch({ headless: false }); const page = await browser.newPage(); await page.goto('http://example.com/form'); await page.fill('input[name=\"username\"]', 'testuser'); await page.fill('input[name=\"email\"]', 'test@example.com'); await page.click('button[type=\"submit\"]'); console.log('表单提交完成'); await browser.close();"
返回 JSON 对象,适合程序化处理。
const structure = await helpers.getPageStructure(page);
console.log(JSON.stringify(structure, null, 2));
返回页面所有可见文本。
const text = await helpers.getPageText(page);
console.log(text);
// 可见模式(推荐调试)
const browser = await chromium.launch({ headless: false, slowMo: 100 });
// 无头模式(后台执行)
const browser = await chromium.launch({ headless: true });
await page.goto('http://example.com');
await page.goto('http://example.com', { waitUntil: 'networkidle' });
// 输入文本
await page.fill('input[name="username"]', 'admin');
await page.fill('input[type="password"]', '123456');
// 点击
await page.click('button[type="submit"]');
await page.click('text=登录');
await page.click('.login-btn');
// 等待元素
await page.waitForSelector('.success-message');
await page.waitForURL('**/dashboard');
| 选择器类型 | 示例 |
|---|---|
| CSS | input[name="username"], .login-btn, #submit |
| 文本 | text=登录, button:has-text("提交") |
| 类型 | input[type="text"], input[type="password"] |
| 占位符 | input[placeholder*="账号"], input[placeholder*="密码"] |
const dir = process.env.SCREENSHOT_DIR;
await page.screenshot({ path: `${dir}/screenshot.png` });
await page.screenshot({ path: `${dir}/full.png`, fullPage: true });
await page.waitForTimeout(2000); // 等待2秒
await page.waitForLoadState('networkidle'); // 等待网络空闲
执行一个完整的登录测试:
node run.js "const dir = process.env.SCREENSHOT_DIR; const browser = await chromium.launch({ headless: false, slowMo: 100 }); const page = await browser.newPage(); console.log('步骤1: 打开登录页'); await page.goto('http://192.168.150.114:8913/'); await page.screenshot({ path: dir + '/step1_open.png' }); console.log('步骤2: 输入账号'); await page.fill('input[type=\"text\"]', 'admin'); console.log('步骤3: 输入密码'); await page.fill('input[type=\"password\"]', 'admin123456'); await page.screenshot({ path: dir + '/step2_input.png' }); console.log('步骤4: 点击登录'); await page.click('button[type=\"submit\"]'); await page.waitForTimeout(2000); await page.screenshot({ path: dir + '/step3_result.png' }); console.log('登录结果 - 当前URL:', page.url()); await browser.close(); console.log('测试完成,截图保存在:', dir);"
process.env.SCREENSHOT_DIR 环境变量\"对于需要跨多个步骤保持浏览器打开的场景(如自动化测试用例),使用 session_id 参数:
session_id="case_11"case_11,第二步用 case-11,第三步用 test-case-11(这会创建3个不同的浏览器!)page 变量:无需 chromium.launch(),系统自动管理browser.close():浏览器由系统管理,空闲 15 分钟自动关闭步骤 1:打开页面
execute_skill_script(
skill_name="playwright-skill",
command='node run.js "await page.goto(\'http://example.com\'); console.log(page.url());"',
session_id="test-case-001"
)
步骤 2:填写表单(复用同一浏览器)
execute_skill_script(
skill_name="playwright-skill",
command='node run.js "await page.fill(\'input[name=username]\', \'admin\'); await page.fill(\'input[name=password]\', \'123456\');"',
session_id="test-case-001"
)
步骤 3:点击登录(继续复用)
execute_skill_script(
skill_name="playwright-skill",
command='node run.js "await page.click(\'button[type=submit]\'); await page.waitForTimeout(2000); console.log(\'登录后URL:\', page.url());"',
session_id="test-case-001"
)
| 特性 | 非持久化(无 session_id) | 持久化(有 session_id) |
|---|---|---|
| 浏览器生命周期 | 代码手动管理 | 系统自动管理 |
| 启动方式 | chromium.launch() | 直接使用 page |
| 关闭方式 | browser.close() | 自动关闭(15分钟空闲) |
| 跨步骤状态 | 不保持 | 保持(登录态、cookie等) |
| 适用场景 | 单步操作 | 多步骤测试用例 |
WHartTest测试管理平台工具集。用于管理项目、模块、测试用例、测试截图和项目文件附件的增删改查。当用户需要操作测试用例、查询项目信息、上传截图、上传/下载/预览/删除项目文件、校验 file_ids 或管理文件清理设置时使用。
读取和分析任意在线 URL,包括普通网页、文章、产品/帮助文档、Markdown、JSON/YAML、纯文本、PDF 入口、Swagger/OpenAPI/Redoc 接口文档等。用户提供链接并要求获取页面内容、总结网页、提取标题/正文/链接/结构化数据/接口信息、判断访问状态、分析文档内容,或基于 URL 内容生成代码、测试、说明文档时使用。
基于 agent-browser CLI 的浏览器自动化工具。提供快照获取、元素交互、截图等功能。推荐用于需要页面快照分析、通过 ref 引用交互元素的场景。
WHartTest 接口自动化管理工具。用于管理接口模块、数据库配置、环境与变量、自定义函数、接口调试、测试用例、同步配置、任务套件与执行结果。当需要创建接口自动化资源、调试接口、编排用例、执行测试或排查同步问题时使用。
Generate draw.io diagrams as .drawio files, optionally export to PNG/SVG/PDF with embedded XML
基于微软官方 @playwright/cli 的交互式浏览器自动化技能。通过标准化命令行会话实现极高稳定性的浏览器操作,防止挂起超时。