首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Playwright CLI + Skills 打造的高效浏览器自动化工具

Playwright CLI + Skills 打造的高效浏览器自动化工具

作者头像
AI智享空间
发布2026-02-27 11:53:30
发布2026-02-27 11:53:30
6280
举报

在当今的软件开发生态中,浏览器自动化测试已经成为质量保障的关键环节。而随着 AI 编码助手的兴起,如何让这些智能代理更高效地进行浏览器自动化变得尤为重要。Microsoft 推出的 playwright-cli 正是为了解决这一痛点——它是一个专为现代编码代理设计的、令牌高效(token-efficient)的浏览器自动化命令行工具。

本文将深入探讨 playwright-cli 的核心设计理念、实际应用场景,并通过完整的实战案例帮助你快速上手。


一、为什么需要 playwright-cli?

1.1 传统方案的痛点

在 playwright-cli 出现之前,开发者主要通过以下两种方式进行浏览器自动化:

  1. 传统 Playwright Test CLI: 功能强大但主要面向人工编写的测试脚本
  2. Playwright MCP (Model Context Protocol): 为 AI 代理提供浏览器控制能力,但存在严重的令牌消耗问题

MCP 方案的核心问题在于:

  • 海量上下文传输: 每次交互都会将完整的 DOM 树、可访问性树推送到模型上下文中
  • 令牌窗口快速耗尽: 几次交互后,AI 代理的上下文窗口就会被大量元数据占满
  • 效率低下: 宝贵的令牌资源被浪费在传输页面结构上,而非推理和代码生成

1.2 playwright-cli 的创新之处

playwright-cli 采用了完全不同的设计哲学:

核心理念: 令牌高效 (Token Efficiency)

  • 最小化数据传输: 只返回必要的元素引用(如 e15, e21),而非完整 DOM
  • 外部状态管理: 浏览器状态保持在外部,只交换结构化的最小信息
  • 按需快照: 通过 snapshot 命令获取元素引用,而非持续推送页面数据

这种设计让 AI 编码代理能够:

  • 运行更长的浏览器会话而不丢失上下文
  • 将更多令牌分配给推理和代码,而非 UI 元数据
  • 在有限的上下文窗口内处理复杂的自动化任务

二、playwright-cli vs MCP: 何时选择哪个?

2.1 选择 CLI + Skills 的场景

适用于现代编码代理的高吞吐量工作流:

  • 需要平衡浏览器自动化与大型代码库、测试用例
  • 在有限的上下文窗口内进行复杂推理
  • 快速迭代的 Web 应用测试
  • 自动化表单填写、数据提取
  • 简单的 Web 爬虫和数据采集

2.2 选择 MCP 的场景

适用于需要持久状态和深度检查的专业代理循环:

  • 探索性自动化工作流
  • 自修复测试(需要对页面结构进行迭代推理)
  • 长期运行的自主工作流
  • 需要维护连续浏览器上下文的场景

简而言之: CLI+Skills 更适合"快速执行",MCP 更适合"深度探索"。

三、快速开始

3.1 安装

代码语言:javascript
复制
# 安装 playwright-cli
npm install -g @playwright/cli@latest

# 验证安装
playwright-cli --help

3.2 基础用法

代码语言:javascript
复制
# 打开网页
playwright-cli open https://playwright.dev

# 查看页面快照,获取元素引用
playwright-cli snapshot

# 点击元素(使用快照返回的引用)
playwright-cli click e15

# 输入文本
playwright-cli type "page.click"

# 按键
playwright-cli press Enter

# 截图
playwright-cli screenshot

四、核心概念

4.1 元素引用系统

playwright-cli 的核心创新是其轻量级的元素引用系统:

代码语言:javascript
复制
# 获取页面快照
$ playwright-cli snapshot

# 输出示例:
# e1: <input type="text" placeholder="Search...">
# e2: <button class="search-btn">Search</button>
# e3: <a href="/docs">Documentation</a>
# ...

这些 e1, e2, e3 等引用就是你在后续命令中操作元素的"句柄"。

4.2 会话管理

playwright-cli 使用持久化配置文件,这意味着:

  • Cookie 和存储状态在调用之间保持
  • 可以为不同项目使用不同的浏览器实例
代码语言:javascript
复制
# 使用默认会话
playwright-cli open https://example.com

# 使用命名会话
playwright-cli --session=myproject open https://example.com
playwright-cli --session=myproject click e5

# 列出所有会话
playwright-cli session-list

# 停止会话
playwright-cli session-stop myproject

# 删除会话(包括配置文件)
playwright-cli session-delete myproject

4.3 有头/无头模式

代码语言:javascript
复制
# 默认无头模式(后台运行)
playwright-cli open https://example.com

# 有头模式(显示浏览器窗口)
playwright-cli open https://example.com --headed

五、完整实战案例

案例 1: 自动化 TodoMVC 应用测试

这是一个完整的端到端测试流程,展示如何使用 playwright-cli 进行功能测试。

目标: 测试 https://demo.playwright.dev/todomvc 的待办事项添加和完成功能

代码语言:javascript
复制
#!/bin/bash
# todo-test.sh - 自动化测试 TodoMVC 应用

set-e  # 遇到错误立即退出

echo"开始测试 TodoMVC 应用..."

# 1. 打开应用(有头模式便于观察)
echo"打开 TodoMVC 应用..."
playwright-cli open https://demo.playwright.dev/todomvc/ --headed

# 等待页面加载
sleep2

# 2. 添加第一个待办事项
echo"添加第一个待办事项: Buy groceries"
playwright-cli type "Buy groceries"
playwright-cli press Enter

# 3. 添加第二个待办事项
echo"添加第二个待办事项: Water flowers"
playwright-cli type "Water flowers"
playwright-cli press Enter

# 4. 添加第三个待办事项
echo"添加第三个待办事项: Write blog post"
playwright-cli type "Write blog post"
playwright-cli press Enter

# 5. 查看当前页面状态
echo"获取页面快照..."
playwright-cli snapshot

# 6. 完成第一个和第三个任务
# 注意: 你需要根据实际的 snapshot 输出调整元素引用
echo"标记任务为完成..."
playwright-cli check e21  # 第一个待办事项的复选框
playwright-cli check e35  # 第三个待办事项的复选框

# 7. 截图保存结果
echo"保存截图..."
playwright-cli screenshot --filename=todo-completed.png

# 8. 验证剩余任务数
echo"验证剩余任务..."
playwright-cli eval "document.querySelector('.todo-count').textContent"

# 9. 测试过滤功能
echo"测试 Active 过滤..."
playwright-cli click e40  # Active 过滤器

playwright-cli screenshot --filename=todo-active.png

echo"测试 Completed 过滤..."
playwright-cli click e41  # Completed 过滤器

playwright-cli screenshot --filename=todo-completed-filter.png

# 10. 清除已完成的任务
echo"清除已完成的任务..."
playwright-cli click e42  # Clear completed 按钮

# 11. 最终截图
playwright-cli screenshot --filename=todo-final.png

echo"测试完成! 所有截图已保存。"

关键要点:

  1. 快照是关键: 在交互前先运行 snapshot 来获取元素引用
  2. 元素引用会变化: DOM 变化后,元素引用可能改变,需要重新快照
  3. 截图验证: 使用截图作为测试证据,便于后续验证

案例 2: 自动化表单填写和提交

场景: 自动填写注册表单并提交

代码语言:javascript
复制
#!/bin/bash
# form-automation.sh - 自动化表单填写

echo"打开注册页面..."
playwright-cli open https://example.com/signup --headed

# 等待页面加载
sleep1

# 获取表单元素引用
echo"获取表单元素..."
playwright-cli snapshot

# 填写表单字段
echo"填写表单..."

# 姓名字段
playwright-cli fill e5 "张三"

# 邮箱字段
playwright-cli fill e7 "zhangsan@example.com"

# 密码字段
playwright-cli fill e9 "SecureP@ssw0rd"

# 确认密码
playwright-cli fill e11 "SecureP@ssw0rd"

# 选择国家(下拉框)
playwright-cli select e13 "China"

# 同意条款(复选框)
playwright-cli check e15

# 截图确认
playwright-cli screenshot --filename=form-filled.png

# 提交表单
echo"提交表单..."
playwright-cli click e17  # 提交按钮

# 等待提交完成
sleep2

# 验证成功消息
playwright-cli snapshot
playwright-cli screenshot --filename=form-submitted.png

echo"表单提交完成!"

案例 3: 多标签页工作流

场景: 在多个标签页中进行比较和数据收集

代码语言:javascript
复制
#!/bin/bash
# multi-tab-workflow.sh - 多标签页数据收集

echo"启动多标签页数据收集..."

# 打开第一个页面
playwright-cli open https://github.com/microsoft/playwright

# 提取第一个页面的数据
playwright-cli snapshot
STARS_1=$(playwright-cli eval "document.querySelector('.Counter').textContent")
echo"Playwright Stars: $STARS_1"

# 打开新标签页
playwright-cli tab-new https://github.com/puppeteer/puppeteer

# 切换到新标签页
playwright-cli tab-select 1

# 提取第二个页面的数据
playwright-cli snapshot
STARS_2=$(playwright-cli eval "document.querySelector('.Counter').textContent")
echo"Puppeteer Stars: $STARS_2"

# 再打开一个标签页
playwright-cli tab-new https://github.com/cypress-io/cypress
playwright-cli tab-select 2

STARS_3=$(playwright-cli eval "document.querySelector('.Counter').textContent")
echo"Cypress Stars: $STARS_3"

# 列出所有标签页
playwright-cli tab-list

# 截图保存
playwright-cli tab-select 0
playwright-cli screenshot --filename=playwright-repo.png

playwright-cli tab-select 1
playwright-cli screenshot --filename=puppeteer-repo.png

playwright-cli tab-select 2
playwright-cli screenshot --filename=cypress-repo.png

# 关闭不需要的标签页
playwright-cli tab-close 1
playwright-cli tab-close 2

echo"数据收集完成!"

案例 4: 网站性能监控

场景: 使用 DevTools 功能监控网站性能和网络请求

代码语言:javascript
复制
#!/bin/bash
# performance-monitor.sh - 网站性能监控

echo "开始性能监控..."

# 启动追踪
playwright-cli tracing-start

# 打开目标网站
playwright-cli open https://example.com --headed

# 执行一系列操作
playwright-cli click e5
playwright-cli fill e7 "search term"
playwright-cli press Enter

# 等待加载
sleep 3

# 停止追踪
playwright-cli tracing-stop

echo "追踪文件已保存"

# 检查控制台日志
echo "📝 检查控制台输出..."
playwright-cli console

# 检查网络请求
echo "检查网络请求..."
playwright-cli network

# 截图当前状态
playwright-cli screenshot --filename=performance-test.png

echo "性能监控完成!"

案例 5: 文件上传测试

场景: 测试文件上传功能

代码语言:javascript
复制
#!/bin/bash
# upload-test.sh - 文件上传测试

echo "测试文件上传功能..."

# 创建测试文件
echo "Creating test file..."
echo "This is a test document" > /tmp/test-upload.txt

# 打开上传页面
playwright-cli open https://example.com/upload --headed

# 获取元素引用
playwright-cli snapshot

# 上传文件
echo "📎 上传文件..."
playwright-cli upload /tmp/test-upload.txt

# 等待上传完成
sleep 2

# 点击提交按钮
playwright-cli click e9

# 验证上传成功
sleep 2
playwright-cli snapshot
playwright-cli screenshot --filename=upload-success.png

# 清理测试文件
rm /tmp/test-upload.txt

echo "文件上传测试完成!"

六、高级技巧

6.1 调试技巧

代码语言:javascript
复制
# 获取页面标题
playwright-cli eval "document.title"

# 获取特定元素的文本内容
playwright-cli eval "el => el.textContent" e5

# 获取元素的属性
playwright-cli eval "el => el.getAttribute('href')" e8

# 运行任意 JavaScript
playwright-cli run-code "await page.waitForTimeout(1000)"

6.2 处理对话框

代码语言:javascript
复制
# 接受对话框(alert/confirm)
playwright-cli dialog-accept

# 接受对话框并输入文本(prompt)
playwright-cli dialog-accept "My response"

# 拒绝对话框
playwright-cli dialog-dismiss

6.3 鼠标操作

代码语言:javascript
复制
# 移动鼠标到坐标
playwright-cli mousemove 150300

# 鼠标按下(左键)
playwright-cli mousedown

# 鼠标按下(右键)
playwright-cli mousedown right

# 鼠标释放
playwright-cli mouseup

# 鼠标滚轮
playwright-cli mousewheel 0100  # 向下滚动

6.4 键盘操作

代码语言:javascript
复制
# 按下修饰键
playwright-cli keydown Shift
playwright-cli keydown Control

# 释放修饰键
playwright-cli keyup Shift

# 组合键(先按下修饰键,再按其他键)
playwright-cli keydown Control
playwright-cli press c  # Ctrl+C
playwright-cli keyup Control

6.5 视口和窗口

代码语言:javascript
复制
# 调整窗口大小
playwright-cli resize 19201080

# 调整为移动设备尺寸
playwright-cli resize 375667  # iPhone SE

七、最佳实践

7.1 快照策略

代码语言:javascript
复制
# 不好: 不重新获取快照
playwright-cli open example.com
playwright-cli click e5
playwright-cli click e10  # DOM 可能已改变,e10 可能失效

# 好: 重大变化后重新快照
playwright-cli open example.com
playwright-cli snapshot
playwright-cli click e5
playwright-cli snapshot  # 页面改变后重新快照
playwright-cli click e10

7.2 等待策略

代码语言:javascript
复制
# 不好: 硬编码等待时间
playwright-cli click e5
sleep5  # 不知道需要等待多久

# 好: 使用等待命令
playwright-cli click e5
playwright-cli run-code "await page.waitForLoadState('networkidle')"

7.3 错误处理

代码语言:javascript
复制
#!/bin/bash
set-e  # 错误时退出

# 设置错误陷阱
trap 'echo "测试失败于第 $LINENO 行"' ERR

playwright-cli open example.com || {
  echo"无法打开页面"
  exit1
}

playwright-cli snapshot || {
  echo"快照失败"
  exit1
}

7.4 会话隔离

代码语言:javascript
复制
# 为不同的测试环境使用不同的会话
playwright-cli --session=dev open https://dev.example.com
playwright-cli --session=staging open https://staging.example.com
playwright-cli --session=prod open https://example.com

# 列出所有活动会话
playwright-cli session-list

7.5 截图管理

代码语言:javascript
复制
# 创建截图目录
mkdir -p screenshots/$(date +%Y-%m-%d)

# 使用时间戳命名截图
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
playwright-cli screenshot --filename=screenshots/$(date +%Y-%m-%d)/test_${TIMESTAMP}.png

八、常见问题与解决方案

Q1: 元素引用过期怎么办?

问题: 页面 DOM 改变后,之前的元素引用失效

解决方案:

代码语言:javascript
复制
# 在重大操作后重新快照
playwright-cli click e5  # 触发页面变化的操作
playwright-cli snapshot  # 重新获取元素引用
playwright-cli click e10 # 使用新的引用

Q2: 如何处理动态加载的内容?

解决方案:

代码语言:javascript
复制
# 使用 JavaScript 等待元素出现
playwright-cli run-code "await page.waitForSelector('.dynamic-content')"
playwright-cli snapshot

Q3: 如何调试脚本?

解决方案:

代码语言:javascript
复制
# 1. 使用有头模式观察执行过程
playwright-cli open example.com --headed

# 2. 使用追踪功能
playwright-cli tracing-start
# ... 执行操作 ...
playwright-cli tracing-stop

# 3. 检查控制台和网络
playwright-cli console
playwright-cli network

Q4: 如何处理认证?

解决方案:

代码语言:javascript
复制
# 使用持久化会话保存登录状态
playwright-cli --session=authenticated open https://app.example.com
# 首次登录
playwright-cli fill e5 "username"
playwright-cli fill e7 "password"
playwright-cli click e9

# 后续使用相同会话,无需重新登录
playwright-cli --session=authenticated open https://app.example.com/dashboard

九、性能优化

9.1 并行执行

代码语言:javascript
复制
#!/bin/bash
# parallel-tests.sh - 并行执行多个测试

# 启动多个会话并行测试
playwright-cli --session=test1 open example.com &
playwright-cli --session=test2 open example.com &
playwright-cli --session=test3 open example.com &

wait  # 等待所有后台任务完成

echo "所有测试完成"

9.2 无头模式提速

代码语言:javascript
复制
# 无头模式(默认)比有头模式快 30-50%
playwright-cli open example.com  # 无头,更快

# 仅在调试时使用有头模式
playwright-cli open example.com --headed  # 有头,较慢但便于观察

9.3 快照缓存策略

代码语言:javascript
复制
# 保存快照到文件,避免重复执行
playwright-cli snapshot --filename=page-snapshot.yaml

# 后续可以直接查看文件而不是重新快照
cat page-snapshot.yaml

十、与传统 Playwright 的对比

特性

playwright-cli

传统 Playwright

主要用户

AI 编码代理

人类开发者

交互方式

命令行

编程 API

上下文消耗

极低(仅引用)

不适用

学习曲线

平缓

陡峭

灵活性

中等

很高

适用场景

快速自动化,AI 驱动

复杂测试,完全控制

会话管理

内置持久化

需手动管理

十一、实际应用场景

场景 1: CI/CD 中的冒烟测试

代码语言:javascript
复制
#!/bin/bash
# smoke-test.sh - 快速冒烟测试

echo "执行冒烟测试..."

# 测试首页
playwright-cli open https://production.example.com
playwright-cli screenshot --filename=screenshots/homepage.png

# 测试登录
playwright-cli click e5  # 登录按钮
playwright-cli fill e7 "$TEST_USER"
playwright-cli fill e9 "$TEST_PASSWORD"
playwright-cli click e11
sleep 2
playwright-cli screenshot --filename=screenshots/dashboard.png

# 测试关键功能
playwright-cli click e15  # 导航到核心功能
playwright-cli snapshot
playwright-cli screenshot --filename=screenshots/core-feature.png

echo "冒烟测试通过"

场景 2: 竞品分析

代码语言:javascript
复制
#!/bin/bash
# competitor-analysis.sh - 竞品页面分析

COMPETITORS=(
  "https://competitor1.com"
  "https://competitor2.com"
  "https://competitor3.com"
)

for site in "${COMPETITORS[@]}"; do
  SESSION=$(echo $site | sed 's/https:\/\///' | sed 's/\.com//')

  echo "分析 $site..."
  playwright-cli --session=$SESSION open $site
  playwright-cli screenshot --filename=screenshots/${SESSION}.png

  # 提取价格信息
  playwright-cli eval "document.querySelector('.price').textContent" > data/${SESSION}_price.txt

  # 提取特性列表
  playwright-cli eval "Array.from(document.querySelectorAll('.features li')).map(li => li.textContent)" > data/${SESSION}_features.json
done

echo "竞品分析完成"

场景 3: 数据验证

代码语言:javascript
复制
#!/bin/bash
# data-validation.sh - 验证生产环境数据

echo"验证生产数据..."

playwright-cli open https://admin.example.com
playwright-cli fill e5 "$ADMIN_USER"
playwright-cli fill e7 "$ADMIN_PASSWORD"
playwright-cli click e9

# 导航到数据页面
playwright-cli click e12

# 提取表格数据
DATA=$(playwright-cli eval "Array.from(document.querySelectorAll('table tr')).map(tr => Array.from(tr.querySelectorAll('td')).map(td => td.textContent))")

# 验证数据完整性
echo"$DATA" | jq '.[] | select(.[2] == null)' > missing-data.json

if [ -s missing-data.json ]; then
  echo"发现缺失数据"
  cat missing-data.json
  exit1
else
  echo"数据验证通过"
fi

十二、未来展望

playwright-cli 仍在快速发展中,未来可能会看到:

  1. 更多浏览器支持: 目前主要支持 Chromium,未来可能扩展到 Firefox 和 WebKit
  2. 增强的元素选择: 更智能的元素识别和引用系统
  3. 视觉回归测试: 内置的视觉对比功能
  4. 性能分析: 更深入的性能监控工具
  5. 移动设备模拟: 更好的移动端测试支持

总结

playwright-cli 代表了浏览器自动化的新方向——专为 AI 时代设计的令牌高效工具。它的核心优势在于:

令牌高效: 最小化 AI 代理的上下文消耗简单易用: 直观的命令行界面会话管理: 内置的状态持久化AI 友好: 专为编码代理优化

无论你是在构建 AI 驱动的测试工具,还是希望简化浏览器自动化流程,playwright-cli 都值得一试。它不仅是一个工具,更代表了自动化测试与 AI 结合的未来方向。

代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI智享空间 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为什么需要 playwright-cli?
    • 1.1 传统方案的痛点
    • 1.2 playwright-cli 的创新之处
  • 二、playwright-cli vs MCP: 何时选择哪个?
    • 2.1 选择 CLI + Skills 的场景
    • 2.2 选择 MCP 的场景
  • 三、快速开始
    • 3.1 安装
    • 3.2 基础用法
  • 四、核心概念
    • 4.1 元素引用系统
    • 4.2 会话管理
    • 4.3 有头/无头模式
  • 五、完整实战案例
    • 案例 1: 自动化 TodoMVC 应用测试
    • 案例 2: 自动化表单填写和提交
    • 案例 3: 多标签页工作流
    • 案例 4: 网站性能监控
    • 案例 5: 文件上传测试
  • 六、高级技巧
    • 6.1 调试技巧
    • 6.2 处理对话框
    • 6.3 鼠标操作
    • 6.4 键盘操作
    • 6.5 视口和窗口
  • 七、最佳实践
    • 7.1 快照策略
    • 7.2 等待策略
    • 7.3 错误处理
    • 7.4 会话隔离
    • 7.5 截图管理
  • 八、常见问题与解决方案
    • Q1: 元素引用过期怎么办?
    • Q2: 如何处理动态加载的内容?
    • Q3: 如何调试脚本?
    • Q4: 如何处理认证?
  • 九、性能优化
    • 9.1 并行执行
    • 9.2 无头模式提速
    • 9.3 快照缓存策略
  • 十、与传统 Playwright 的对比
  • 十一、实际应用场景
    • 场景 1: CI/CD 中的冒烟测试
    • 场景 2: 竞品分析
    • 场景 3: 数据验证
  • 十二、未来展望
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档