跳到主内容

Playwright 和 Selenium 怎么选:两套框架我都跑崩过才想明白

如果你打算用"谁跑得快"来决定 Playwright 和 Selenium 选哪个,这个决策一开始就偏了。真正决定胜负的是三件事:有没有历史包袱、脚本要不要无人值守跑、团队会不会 Ruby。我把两套都搭起来跑过一轮,下面说具体的。

大家通常怎么做:拿一张对比表就拍板

最常见的做法是搜一篇"A vs B",照着那张表打个分,选分数高的那个。

我以前也这么干,直到踩了个说大不大、说小不小的坑:几篇对比文章的结论完全一致,但里面的版本号对不上。有篇 2026 年的英文对比文写 Selenium 稳定版是 4.44.0(2026-05-12 发布),我顺手打开官方下载页核对,Java / Python / .NET / Ruby / JavaScript 五套语言绑定清一色写着 4.49.0(2026 年 9 月 9 日发布),Selenium Server(Grid)同样是 4.49.0。

版本号都差了五六个小版本,那些"快出百分之多少"的数字你还敢直接抄进技术方案里吗?

这不是抬杠。公开的对比文里,具体的性能数字大多出自厂商博客或者某个单一仓库的一次跑分,方法论不公开,换个项目就换个结论。有意思的是,我查到的一篇比较克制的英文对比文明确写了:他们刻意不引用速度百分比,因为没有可复现的方法。而搜索结果里排在更前面的,往往恰恰是敢给确定数字的那几篇。

所以拍板之前,版本号自己去官方下载页核,性能数字自己去你们项目的 CI 上跑。

为什么这条路走不通:速度是最不该优先看的指标

原因很简单——你的瓶颈几乎从来不在"每一条操作快几百毫秒"上。

我这套脚本是给站里做数据巡检用的:任务清单跑起来是省、市、关键词三层的笛卡尔积,跟我们做指数采集时那种"每个省、每个地级市、每只标的全拉一遍"的规模差不多(详见百度指数批量采集实战复盘)。这种批量任务里,真正吃掉时间的是失败重试和半夜爬起来看日志,不是单步执行延迟。

再换个算账方式:处理 flaky(忽好忽坏)测试至少占用约 2.5% 的有效开发时间,摊在排查、修复和工具成本上(ICST 2024 工业案例研究)。十人小组一年下来,这笔账远比"每步快两百毫秒"值钱。

换句话说:稳定性的差距会被规模放大,速度的差距会被规模稀释。决策权重给反了,后面全是白折腾。

换个思路:先把脚本的生命周期问清楚

我现在的判断顺序是这样的,只剩三个问题。

第一问:脚本要无人值守跑多久?

如果要像我们站的定时采集那样,每天凌晨自动跑、跑完无人看(可参考百度指数采集驱动的 SEO 复盘),稳定性就是一票否决项。半夜三点挂了,早上九点才发现,这一天的数据就断了。

同理,凡是需要长时间不间断的任务——比如多账号切换维持 7x24 小时采集那种场景(见百度指数批量采集工具常见问题)——都属于"挂一次就很贵"的类型。这类任务应该优先选能帮你把等待逻辑收进框架里的工具。

第二问:有没有历史包袱?

有几百条已经在跑的 Selenium 用例,就别推倒重来。迁移的排序标准不是"哪批用例最老",而是"哪批用例最吃维护工时"。最脆、最常红的那几条先迁,年纪大的反而可以先躺平。新功能的新用例从第一天就用新框架写,两套在同一个 CI 里并存,跑到老套件自然清空为止。

第三问:语言绑定够不够用?

这条最容易被忽略,但它是一票否决的。Selenium 官方支持五种语言绑定:Java、Python、C#、Ruby、JavaScript。Playwright 官方是四种:JavaScript/TypeScript、Python、Java、.NET。

差别就在 Ruby。团队里有成熟的 Ruby 测试库,选 Playwright 就只能找社区方案。反过来,如果你们清一色 JS/TS 或 Python,那五种和四种对你没区别,这条直接划掉。

具体做法:两套环境都用官方命令装一遍

两套我都装了,命令以官方文档为准,别抄博客里的旧写法。

Selenium 这边

Python 是 pip install selenium,Java 走 Maven 拉 selenium-java。版本号直接看官方下载页,别信二手文章。另外注意一个细节:Internet Explorer Driver Server 的版本停在 4.14.0.0,跟主版本号早就不同步了,见到别以为是页面没更新。

Playwright 这边

官方文档给的路径是:

npm init playwright@latest
npx playwright install --with-deps
npx playwright test

初始化时它会让你选 TypeScript 还是 JavaScript、测试目录名(默认 tests)、要不要加 GitHub Actions 工作流、要不要下载浏览器。跑 npx playwright --version 看实际版本,我这边不写死数字——隔几周就可能不一样。

系统要求要提前对一遍,这是最容易在 CI 机器上翻车的地方:官方文档列的是 Node.js 22.x / 24.x / 26.x,Windows 11+、Windows Server 2019+ 或 WSL,macOS 14(Sonoma)以上,Debian 12/13、Ubuntu 22.04/24.04/26.04。公司里还在跑 Ubuntu 20.04 的构建机,装之前先看这条。

默认行为记得先确认一下:它默认 headless 并且并行跑 Chromium、Firefox、WebKit 三个引擎。第一次跑发现同时开三个浏览器别慌,--project=chromium 可以只跑一个。装完它自带不少东西:HTML 报告(npx playwright show-report)、Trace Viewer、Codegen 录制、UI Mode(--ui)。

最后提醒一句:超时兜底一定要自己加一层。不管是 Playwright 还是 Selenium,都不该让一条用例无限等待。我在桌面程序里做 dialog 拦截时也吃过这个亏,外面必须包一层超时,超过 N 秒就强制返回,绝不让流程永远挂起(那个 5 秒兜底的写法在WebView2 拦截文件对话框的踩坑记录里)。

效果对比:差异真正落在这四处

把装饰性指标去掉之后,剩下的差异其实只有四条。

维度SeleniumPlaywright
协议与架构进程外,走 W3C WebDriver(2018-06-05 成为官方推荐标准),厂商中立持久连接,源自 DevTools Protocol,微软单一厂商
等待机制没有内建自动等待,显式/隐式等待要自己写内建动作可行性检查,点之前先看元素是否可见、可用、稳定
运行器与并行外接 JUnit / TestNG / pytest,并行靠 Selenium Grid自带测试运行器,并行 worker 内建
语言绑定Java、Python、C#、Ruby、JavaScript(5)JS/TS、Python、Java、.NET(4)

第四条最容易被忽略,却是"Selenium 没过时"的核心理由:W3C WebDriver 是标准,浏览器厂商都认;Playwright 强,但背后是单一厂商。采购要看"供应商中立"的团队,这条比任何跑分都硬。

还有个正在变化的点值得盯着:Selenium 4 在推 WebDriver BiDi,把网络拦截、console 捕获这类双向能力补上来,目前正在从 WebDriver Classic 往 BiDi 迁移,高层 API 计划放在 Selenium 5。也就是说,上面第二行和第三行的差距,未来是要被抹平的——只是现在还没。

常见问题

Q:我们 Selenium 用例写了三年,现在全套迁过去划算吗?

A:不划算,也不该这么干。按维护成本排优先级,最脆的那几条先迁;新功能的覆盖从今天起就用新框架写;老套件继续在原 CI 里跑。别搞一次性切换。

Q:能不能不看国内外那些百分比,自己拿个结论?

A:能,而且很简单。挑 20 条最有代表性的用例,在你们自己的 CI 镜像里各跑 10 遍,记两个数:总耗时、失败率(含重试后才通过的次数)。这个数再小也比别人仓库里的 2-3 倍可信。

Q:Playwright 在这套脚本里不用写 sleep 吗?

A:常规场景基本不用,它有内建的可行性检查。但涉及文件下载弹窗、原生对话框、第三方登录跳转,还是建议显式等待加超时兜底。全靠框架兜底,出问题定位会很痛苦。

Q:拿浏览器自动化去抓公开数据,合规上要注意什么?

A:先看目标站点的 robots.txt 和服务条款,控制请求频率,别做绕过登录、破解接口、碰撞昵称榜单这类事。数据用途涉及对外发布或商业用途时,走官方授权通道更稳妥。

Q:团队全是 Java + TestNG,值得换吗?

A:如果现有套件跑得好,不值得。Java 绑定两边都支持,差别在等待机制和运行器,可以先只迁最脆的几条做试点,跑一个月看 CI 重试率变化再决定要不要扩大。

相关阅读

分享到:

本文链接:https://www.biyeyuanma.cn/post/256.html

服务热线

加我微信

加我微信