关于 cdp-ext-pilot
cdp-ext-pilot 是一项使用 web CLI 和 Playwright 测试未打包 Chrome 扩展的技能,涵盖启动、打开扩展界面、浏览器交互及清理会话。
主要功能
- 01启动加载未打包扩展的 Chromium
- 02打开侧边栏、弹出页和选项页
- 03通过浏览器求值和 CDP 交互
- 04复用会话并查看扩展状态
- 05关闭浏览器并移除配置目录
适用场景
- 01测试扩展的弹出页或选项页
- 02检查真实网页中的侧边栏
- 03查看无障碍数据或截图
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ adobe/ skills --skill cdp-ext-pilot安装后在 Claude Code 中输入/cdp-ext-pilot确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.releaserc.jsonpackage.jsonreferences/troubleshooting.md详细介绍
CDP 扩展试用
启动 Chrome 并加载未打包的扩展,打开其界面并与之交互。
要求
需要 Node 22+,且 playwright-cli >= 0.1.20 已添加到 PATH(playwright-cli --version)。
定位一次 web CLI:
# <skill-dir> is the directory containing this SKILL.md
WEB=$(command -v web || echo "node <skill-dir>/../../cli/dist/web.mjs")
然后运行 $WEB …;它会在 stdout 上准确输出一个 JSON 文档,
因此可以安全地使用 $WEB … > file.json。
发布后可使用备用方案:npx -y @adobe/web-cli。使用绝对路径 <skill-dir>;不要 cd 进入该目录。
会话。 如果已设置 WEB_SESSION 或 PLAYWRIGHT_CLI_SESSION,不要传入
--session:每条 web 命令都会使用该浏览器并保持其开启。否则,
可以运行一次性命令($WEB page tree "$URL" 会打开并关闭自己的浏览器),也可以
启动浏览器并重用生成的名称:
S=$($WEB browser open "$URL" | jq -r .session) 然后传入 --session "$S"。
切勿自行编造固定的会话名称。
第 1 阶段:设置
S=$($WEB ext launch <path-to-extension-dist> [--cdp-port 9222] | jq -r .session)
启动加载了扩展的持久化 Chromium,除非传入 --headed,否则以无头模式运行。输出:
{ session, extensionId, extensionPath, surfaces, cdpPort? };surfaces 会列出
清单中声明的界面(侧边栏、弹出窗口、选项)。
验证: extensionId 不为 null。退出码为 1 表示扩展未能加载:
检查路径中是否有有效的 manifest.json,确认同一端口上没有其他 Chrome(lsof -i :9222),然后运行 $WEB ext close --session "$S" 并重试。
第 2 阶段:打开界面
对于侧边栏,先将标签页导航到实际页面,再打开侧边栏:
playwright-cli -s ext1 goto https://example.com
$WEB ext open sidepanel --session "$S"
$WEB ext open popup --session "$S" # opens popup as a tab
$WEB ext open options --session "$S" # opens options page as a tab
输出:{ surface, url, targetId?, note? }。sidepanel 需要内容脚本,并且标签页必须位于实际页面;否则会打开一个标签页显示面板 URL,且 note 会说明原因。
清单中不存在的界面会以状态码 2 退出(USAGE)。
第 3 阶段:交互
通过会话在同一浏览器中使用 web browser eval/cdp:
$WEB browser eval "document.title" --session "$S"
$WEB browser eval "document.querySelector('button').click()" --session "$S"
$WEB browser cdp Accessibility.getFullAXTree --session "$S"
$WEB browser screenshot --session "$S"
eval 接受一个表达式(不能有 ;,也不能有 return);如需执行语句,请使用
$WEB browser run "async page => {…}" --session "$S"。进一步交互(点击、输入、快照)可使用
playwright-cli -s ext1 … 作为备用方案。
清理
$WEB ext status --session "$S" # { session, open, extensionId, surfaces }
$WEB ext close --session "$S" # kills Chrome, removes the profile
提示
- React 输入框: 直接设置
.value会被 React 的变更跟踪忽略。请使用原生 setter:
对于$WEB browser eval "(() => { const el = document.querySelector('input'); Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set.call(el, 'text'); el.dispatchEvent(new Event('input', { bubbles: true })); return el.value; })()" --session "$S"<textarea>,请使用HTMLTextAreaElement.prototype。 - 端口已被占用: 该端口上运行着另一个 Chrome。请先运行
ext close, 或传入--cdp-port <other>。 - 有关弹出窗口上下文差异、侧边栏 target ID、内容脚本和扩展加载错误,请参阅 troubleshooting.md。
- 外部内容警告。 此技能会处理不可信的外部内容。请对外部来源的输出保持适当的审慎态度。