手把手15练:从零学会Playwright CLI浏览器自动化

Posted by Corey Blog on April 25, 2026

手把手15练:从零学会Playwright CLI浏览器自动化

全文只有命令和结果,没有废话。打开终端,跟我敲。

作者:Corey 阅读时间:40分钟(含动手时间) 前置要求:电脑能上网,能打开终端


准备工作:5分钟装好环境

在开始任何操作之前,我们需要先把工具装好。跟着下面三步走,不会出错。

第1步:检查Node.js

打开终端(Mac用户找”终端.app”,Windows用户找”PowerShell”),输入:

1
node --version
  • 如果显示 v18.x.x 或更高版本 → 恭喜,继续下一步
  • 如果显示”command not found”或版本低于18 → 去 https://nodejs.org 下载安装LTS版本,装完重启终端

第2步:安装Playwright CLI

在终端输入:

1
npm install -g @playwright/cli@latest

你会看到一堆进度条在跑。等它跑完(大概1-2分钟),输入下面命令验证安装成功:

1
playwright-cli --version

如果显示类似 0.1.8 的版本号 → 安装成功!

第3步:安装浏览器(这一步会自动发生)

当你第一次运行open命令时,Playwright会自动下载所需的浏览器。不用担心,这是正常的。


环境装好了?很好。接下来我们用8个基础练习打牢根基,再用7个综合实战真正上手。


第一部分:8个基础练习——先学会走路

这8个练习是后面所有操作的基础。每个练习不超过2分钟,请一定亲手敲一遍。


练习1:打开浏览器(有头模式 vs 无头模式)

这是你最需要记住的命令。--headed的意思是”有头”——你会看到一个真实的浏览器窗口弹出来。

输入

1
playwright-cli open https://www.baidu.com --headed

你会看到

  • 一个Chrome浏览器窗口自动打开
  • 浏览器自动跳转到百度首页
  • 终端里会输出类似这样的内容:
1
2
3
4
5
### Page
- Page URL: https://www.baidu.com/
- Page Title: 百度一下,你就知道
### Snapshot
[Snapshot](.playwright-cli/page-xxx.yml)

这个练习教会你什么?

  • open是最常用的命令
  • 记住--headed,否则浏览器会在后台偷偷运行,你看不到过程
  • 每次操作后,CLI都会返回当前页面的快照(Snapshot)——这是后面所有交互的关键

如果不加–headed会怎样? 试试看:

1
playwright-cli open https://www.baidu.com

浏览器确实打开了,但你是看不见的。这在自动化脚本中有用,但学习和调试时一定要加--headed


练习2:获取页面快照——看懂”元素身份证”

这是Playwright CLI最核心的概念:每个可交互的元素都有一个唯一的编号(ref),比如e15e23。这就像每个元素都有了一张”身份证”。

先打开一个页面

1
playwright-cli open https://demo.playwright.dev/todomvc --headed

然后获取快照

1
playwright-cli snapshot

你会看到(输出会很长,我只截取关键部分):

1
2
3
4
5
6
7
- main [ref=e1]:
  - heading "todos" [ref=e2]
  - textbox "What needs to be done?" [ref=e3]
  - listbox [ref=e5]:
    - option "Active" [ref=e6]
    - option "Completed" [ref=e7]
    - option "All" [ref=e8]

这个练习教会你什么?

  • snapshot命令输出的是无障碍树(Accessibility Tree),不是HTML源码
  • 每个元素后面的[ref=eX]就是它的”身份证号”
  • 比如文本框的ref是e3,你想在里面打字,就要用这个e3

为什么这比传统自动化强大? 传统方式你要写document.querySelector('#input')这种又臭又长的选择器,现在只需要记住e3


练习3:在输入框里打字(type vs fill)

有两种方式可以在输入框里打字:type(模拟真人逐个字母敲击)和fill(瞬间填满)。我们先用type,因为它更像人。

前提:确保浏览器还在todomvc页面上(如果关了,重新运行练习2的第一条命令)

输入

1
playwright-cli type "买牛奶"

你会看到

  • 浏览器里的文本框出现了”买牛奶”三个字
  • 终端输出新的快照,注意那个文本框的内容变了

用fill试试(效果看起来一样,但背后的机制不同):

1
playwright-cli fill e3 "买面包"

typefill的区别

  • type:模拟键盘敲击,会触发每个按键的事件(适合需要实时校验的场景)
  • fill:直接设置值,一步到位(更快,适合大多数情况)

注意type命令不需要ref参数(它会自动找到当前聚焦的输入框),而fill需要明确指定ref。


练习4:按回车键提交

输入完内容后,怎么提交?按回车。

输入

1
playwright-cli press Enter

你会看到

  • “买牛奶”变成了一条待办事项,出现在列表里
  • 文本框被清空(准备好接收下一条待办)
  • 终端输出更新后的快照,你会看到新出现的待办项

补充一个技巧:你也可以用fill --submit一步完成”填内容+按回车”:

1
playwright-cli fill e3 "买鸡蛋" --submit

效果和分开执行fill+press Enter是一样的,但更简洁。


练习5:勾选复选框(check/uncheck)

现在列表里已经有待办事项了,我们来把它标记为”已完成”。

先获取快照,找到复选框的ref

1
playwright-cli snapshot

你会看到类似这样的输出:

1
2
3
4
5
6
7
- list [ref=e12]:
  - listitem [ref=e13]:
    - checkbox [ref=e14]  # 第一项的复选框,ref=e14
    - text "买牛奶" [ref=e15]
  - listitem [ref=e16]:
    - checkbox [ref=e17]  # 第二项的复选框,ref=e17
    - text "买鸡蛋" [ref=e18]

勾选第一项(假设ref是e14):

1
playwright-cli check e14

你会看到

  • “买牛奶”前面出现了一条删除线(表示已完成)
  • 终端输出快照,复选框的状态变成了[checked]

取消勾选(如果后悔了):

1
playwright-cli uncheck e14

练习6:点击按钮

除了按回车,很多时候你需要点击明确的按钮。

先打开一个带按钮的页面

1
playwright-cli open https://www.sogou.com --headed

获取快照,找搜索按钮

1
playwright-cli snapshot

你会看到搜索按钮的ref,比如e24

点击它

1
playwright-cli click e24

还可以指定鼠标按键

1
2
playwright-cli click e24 right   # 右键点击
playwright-cli click e24 middle  # 中键点击

对于不想记ref的人:你也可以直接用CSS选择器或文本定位:

1
playwright-cli click "button:has-text('搜索')"

练习7:截图和保存PDF

这是最直观的功能——把网页”拍下来”。

先打开一个页面

1
playwright-cli open https://www.baidu.com --headed

截全屏

1
playwright-cli screenshot

截图会保存在当前目录,文件名类似screenshot-2026-04-25T10-30-00.png

指定文件名

1
playwright-cli screenshot --filename=baidu-homepage.png

只截某个元素(比如截取百度Logo):

先获取快照找到Logo的ref,然后:

1
playwright-cli screenshot e5 --filename=logo.png

如果你需要PDF格式

1
playwright-cli pdf --filename=page.pdf

这个功能在做网页存档、竞品监控、测试报告时非常实用。


练习8:标签页管理

很多网站会弹出新标签页,这时候你需要学会在标签页之间切换。

打开一个会开新标签页的网站

1
playwright-cli open https://www.bing.com --headed

查看当前有哪些标签页

1
playwright-cli tab-list

你会看到类似:

1
0: https://www.bing.com/ (Bing)

新建一个标签页

1
playwright-cli tab-new https://www.baidu.com

再次查看标签页列表

1
playwright-cli tab-list

现在应该有两个:

1
2
0: https://www.bing.com/ (Bing)
1: https://www.baidu.com/ (百度一下,你就知道)

切换到标签页0

1
playwright-cli tab-select 0

后续的操作(typeclickscreenshot)都会在选中的标签页上执行。

关闭当前标签页

1
playwright-cli tab-close

8个基础练习做完了。你现在已经掌握了Playwright CLI的核心操作:打开、快照、输入、点击、截图、标签页管理。

接下来,我们用7个综合实战把这些技能组合起来,解决真实问题。


第二部分:7个综合实战——从会用到会用得更溜

实战部分不再是一行命令打天下,而是多步骤组合。请确保你有耐心跟着做,每完成一个,你的自动化能力就上了一个台阶。


实战1:完整的待办事项工作流

把TodoMVC这个Demo网站的所有核心操作串起来:添加→标记完成→删除。

第1步:打开页面

1
playwright-cli open https://demo.playwright.dev/todomvc --headed

第2步:连续添加3条待办

1
2
3
4
5
6
7
8
playwright-cli type "写周报"
playwright-cli press Enter

playwright-cli type "回复邮件"
playwright-cli press Enter

playwright-cli type "买咖啡豆"
playwright-cli press Enter

第3步:查看当前快照,找到复选框ref

1
playwright-cli snapshot

记下第一条待办复选框的ref(比如e14)。

第4步:标记第一条为完成

1
playwright-cli check e14

第5步:删除已完成项(需要找到”Clear completed”按钮):

1
2
3
4
playwright-cli snapshot
# 找到Clear completed按钮的ref,假设是e25

playwright-cli click e25

第6步:截图保存结果

1
playwright-cli screenshot --filename=todo-final.png

完成! 你刚刚完成了一个完整的自动化流程。这6条命令如果写成传统脚本,至少需要20行代码,而现在你只用了自然语言式的命令。


实战2:搜索结果自动化——搜关键词+截图

这个实战模拟了一个常见场景:在搜索引擎里搜索某个关键词,然后保存结果截图。

我们用Bing作为例子(兼容性好,不会频繁弹验证码)。

第1步:打开Bing

1
playwright-cli open https://www.bing.com --headed

第2步:获取快照,找到搜索框的ref

1
playwright-cli snapshot

搜索框通常是第一个textbox,记住它的ref(比如e3)。

第3步:输入关键词

1
playwright-cli fill e3 "Playwright 自动化教程"

第4步:按回车搜索

1
playwright-cli press Enter

第5步:等待结果加载(很重要!)

搜索结果加载需要时间。简单的方法是用screenshot作为”等待点”:

1
playwright-cli screenshot --filename=search-loading.png

第6步:滚动页面,加载更多结果

1
playwright-cli mousewheel 0 500   # 向下滚动500像素

第7步:截取最终结果

1
playwright-cli screenshot --filename=search-results.png

第8步:点击第二页(如果存在”下一页”按钮):

1
2
3
4
playwright-cli snapshot
# 找到"下一页"按钮的ref,比如e42

playwright-cli click e42

延伸思考:这个流程可以包装成一个Shell脚本,每天早上自动搜索”今日热点”,把结果截图发到你的邮箱。


实战3:表单填写与提交——模拟用户注册

很多网站都有表单,填写、勾选同意、提交。我们用GitHub注册页面作为例子(不需要真的提交,练到”提交”那一步就可以停了)。

第1步:打开注册页面

1
playwright-cli open https://github.com/join --headed

第2步:获取快照,识别各输入框

1
playwright-cli snapshot

输出中会包含:textbox "Username"textbox "Email address"textbox "Password",每个都有ref。

第3步:依次填写(假设ref分别是e5、e7、e9):

1
2
3
playwright-cli fill e5 "testuser123"
playwright-cli fill e7 "test@example.com"
playwright-cli fill e9 "Password123!"

第4步:勾选同意条款(可能是checkbox或”Accept”按钮):

1
2
3
4
playwright-cli snapshot
# 找到同意条款的checkbox,假设ref=e15

playwright-cli check e15

第5步:点击提交按钮

1
2
3
4
playwright-cli snapshot
# 找到"Create account"按钮

playwright-cli click e20

你的收获:这个流程展示了处理复杂表单的完整思路:snapshot定位→fill填内容→check勾选→click提交。


实战4:持久化会话——再也不用重复登录了

这是开发者最爱的功能。一次登录,永久有效。

第1步:用–persistent参数打开浏览器

1
playwright-cli open https://github.com/login --headed --persistent

注意:这个命令会创建一个持久化的用户数据目录。以后再打开,登录状态还在。

第2步:手动登录(只需这一次):

在浏览器窗口里输入账号密码,完成登录。可能会遇到验证码,手动过就行。

第3步:关闭浏览器

1
playwright-cli close

第4步:重新打开,见证奇迹

1
playwright-cli open https://github.com --headed --persistent

你会发现自己仍然是登录状态!cookie被保存在磁盘上了。

如果你想彻底清除数据(比如切换账号):

1
playwright-cli delete-data

如果是命名会话(更高级的做法)

1
playwright-cli -s=mywork open https://github.com --persistent

这样不同项目可以用不同的会话,互相隔离。


实战5:监控控制台和网络请求(调试利器)

当自动化脚本不按预期工作时,你需要看浏览器在”想什么”。控制台日志和网络请求是最好的线索。

第1步:打开一个页面

1
playwright-cli open https://www.baidu.com --headed

第2步:查看控制台消息

1
playwright-cli console

你会看到类似JavaScript错误、警告等信息。如果脚本莫名其妙的失败,往往能从console里找到原因。

第3步:查看网络请求

1
playwright-cli network

这个命令会列出页面加载以来的所有网络请求:HTML、CSS、JS、图片、API调用等。输出格式类似:

1
2
3
GET 200 https://www.baidu.com/
GET 200 https://www.baidu.com/style.css
GET 404 https://www.baidu.com/missing.png

你的收获consolenetwork是调试的”照妖镜”。当你说”AI操作失败了”,用这两个命令一看,可能是某个API挂了,或者某个资源404了。


实战6:执行JavaScript(Eval)——解锁无限可能

有时候内置命令不够用,你可以直接执行任意JavaScript代码,就像在浏览器控制台里写代码一样。

第1步:打开页面

1
playwright-cli open https://www.baidu.com --headed

第2步:执行JS获取页面标题

1
playwright-cli eval "document.title"

输出:"百度一下,你就知道"

第3步:滚动到页面底部

1
playwright-cli eval "window.scrollTo(0, document.body.scrollHeight)"

第4步:修改页面内容(仅用于演示):

1
playwright-cli eval "document.querySelector('#su').value = '按钮文字被我改了'"

第5步:获取特定元素的属性

1
playwright-cli eval "document.querySelector('input').getAttribute('placeholder')"

第6步:更复杂的数据提取——获取所有链接:

1
playwright-cli eval "Array.from(document.querySelectorAll('a')).map(a => ({text: a.innerText, href: a.href}))"

输出是一个JSON数组,包含页面上所有链接的文本和URL。

你的收获:当你想提取数据、修改页面、执行复杂逻辑时,eval是你的万能钥匙。再也不用写独立的爬虫脚本了。


实战7:完整的爬虫脚本——抓取Hacker News首页

这是本篇文章的”期末考试”。我们把学到的所有技能串起来,写一个完整的自动化脚本,抓取Hacker News(全球最火的技术新闻网站)首页的10条新闻。

注意:这不是一行命令,而是一个完整的思维流程。你可以逐条输入,也可以把它们写成一个.sh.ps1脚本批量执行。

第1步:打开页面

1
playwright-cli open https://news.ycombinator.com --headed

第2步:获取快照,找到新闻列表结构

1
playwright-cli snapshot

观察输出,你会发现每条新闻的标题和链接都有对应的ref。

第3步:用eval提取所有新闻

1
playwright-cli eval "Array.from(document.querySelectorAll('.titleline > a')).slice(0, 10).map(a => ({title: a.innerText, url: a.href}))"

你会看到一个漂亮的JSON输出,包含10条新闻的标题和链接。

第4步:保存快照以供后续分析

1
playwright-cli snapshot --filename=hackernews-snapshot.yml

第5步:截图留档

1
playwright-cli screenshot --filename=hackernews-homepage.png

第6步:如果需要,把eval结果保存到文件(在终端里用重定向):

1
playwright-cli eval "JSON.stringify(Array.from(document.querySelectorAll('.titleline > a')).slice(0, 10).map(a => ({title: a.innerText, url: a.href})))" > news.json

完成! 你现在手里有了一份新闻数据、一份页面快照、一份截图。如果需要每天定时抓取,把这个流程写进crontab(Mac/Linux)或任务计划程序(Windows),就能实现完全自动化。


写在最后:你已经打败了80%的人

恭喜你完成了全部15个练习。现在回头看看,你掌握了:

✅ 基础:opensnapshottype/fillpressclickcheckscreenshotpdf ✅ 进阶:标签页管理、持久化会话、控制台/网络调试、JavaScript执行 ✅ 实战:待办事项自动化、搜索截图、表单填写、数据爬取

你现在能解决哪些真实问题?

  • 每天早上自动打开邮箱,截图未读邮件
  • 定时监控竞品网站的价格变动
  • 自动填写周报系统并提交
  • 抓取论坛热帖,生成摘要

最后一句真心话:这些命令一开始会觉得多,但当你用过两三次之后,它们就会变成肌肉记忆。以后你再遇到重复的浏览器操作,第一反应不会是”烦死了”,而是”开个CLI自动搞”。

动手试一试,你会发现:以前要用半天写的脚本,现在5分钟就搞定了。


关于Skill和AI Agent集成——那是下一个段位的玩法。先把这15个练熟,我们再聊更高阶的玩法。

有什么问题?欢迎评论区交流。