介绍
Playwright 是微软开源的跨浏览器自动化测试与网页爬虫工具库,核心目标:统一一套 API,驱动 Chrome、Firefox、Safari(WebKit)三大浏览器内核,实现网页自动化。
诞生背景:团队来自 Puppeteer 核心开发人员,吸取 Puppeteer 仅支持 Chromium 的短板,打造跨浏览器方案,2020 年正式开源。
支持语言:Python、JavaScript/TypeScript、Java、.NET,多语言绑定,底层共用同一套引擎。
区分两个容易混淆名词
- Playwright Library:底层自动化库(用来写爬虫、自定义自动化脚本)
- Playwright Test:基于库封装的端到端测试框架,面向前端 E2E 测试,内置断言、测试运行器、并行执行(日常开发大家使用最多)
底层原理
不基于浏览器原生 WebDriver(Selenium 方案)
Selenium 通过标准 W3C WebDriver 协议,浏览器启动额外服务,通信延迟高、兼容性问题多。
Playwright 使用 Chrome DevTools Protocol (CDP) + WebKit/Firefox 自研协议,直接和浏览器内核通信;浏览器不需要开启远程服务,控制深度更强。自带浏览器二进制包
安装时自动下载对应版本 Chromium、Firefox、WebKit,不需要用户本地提前安装浏览器,环境一致性极强,避免“本地能跑服务器报错”。隔离上下文模型
核心设计概念:Browser(浏览器进程)→BrowserContext(浏览器上下文,相当于独立无痕窗口)→Page(标签页)
一个 BrowserContext 完全隔离:Cookie、本地存储、缓存、网络状态互不干扰。
可以在同一个浏览器进程快速创建上千个隔离会话,资源开销远低于启动多个浏览器进程。
能力特性
1. 跨浏览器、跨平台
- 三大内核:Chromium、Mozilla Firefox、WebKit(Safari 内核),一套脚本无需修改即可在三类浏览器运行
- 跨操作系统:Windows / MacOS / Linux;支持 headless(无头无界面)、有界面模式
- 支持模拟移动端设备:直接模拟 iPhone、安卓手机,自动配置视口、触摸事件、UA、设备像素比,无需手动配置
2. 强大等待机制(最大优势之一,区别于 Selenium)
绝大多数自动化工具需要手动写等待延时 sleep,极其不稳定。
Playwright 默认自动智能等待:
执行点击、输入、获取元素等操作前,自动等待元素满足条件:元素存在、可见、可交互、没有被遮挡。
只有超出超时时间才抛出异常,大幅减少人为硬编码等待,脚本稳定性显著提升。
3. 网络层面控制能力
- 拦截、修改、伪造 HTTP/HTTPS 请求与响应
- 模拟网络限速、断网、弱网环境
- 捕获请求、响应、接口日志,支持抓包导出 HAR 文件
- 支持模拟认证:代理、Basic Auth、Cookie、Token 注入
- 支持路由转发、屏蔽广告、屏蔽无用资源(图片、字体)提升速度
4. 页面操作能力
- 支持鼠标精细操作:悬浮、拖拽、右键、双击、滚轮滑动
- 原生支持触摸手势,适配移动端网页
- 文件上传、文件下载自动化,无需操作系统弹窗交互
- 处理弹窗、对话框、表单、iframe、Shadow DOM(很多自动化工具很难穿透 shadow-dom,Playwright原生支持)
- 支持执行页面 JS,获取页面变量
5. 录制、追踪与调试工具
- Trace Viewer(王牌功能):运行时录制完整追踪包,包含页面快照、网络请求、DOM、操作时序、控制台日志。出现报错后,可以像视频一样回放每一步,定位失败原因。
- 自带脚本录制工具:人工操作浏览器,自动生成自动化脚本模板
- 截图、全屏截图、录屏、元素截图
- 捕获浏览器控制台报错、页面异常
6. 身份会话管理
依靠 BrowserContext 实现快速复用登录状态:
登录一次后,可以保存上下文状态(Cookie、LocalStorage),后续新建页面直接免登录,不用重复走登录流程,非常适合爬虫与测试。
Playwright Library vs Playwright Test 区别
Playwright Library(基础库)
通用自动化库,自由度极高。
✅ 适用:网页爬虫、自定义自动化工具、批量操作网页、数据采集
❌ 没有测试套件、没有断言、没有自动重试、没有并行管理,需要自己封装Playwright Test(E2E测试框架)
在 Library 之上封装的完整测试框架,前端主流 E2E 方案。
✅ 内置测试运行器、自动并行、测试隔离、断言、重试、测试报告、快照测试
✅ 适用:Web项目端到端功能测试(模拟真实用户操作验证系统)
适用场景
Web端端到端自动化测试(最主流)
模拟真实用户操作:登录、表单提交、页面跳转、流程校验,替代人工重复回归测试。轻量级网页数据爬虫
渲染JS动态页面(SPA Vue/React网站),解决requests无法获取异步渲染内容的痛点;相比Selenium资源占用更低。注意:仅用于合法公开数据采集,遵守网站robots协议与法律法规
批量网页自动化任务
批量填报表单、批量导出页面数据、自动生成网页截图、批量生成PDF。网页兼容性自动化验证
同一套脚本,快速验证功能在Chrome/Firefox/Safari、移动端页面是否正常。UI自动化回归、视觉快照测试
对比页面截图,检测页面UI意外变动。
优势
- 稳定性强:智能自动等待,极大降低脚本随机性报错
- 环境省心:自带浏览器二进制,无需环境配置,CI/服务器部署友好
- API统一简洁,跨浏览器一套代码,学习成本低
- 隔离机制优秀,上下文轻量化,支持大规模并发
- 调试工具强大(Trace追踪),线上测试报错方便排查
- 持续更新活跃,微软长期维护,社区成熟
局限性、短板
- 不支持 IE 等老旧浏览器,仅现代三大浏览器内核
- 不能驱动桌面客户端软件(只针对网页,区别于AutoIt、PyAutoGUI)
- Headless模式下少量网站会识别自动化特征,存在反爬检测风险(所有浏览器自动化工具共同问题)
- 如果只需要简单静态网页抓取,相比 requests/axios 更重,资源消耗更高
- 移动端仅能模拟浏览器,无法驱动真实App(App自动化需要 Appium)
运行模式说明
- Headless 无头模式:不弹出浏览器窗口,后台运行。适合服务器、定时任务、CI流水线,占用资源更低。新版默认无头实现性能大幅优化。
- Headful 有界面模式:弹出浏览器窗口,适合开发调试、观察执行流程。
与 Selenium 对比
底层通信机制(最核心分水岭)
Selenium
遵循 W3C WebDriver 标准协议
- 架构:脚本 → HTTP 请求 → WebDriver 驱动(chromedriver/geckodriver)→ 浏览器
- 浏览器与脚本之间依靠独立驱动进程中转,多层转发,存在额外延迟
- 协议通用:任何实现 WebDriver 规范的浏览器都能接入(Chrome、Firefox、Safari、Edge、IE)
- 缺点:协议设计偏通用,无法调用浏览器大量私有高级能力,控制力受限
Playwright
微软自研,不基于 WebDriver
- Chromium 使用 CDP(Chrome DevTools Protocol);Firefox、WebKit 使用官方专属内部协议
- 脚本直接与浏览器内核通信,不需要额外驱动程序,省去 chromedriver 版本匹配难题
- 可以深度操控浏览器内部行为(拦截网络、修改响应、穿透ShadowDOM等)
局限:只支持现代三大内核:Chromium、Firefox、WebKit;不支持 IE
环境部署与兼容性
Selenium
✅ 优点
- 支持 IE、老旧浏览器,政企遗留系统兼容首选
- 语言生态极完善:Java/Python/JS/C#/Ruby/Kotlin 全部成熟
❌ 痛点 - 浏览器驱动版本强绑定:Chrome版本升级,chromedriver必须同步更换,极易出现版本不匹配报错
- 默认不自带浏览器,依赖机器本地已安装浏览器
- CI、服务器环境经常遭遇缺失依赖、显示驱动问题
Playwright
✅ 优点
- 安装框架时自动下载配套浏览器二进制包,独立环境,不依赖本机浏览器
- 不存在驱动版本冲突,零驱动管理
- Windows/macOS/Linux 环境一致性极高,“本地能跑服务器翻车”现象大幅减少
❌ 缺点 - 放弃 IE 支持,老旧项目无法使用
- 不支持小众浏览器
等待机制(稳定性最大差距)
Selenium
没有内置智能等待,只有两种方案:
- 硬休眠
sleep():极其不稳定,网络波动直接失败 - 手动编写显式等待 WebDriverWait,需要开发者自己判断元素条件
- 硬休眠
- 执行点击、输入前,不会自动校验元素是否可见、可点击、是否被遮挡;极易出现偶发“元素不可交互”报错
Playwright
原生自动智能等待(核心优势)
调用 click、fill、select 等操作前,框架自动等待:
元素存在 → 可见 → 启用 → 无遮挡,满足全部条件才执行操作;超时才抛出异常。
绝大多数场景不需要手写等待代码,脚本随机失败率远低于 Selenium。
会话隔离、并发能力
Selenium
- 典型模式:每启动一个浏览器实例 = 独立进程
- 如果需要多账号隔离,通常启动多个浏览器,内存开销大
- 可以通过无痕窗口实现隔离,但API繁琐,隔离完整性一般(缓存、部分数据共享)
Playwright
分层模型:Browser进程 → BrowserContext → Page标签页
- BrowserContext = 轻量化独立会话(独立无痕环境)
同一个浏览器进程可以创建数十上百个隔离上下文,Cookie、Storage、缓存完全隔离。 - 多账号、多用户并发场景,内存占用远低于 Selenium。
网络控制能力
Selenium
原生能力薄弱:
- 标准WebDriver只能简单拦截请求;想要修改响应、伪造接口、屏蔽资源,需要额外搭建代理(BrowserMob Proxy)
- 捕获HAR抓包、弱网模拟实现复杂,需要大量第三方组件
Playwright
原生内置网络拦截器:
- 直接拦截、修改请求体、篡改返回响应、屏蔽图片/JS、模拟弱网限速
- 一键导出HAR日志,无需额外代理工具;爬虫、接口mock场景非常方便
Shadow DOM、Iframe、弹窗处理
Selenium
原生查找元素无法穿透 Shadow DOM,需要复杂JS脚本辅助;
iframe 需要手动切换frame上下文,多层iframe嵌套代码冗长。
Playwright
选择器原生支持穿透 Shadow DOM,内置iframe自动定位;
各类弹窗、文件上传、下载API原生封装,不需要hack方案。
调试工具
Selenium
基础能力:截图。
高级调试需要自行封装日志、录屏;没有官方一体化追踪工具,排查间歇性Bug难度高。
Playwright
王牌功能 Trace Viewer
运行时录制完整回放文件:页面DOM、网络请求、控制台日志、每一步操作时序、截图。出现报错可以像视频一样逐帧回放定位问题。
同时内置录屏、元素截图、控制台捕获等能力。
无头模式(服务器后台运行)
Selenium
传统无头模式兼容性参差不齐,部分网站可以识别;配置参数繁琐。
Playwright
新一代无头模式性能更好,配置极简;同时支持传统无头模式兼容特殊站点。
生态与定位
Selenium
- 诞生更早,行业元老;标准WebDriver方案
- 两大场景占优:遗留系统自动化、需要兼容IE浏览器、大型传统企业成熟测试平台
- 通用自动化标准,大量第三方测试平台、低代码工具底层基于Selenium
Playwright
微软2020年后推出,面向现代Web(SPA、Vue/React前端)
两大核心场景:
- Web端E2E自动化测试(Playwright Test)
- JS渲染页面爬虫、网页自动化任务
更适配现代化前后端分离项目
反爬层面客观对比
两者都属于浏览器自动化,都有可能被网站识别,不存在绝对不会被检测的工具:
- Selenium特征非常典型,各大网站风控系统识别方案成熟
- Playwright新版默认特征相对更少,但高防护站点(Cloudflare、大型电商)依旧可以识别;都需要额外指纹优化
优缺点汇总简表
| 维度 | Selenium | Playwright |
|---|---|---|
| 通信协议 | W3C WebDriver,独立驱动进程 | CDP/浏览器私有协议,无额外驱动 |
| 浏览器支持 | Chrome/Firefox/Safari/Edge/IE | Chromium/Firefox/WebKit(无IE) |
| 等待策略 | 需手动编写等待,容易不稳定 | 内置智能自动等待,稳定性更高 |
| 环境管理 | 需要手动匹配驱动版本 | 自带浏览器二进制,无需驱动 |
| 会话隔离 | 多浏览器进程,资源开销高 | 轻量化BrowserContext,并发友好 |
| 网络操作 | 依赖外部代理实现拦截 | 原生支持请求拦截、修改响应 |
| ShadowDOM | 原生不支持 | 原生支持穿透查询 |
| 调试工具 | 仅基础截图,无官方追踪回放 | Trace完整录制回放,调试体验优秀 |
| 上手门槛 | 基础API简单,稳定脚本封装成本高 | API设计统一,写出稳定脚本更容易 |
选型建议(重点)
✅ 优先选择 Selenium
- 项目需要兼容 IE、老旧浏览器
- 公司现有自动化平台、测试系统底层基于WebDriver,不能重构
- 团队有大量成熟Selenium脚本资产,迁移成本极高
✅ 优先选择 Playwright
- 现代Web项目(Vue/React SPA)E2E测试
- 动态渲染网页爬虫、批量网页自动化
- 需要多账号并发隔离、服务器CI持续集成
- 不想处理浏览器驱动版本冲突问题
- 追求脚本稳定性,减少随机报错
- 需要频繁拦截网络、Mock接口、定位偶现BUG