

在当今的软件开发生态中,浏览器自动化测试已经成为质量保障的关键环节。而随着 AI 编码助手的兴起,如何让这些智能代理更高效地进行浏览器自动化变得尤为重要。Microsoft 推出的 playwright-cli 正是为了解决这一痛点——它是一个专为现代编码代理设计的、令牌高效(token-efficient)的浏览器自动化命令行工具。
本文将深入探讨 playwright-cli 的核心设计理念、实际应用场景,并通过完整的实战案例帮助你快速上手。
在 playwright-cli 出现之前,开发者主要通过以下两种方式进行浏览器自动化:
MCP 方案的核心问题在于:
playwright-cli 采用了完全不同的设计哲学:
核心理念: 令牌高效 (Token Efficiency)
e15, e21),而非完整 DOMsnapshot 命令获取元素引用,而非持续推送页面数据这种设计让 AI 编码代理能够:
适用于现代编码代理的高吞吐量工作流:
适用于需要持久状态和深度检查的专业代理循环:
简而言之: CLI+Skills 更适合"快速执行",MCP 更适合"深度探索"。
# 安装 playwright-cli
npm install -g @playwright/cli@latest
# 验证安装
playwright-cli --help# 打开网页
playwright-cli open https://playwright.dev
# 查看页面快照,获取元素引用
playwright-cli snapshot
# 点击元素(使用快照返回的引用)
playwright-cli click e15
# 输入文本
playwright-cli type "page.click"
# 按键
playwright-cli press Enter
# 截图
playwright-cli screenshotplaywright-cli 的核心创新是其轻量级的元素引用系统:
# 获取页面快照
$ 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 等引用就是你在后续命令中操作元素的"句柄"。
playwright-cli 使用持久化配置文件,这意味着:
# 使用默认会话
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# 默认无头模式(后台运行)
playwright-cli open https://example.com
# 有头模式(显示浏览器窗口)
playwright-cli open https://example.com --headed这是一个完整的端到端测试流程,展示如何使用 playwright-cli 进行功能测试。
目标: 测试 https://demo.playwright.dev/todomvc 的待办事项添加和完成功能
#!/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"测试完成! 所有截图已保存。"关键要点:
snapshot 来获取元素引用场景: 自动填写注册表单并提交
#!/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"表单提交完成!"场景: 在多个标签页中进行比较和数据收集
#!/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"数据收集完成!"场景: 使用 DevTools 功能监控网站性能和网络请求
#!/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 "性能监控完成!"场景: 测试文件上传功能
#!/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 "文件上传测试完成!"# 获取页面标题
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)"# 接受对话框(alert/confirm)
playwright-cli dialog-accept
# 接受对话框并输入文本(prompt)
playwright-cli dialog-accept "My response"
# 拒绝对话框
playwright-cli dialog-dismiss# 移动鼠标到坐标
playwright-cli mousemove 150300
# 鼠标按下(左键)
playwright-cli mousedown
# 鼠标按下(右键)
playwright-cli mousedown right
# 鼠标释放
playwright-cli mouseup
# 鼠标滚轮
playwright-cli mousewheel 0100 # 向下滚动# 按下修饰键
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# 调整窗口大小
playwright-cli resize 19201080
# 调整为移动设备尺寸
playwright-cli resize 375667 # iPhone SE# 不好: 不重新获取快照
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# 不好: 硬编码等待时间
playwright-cli click e5
sleep5 # 不知道需要等待多久
# 好: 使用等待命令
playwright-cli click e5
playwright-cli run-code "await page.waitForLoadState('networkidle')"#!/bin/bash
set-e # 错误时退出
# 设置错误陷阱
trap 'echo "测试失败于第 $LINENO 行"' ERR
playwright-cli open example.com || {
echo"无法打开页面"
exit1
}
playwright-cli snapshot || {
echo"快照失败"
exit1
}# 为不同的测试环境使用不同的会话
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# 创建截图目录
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问题: 页面 DOM 改变后,之前的元素引用失效
解决方案:
# 在重大操作后重新快照
playwright-cli click e5 # 触发页面变化的操作
playwright-cli snapshot # 重新获取元素引用
playwright-cli click e10 # 使用新的引用解决方案:
# 使用 JavaScript 等待元素出现
playwright-cli run-code "await page.waitForSelector('.dynamic-content')"
playwright-cli snapshot解决方案:
# 1. 使用有头模式观察执行过程
playwright-cli open example.com --headed
# 2. 使用追踪功能
playwright-cli tracing-start
# ... 执行操作 ...
playwright-cli tracing-stop
# 3. 检查控制台和网络
playwright-cli console
playwright-cli network解决方案:
# 使用持久化会话保存登录状态
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#!/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 "所有测试完成"# 无头模式(默认)比有头模式快 30-50%
playwright-cli open example.com # 无头,更快
# 仅在调试时使用有头模式
playwright-cli open example.com --headed # 有头,较慢但便于观察# 保存快照到文件,避免重复执行
playwright-cli snapshot --filename=page-snapshot.yaml
# 后续可以直接查看文件而不是重新快照
cat page-snapshot.yaml特性 | playwright-cli | 传统 Playwright |
|---|---|---|
主要用户 | AI 编码代理 | 人类开发者 |
交互方式 | 命令行 | 编程 API |
上下文消耗 | 极低(仅引用) | 不适用 |
学习曲线 | 平缓 | 陡峭 |
灵活性 | 中等 | 很高 |
适用场景 | 快速自动化,AI 驱动 | 复杂测试,完全控制 |
会话管理 | 内置持久化 | 需手动管理 |
#!/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 "冒烟测试通过"#!/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 "竞品分析完成"#!/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"数据验证通过"
fiplaywright-cli 仍在快速发展中,未来可能会看到:
playwright-cli 代表了浏览器自动化的新方向——专为 AI 时代设计的令牌高效工具。它的核心优势在于:
令牌高效: 最小化 AI 代理的上下文消耗简单易用: 直观的命令行界面会话管理: 内置的状态持久化AI 友好: 专为编码代理优化
无论你是在构建 AI 驱动的测试工具,还是希望简化浏览器自动化流程,playwright-cli 都值得一试。它不仅是一个工具,更代表了自动化测试与 AI 结合的未来方向。