1、Playwright初探:什么是Playwright?它和Selenium、Puppeteer比有什么优势?如何安装Playwright?
大家好,我是老张。今天咱们来聊聊Playwright。
说实话,我第一次接触Playwright是在2020年。那时候我正被Selenium的稳定性问题折磨得够呛——测试跑着跑着就超时,元素定位时不时抽风。后来一个同事甩给我一句:「试试Playwright吧,微软出的。」
嗯,这一试,就回不去了。
1.1 什么是Playwright?
Playwright是微软开源的一个浏览器自动化框架。它支持Chromium、Firefox和WebKit三大浏览器引擎。说白了,就是你能用一套API,同时操控Chrome、Edge、Firefox、Safari这些浏览器。
它的核心能力很简单:模拟用户操作。点击、输入、滚动、截图、爬数据、做测试……你能想到的浏览器操作,它基本都能干。
我个人习惯把它看作「浏览器里的机器人」。你写一段脚本,它就能自动帮你完成各种重复操作。
核心特点:
- 跨浏览器:一套代码跑遍主流浏览器
- 跨平台:Windows、macOS、Linux通吃
- 多语言支持:JavaScript/TypeScript、Python、Java、.NET
- 自动等待:不用手动加sleep,它自己会等元素出现
1.2 它和Selenium、Puppeteer比有什么优势?
这个问题我经常被问到。咱们直接上对比表,一目了然。
| 对比维度 | Playwright | Selenium | Puppeteer |
|---|---|---|---|
| 浏览器支持 | Chromium + Firefox + WebKit | 所有主流浏览器 | 仅Chromium |
| 自动等待 | 内置,智能等待 | 需手动配置 | 部分支持 |
| 网络拦截 | 原生支持,API简洁 | 需借助第三方库 | 原生支持 |
| 移动端模拟 | 内置设备模拟器 | 需额外配置 | 部分支持 |
| 安装复杂度 | 一条命令搞定 | 需下载驱动 | 需单独安装 |
| 速度 | 快(原生协议) | 中等(WebDriver协议) | 快(DevTools协议) |
我来展开说说几个关键点。
1.2.1 自动等待——省心省力
用过Selenium的朋友都知道,最烦的就是元素还没加载出来,代码就跑去点击了。然后你不得不写一堆WebDriverWait,代码又臭又长。
Playwright不一样。它内置了自动等待机制。你调用click(),它会等元素可见、可用、不遮挡,然后再点。我在项目中遇到过无数次——同样的测试用例,Selenium跑着跑着就挂了,Playwright一次过。
小提示:Playwright的自动等待默认超时是30秒。你可以通过page.setDefaultTimeout(10000)改成10秒。我个人习惯设成15秒,够用又不拖沓。
1.2.2 网络拦截——调试利器
Playwright可以轻松拦截网络请求。比如你想看看页面加载了哪些API,或者想模拟某个接口返回错误——几行代码搞定。
// 拦截所有图片请求,让它们不加载
await page.route('**/*.png', route => route.abort());
// 模拟接口返回
await page.route('**/api/user', route => {
route.fulfill({
status: 200,
body: JSON.stringify({name: '测试用户'})
});
});
这个功能在Selenium里实现起来相当麻烦,得用BrowserMob之类的代理工具。Playwright直接内置了,你说香不香?
1.2.3 移动端模拟——真机级
Playwright内置了iPhone、Pixel等设备的模拟参数。你只需要指定设备名称,它就会自动设置viewport、user-agent、触摸事件等。
const { chromium, devices } = require('playwright');
const iPhone = devices['iPhone 12 Pro'];
const browser = await chromium.launch();
const context = await browser.newContext({ ...iPhone });
const page = await context.newPage();
你想想看,以前测移动端适配,要么开真机,要么用Chrome DevTools模拟。现在一行代码就能搞定,效率提升不是一星半点。
1.3 如何安装Playwright?
安装过程简单到离谱。咱们以Node.js为例。
1.3.1 前提条件
确保你已经安装了Node.js(版本12以上)。我个人推荐用LTS版本,稳定。
1.3.2 安装步骤
第一步,创建项目并安装Playwright:
mkdir my-playwright-project
cd my-playwright-project
npm init -y
npm install playwright
第二步,安装浏览器:
npx playwright install
这条命令会自动下载Chromium、Firefox和WebKit的浏览器二进制文件。大概几百兆,取决于你的网速。
注意:如果你在公司内网,下载可能会慢。可以设置镜像源:PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/playwright npx playwright install
1.3.3 验证安装
写个简单的脚本试试:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();
})();
运行node test.js,如果打印出Example Domain,恭喜你,安装成功了。
1.3.4 其他语言安装
Python用户看这里:
pip install playwright
playwright install
Java用户:
// 在pom.xml中添加依赖
<dependency>
<groupId>com.microsoft.playwright</groupId>
<artifactId>playwright</artifactId>
<version>1.40.0</version>
</dependency>
嗯,就这么简单。没有复杂的驱动配置,没有环境变量设置。一条命令,搞定所有。
1.4 我的个人建议
如果你正在选型浏览器自动化工具,我的建议是:
- 新项目:直接上Playwright。省心、高效、社区活跃。
- 老项目迁移:如果项目不大,值得迁移。我去年把一个Selenium项目迁到Playwright,测试稳定性从70%提到了95%。
- 只需要Chrome:Puppeteer也可以,但Playwright的API设计更友好。
我曾经踩过一个坑——用Selenium跑一个复杂的表单填写流程,每次跑到第5步就超时。调试了两天,最后发现是某个下拉菜单的加载时机不对。换成Playwright后,自动等待机制直接解决了这个问题。嗯,从那以后,我对Playwright就彻底服气了。
好了,这一章就到这里。下一章咱们会写第一个Playwright脚本,真正上手操作。到时候你会觉得——原来浏览器自动化可以这么简单。