Token导航 LogoToken导航

Agent Skill · 开发

playwright-skill(Playwright 技能)

用于辅助测试设计、自动化测试、用例整理和回归验证。它适合让 Agent 编写单元测试、端到端测试、测试计划或根据失败日志定位问题。使用时需要确认项目测试框架、运行命令和夹具数据,避免为了通过测试而改坏真实逻辑;涉及浏览器或外部服务时,应区分本地模拟、测试环境和生产环境。

playwright-skill 是开发类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为接触敏感数据;许可证信息还不明确,第三方扫描有未通过项,按安装量在开发类的 21,746 个 Skill 里排第 16,819。

总安装 467周安装 8GitHub Stars 789下载 65核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:playwright-skill(Playwright 技能)
来源仓库:https://github.com/mgdaaslab/wharttest
仓库路径:skills/playwright-skill
安装命令:
npx skills add https://github.com/mgdaaslab/wharttest --skill playwright-skill
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/mgdaaslab/wharttest --skill playwright-skill

这个 Skill 是做什么的

开发类 Skill 面向写代码、改代码和排查问题,一般会读写仓库文件,部分还会执行构建或测试命令。

用于辅助测试设计、自动化测试和回归验证。适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。适合编写单元测试、端到端测试或根据失败日志定位问题。使用时需确认项目测试框架、运行命令和夹具数据。涉及浏览器或外部服务时应区分本地模拟与生产环境。

playwright-skill 属于开发类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/playwright-skill

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/mgdaaslab/wharttest --skill playwright-skill;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

playwright-skill 怎么安装?

在终端执行 npx skills add https://github.com/mgdaaslab/wharttest --skill playwright-skill。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

playwright-skill 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

playwright-skill 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

playwright-skill 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

playwright-skill 用的人多吗?

公开数据是累计安装 467 次,近一周安装 8 次,下载 65 次,GitHub 789 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

playwright-skill 安全吗?

第三方扫描有未通过项,风险较高。除非你确认过源码,否则不建议直接安装到常用环境。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发类任务、又不想每次都手写提示词的人。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
skill-vetter

技能审查员 · OpenClaw

8,779,018986操作浏览器MIT-0通过
ontology

本体论 · OpenClaw

6,636,960576只读MIT-0通过
entra-app-registration

内部应用程序注册 · Codex、Claude

6,631,872764接触敏感数据未明确通过
entra-app-registration

内部应用程序注册 · Codex、Claude

3,757,680201接触敏感数据未明确通过
nano-banana-pro

纳米香蕉专业版 · OpenClaw

3,526,898364接触敏感数据MIT-0有提醒
playwright-skill

Playwright 技能 · 本页

467789接触敏感数据未明确未通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Playwright 浏览器自动化

执行浏览器自动化任务,支持页面测试、表单操作、登录验证等。

⚠️ 强制规则:先获取页面结构,再操作元素

禁止猜测选择器!禁止通过截图识别元素!

打开任何页面后,必须立即调用 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();"

其他 helpers 函数

helpers.getPageStructure(page) - 获取结构化 JSON

返回 JSON 对象,适合程序化处理。

const structure = await helpers.getPageStructure(page);
console.log(JSON.stringify(structure, null, 2));

helpers.getPageText(page) - 获取纯文本内容

返回页面所有可见文本。

const text = await helpers.getPageText(page);
console.log(text);

常用 API

浏览器启动

// 可见模式(推荐调试)
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');

常用选择器

选择器类型示例
CSSinput[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);"

注意事项

  1. 截图路径:必须使用 process.env.SCREENSHOT_DIR 环境变量
  2. 代码格式:inline 代码用分号分隔语句,写在一行内
  3. 引号转义:字符串内的双引号需要转义 \"
  4. browser.close():非持久化模式下执行完毕后务必关闭浏览器
  5. console.log():用于输出执行进度和结果
  6. headless: false:调试时使用可见模式,方便观察

持久化会话模式

对于需要跨多个步骤保持浏览器打开的场景(如自动化测试用例),使用 session_id 参数:

⚠️ 核心规则(必须严格遵守)

  1. session_id 必须完全一致:整个测试流程中所有步骤必须使用完全相同的 session_id 字符串,否则会创建新浏览器导致状态丢失!

- ✅ 正确:所有步骤都用 session_id="case_11" - ❌ 错误:第一步用 case_11,第二步用 case-11,第三步用 test-case-11(这会创建3个不同的浏览器!)

  1. 直接使用 page 变量:无需 chromium.launch(),系统自动管理
  2. 不要调用 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"
)

持久化 vs 非持久化对比

特性非持久化(无 session_id)持久化(有 session_id)
浏览器生命周期代码手动管理系统自动管理
启动方式chromium.launch()直接使用 page
关闭方式browser.close()自动关闭(15分钟空闲)
跨步骤状态不保持保持(登录态、cookie等)
适用场景单步操作多步骤测试用例

平台分布

Codex

37.16%
按下载量换算24

Claude

33.5%
按下载量换算22

Cursor

17.72%
按下载量换算12

Gemini CLI

9.03%
按下载量换算6

安全审计

Gen Agent Trust Hub

未通过

Socket

可疑

Snyk

未通过

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills