Playwright 与 Selenium 对比:网页抓取与自动化实战评测
我们安装了这两款工具,运行了相同的自动化和抓取任务,把两者都连接到代理,并对比了实际发生的结果。
网上大多数 Playwright 与 Selenium 的对比,都只是从文档里抄来的功能清单。它们告诉你 Playwright 具备自动等待,而 Selenium 拥有更庞大的生态, 然后就没有下文了.
我们在同一台机器上安装了 Playwright 和 Selenium,用两者搭建了相同的简单自动化流程,都连接到代理,并抓取了同一个页面。 每一条基于实测的结论都会标注。凡是我们尚未完成测试的地方,你看到的会是占位说明,而不是凭空猜测。
本次对比涵盖安装配置、动态网站、数据抓取、代理集成以及日常开发体验。如果你正在为抓取项目、QA 测试套件或 基于代理的自动化技术栈在 Playwright 和 Selenium 之间做选择,这篇内容的目的 就是帮助你依据真实测试结果做出决定.
快速结论:选 Playwright 还是 Selenium?
根据本文中的实测结果:
- 选择 Playwright 如果你要启动一个新的自动化或数据抓取项目,尤其是面向大量使用 JavaScript 的网站。它无需任何显式等待即可通过登录流程和四个用例的动态内容测试,而 Selenium 必须加入 WebDriverWait 逻辑后才能通过。
- 选择 Selenium 如果你已经在运行 Selenium 基础设施、使用 Selenium Grid,或者需要最广泛的浏览器和编程语言支持矩阵。它抓取到了与 Playwright 相同的 60 条数据,并且在我们的测试运行中完成得更快。
- 最突出的单项结果: 带身份验证的代理配置。Playwright 可以直接在启动配置中接受代理凭据。Selenium 则需要手动处理 Chrome 的身份验证弹窗,而我们尝试自动化这一步骤并未得到可靠的结果。
这只是下文各项测试的总结,并不能替代它们。完整的详细分析,包括每一项运行时间和错误信息,请见下文。
Playwright 与 Selenium 一览
| 功能 | Playwright | Selenium |
| 设置 | 单个安装包同时安装浏览器和驱动 | Selenium Manager 现在在大多数环境中可自动解析驱动 |
| 浏览器支持 | Chromium, Firefox, WebKit | Chrome、Firefox、Edge、Safari、IE(通过驱动) |
| Languages | JavaScript, TypeScript, Python, Java, C# | Java, Python, C#, Ruby, JavaScript, Kotlin |
| 等待机制 | 操作中内置自动等待 | 显式等待和流畅等待,以及较新的基于 BiDi 的选项 |
| 动态网站 | 专为现代重度 JavaScript 应用而设计 | 通过显式等待策略进行处理 |
| 会话 | 每个会话使用隔离的浏览器上下文 | 每个会话一个驱动实例,或使用多个驱动实例 |
| 网络控制 | 原生支持请求拦截与路由 | WebDriver BiDi 网络 API,正在扩展到更多语言 |
| 代理支持 | 按上下文配置代理 | 按驱动配置代理,具体细节因浏览器而异 |
| 并行执行 | 在一台机器上使用上下文和工作进程 | 上下文和工作进程,另可使用 Selenium Grid |
| 分布式执行 | 可以实现,但并非核心重点 | Selenium Grid 专为此而生 |
| 数据采集 | 可快速搭建并运行爬虫 | 生态成熟,但样板代码较多 |
| 最佳使用场景 | 新的自动化与抓取项目,以及重度使用 JS 的网站 | 已有的 Selenium 代码库、基于 Grid 的基础设施,以及大范围浏览器矩阵测试 |
上面的表格只是一个起点。真正的答案来自下文的实测部分。
我们测试了什么
两款工具在同一台机器上、使用同一种编程语言,运行了相同的基础流程:
- 打开一个网站
- 查找一个元素
- 点击该元素
- 输入数据
- 等待动态内容加载
- 提取信息
- 集成代理
以下结果来自在同一套设备和同一个网络上的测试(代理检查除外)。你自己的数据会因硬件、网络连接和目标站点而有所不同。
安装与初次配置
Playwright 以单个软件包的形式安装,并会自行下载所需的浏览器二进制文件,因此无需为 Chromium、Firefox 或 WebKit 单独配置驱动。
Selenium 在大多数情况下也不再需要手动管理驱动。自 4.6 版本起随 Selenium 软件包一同提供的 Selenium Manager 会检测已安装的浏览器并自动下载匹配的驱动。如今只有在特殊情况、需要自定义驱动版本或离线环境下,才需要手动下载驱动。
安装与首次配置:Playwright
在实操测试中,我们在一个全新的 Python 虚拟环境里安装了 Playwright。本次测试使用了 Python 3.14.7 和 Playwright 1.62.0.
软件包本身的安装耗时 16.57 秒。随后 Playwright 还需要一个额外的浏览器安装步骤。运行 playwright install 耗时 1 分 39 秒.
安装完成后,我们用一段简短的 Python 脚本启动了 Chromium 并打开了 example.com。首次成功启动浏览器耗时 9.33 秒.

完整结果如下:
| 测试项 | Playwright 结果 |
| Python 版本 | 3.14.7 |
| Playwright 版本 | 1.62.0 |
| 安装软件包 | 16.57 秒 |
| 安装浏览器 | 1 分 39.69 秒 |
| 总安装耗时 | 1 分 56.26 秒 |
| 手动安装驱动 | 否 |
| 安装错误 | 无 |
| 首次启动 Chromium | 9.33 秒 |
| 测试页面 | example.com |
| 结果 | 成功 |

Playwright 将 Python 包与其托管的浏览器二进制文件分开。这增加了一个额外的安装步骤,但也让 Playwright 能够控制自动化所使用的浏览器版本。
在本次测试中,Playwright 需要一次软件包安装和一次浏览器安装步骤。无需单独安装 WebDriver 或手动下载驱动程序。
安装与首次设置:Selenium
在同样的实测中,我们在一个全新的 Python 虚拟环境中安装了 Selenium。我们使用了与 Playwright 测试相同的 Python 版本,即 Python 3.14.7。安装的 Selenium 版本为 4.47.0。
Selenium 软件包安装耗时 32.15 秒。未出现任何安装错误。

与 Playwright 不同,Selenium 在本次测试中不需要单独下载浏览器。我们已经安装了 Chrome,脚本启动浏览器时,Selenium Manager 会自动处理所需的驱动程序。我们没有手动安装 ChromeDriver。
首次成功启动 Chrome 并加载页面耗时 8.93 秒.

完整结果如下:
| 测试项 | Selenium 结果 |
| Python 版本 | 3.14.7 |
| Selenium 版本 | 4.47.0 |
| 安装软件包 | 32.15 秒 |
| 安装浏览器 | 本次测试中无需此项 |
| 实测总安装耗时 | 32.15 秒 |
| 手动安装驱动 | 否 |
| 驱动管理 | Selenium Manager |
| 安装错误 | 无 |
| 首次启动 Chrome | 8.93 秒 |
| 测试页面 | example.com |
| 结果 | 成功 |
结果显示出与 Playwright 不同的设置思路。在我们的测试中,Selenium 的 Python 包安装耗时更长,但由于已经装有 Chrome,因此无需单独下载浏览器。Selenium Manager 也省去了手动安装 ChromeDriver 的麻烦。
实测结论: 作为 Python 包,Selenium 的安装速度略慢,但在该环境中所需的初始设置更少。由于已经安装了 Chrome,Selenium Manager 自动处理了驱动程序,并在 8.93 秒内让浏览器运行起来。Playwright 整体耗时更长,因为其设置过程包含下载托管的浏览器二进制文件。
用 Playwright 和 Selenium 编写同一套自动化脚本
功能列表可能让两款浏览器自动化工具看起来非常相似。而真实的测试才能揭示实际体验的差异所在。
为了公平地比较 Playwright 和 Selenium, 我们用 Python 通过这两种工具构建了相同的工作流。目标是 The Internet 测试站点上的登录表单。
该工作流很简单:
- 打开登录页面。
- 输入用户名。
- 输入密码。
- 点击 Login。
- 读取成功提示信息。
- 关闭浏览器。
我们还测试了工作流遇到问题时会发生什么。
Playwright 实现
Playwright 版本使用了以下代码:
该实现包含 12 行非空代码,并且没有显式等待。
脚本打开页面、填写两个字段、提交表单,并在第一次尝试时就成功提取了返回的提示信息。

成功运行后进入了 Secure Area,并显示了确认信息:
您已登录安全区域!
这是我们注意到的第一个实际优势。基础工作流只需要极少的准备代码,而且这些操作的写法非常接近浏览器实际执行的动作。
Selenium 实现
随后我们在 Selenium 中重建了相同的工作流。
最初的版本如下:
最初的 Selenium 实现同样包含 12 行非空代码。
然而,第一次运行并未成功完成。
浏览器打开了页面,填写了两个字段并点击了 Login。失败发生在 Selenium 立即尝试查找 #flash 元素。
它返回了一个 NoSuchElementException.
这并不是选择器的错误,而是时机问题。在 Selenium 调用之时,页面尚未呈现该元素 find_element().
添加显式等待
我们通过添加显式等待修复了 Selenium 版本:
最终的 Selenium 版本包含 15 行非空代码。
多出的三行与显式等待及其所需的导入语句有关。
添加等待之后,同样的流程成功完成。

实现结果
| 测试项 | Playwright | Selenium |
| 初始代码 | 12 行 | 12 行 |
| 首次运行 | 成功 | 提取结果时失败 |
| 显式等待 | 无需 | Needed |
| 最终代码 | 12 行 | 15 lines |
| 成功结果 | 是 | 是,添加等待后成功 |
| 启动浏览器 | 9.33 秒 | 8.93 秒 |
这并不意味着 Selenium 总是需要显式等待。它说明的是 在这个特定的流程中,Selenium 立即执行的元素查找并不足够.
Playwright 无需额外的等待代码就处理好了同样的页面状态切换。
当自动化脚本规模变大时,这一差异就变得重要。几条额外的等待语句本身并不是问题。当一个测试包含大量动态元素和状态变化时,维护成本才会更加明显。
测试一个错误的选择器
我们还希望比较调试体验,而不仅仅是比较成功的运行结果。
在 Playwright 中测试失效的选择器
对于 Playwright,我们特意将用户名选择器从以下内容改成:
至:
该选择器现在是错误的。
Playwright 打开了正确的登录页面,但一直在等待那个并不存在的定位器。30 秒后,它抛出了:
错误发生时,浏览器仍停留在登录页面上。

这个错误信息很详细。它指出了失败的操作、选择器以及调用日志。不过,30 秒的默认超时时间使得一个简单的选择器拼写错误诊断起来相对缓慢。
在 Selenium 中出现同样失效的选择器
我们在 Selenium 中犯了完全相同的错误:
Selenium 立即失败了。错误指向第 10 行,并显示了 Selenium 试图定位的选择器。
这形成了一个有趣的对比。
Playwright 会等待那个缺失的定位器,然后返回一条详细的超时错误。而 Selenium 的直接 find_element() 则立即失败,并抛出 NoSuchElementException.
对于选择器中的拼写错误,Selenium 的即时失败能让你更快发现问题。但对于异步加载的页面,如果元素只是需要更多时间才能出现,这种即时查找反而会成为麻烦。
我们的实测结论
在用这两款工具完成同一套工作流之后, 就这项特定测试而言,Playwright 用起来更轻松.
主要原因并不是打开 Chrome 所需的命令数量。两款工具都能快速启动浏览器。差异出现在点击 Login 之后页面状态发生变化的时候。
Playwright 无需添加显式等待逻辑就完成了整个工作流。Selenium 起初在同一环节失败,需要加上 WebDriverWait 才能让工作流稳定运行。
调试测试的结果则更为微妙。Selenium 立即报告了选择器缺失。Playwright 则等到默认超时,然后生成了一份带有定位器调用日志的详细超时报告。
实测结果一览
| 方面 | Playwright | Selenium |
| 初始工作流 | 通过 | 动态结果查找失败 |
| 最终工作流 | 12 行 | 15 lines |
| 显式等待 | 不需要 | 本次测试中需要 |
| 选择器错误 | 30 秒超时 | 立即抛出 NoSuchElementException |
| 调试输出 | 详细的定位器调用日志 | 详细的 WebDriver 回溯信息 |
| 我们的实测体验 | 在此工作流中更省事 | 手动控制等待时机更灵活 |
动态网站与等待机制
现代网站很少一次性加载全部内容。元素可能在 AJAX 请求之后才出现,可能由 JavaScript 渲染,也可能在用户交互后改变状态。如果自动化脚本在元素尚未就绪时就尝试与之交互,即使页面本身运行正常,测试也可能失败。
正是在这一点上,Playwright 与 Selenium 采取了明显不同的思路。
在执行诸如以下操作之前,Playwright 会自动等待元素进入可操作状态: click() 或 fill()。在许多常见场景下,这意味着无需另外编写等待代码。
Selenium 则对同步提供了更为显式的控制。典型做法是使用 WebDriverWait ,并配合预期条件,例如 element_to_be_clickable() 或 visibility_of_element_located()。这让等待行为变得显式可见,但也为自动化脚本增加了额外的代码。
实测:等待行为
为了比较这两种思路,我们创建了一个本地测试页面,其中包含四种不同的情形:
- 立即可用的元素
- 延迟一段时间后才出现的元素
- 由 JavaScript 动态渲染的内容
- 在状态变化后才变为可用的按钮
随后我们在两个框架中运行了同样的四项测试。
Playwright 结果
Playwright 在无需向测试中添加显式等待逻辑的情况下,四种情形全部通过。
整套测试耗时 2.56 秒完成。
这次测试的重点在于,可以直接使用 Playwright 的常规操作。其内置的等待机制会自动处理元素何时就绪,无需另外编写类似 WebDriverWait 的机制。

Selenium 结果
Selenium 同样成功通过了全部四个用例,但其实现需要使用 WebDriverWait 和预期条件来进行显式同步。
该测试耗时 3.96 秒完成。
Selenium 的实现使用了如下条件:
这让 Selenium 能够精确控制在执行下一步操作之前必须满足哪些条件。代价是同步逻辑必须显式地编写出来。
测试结果
| 测试用例 | Playwright | Selenium |
| 立即出现的元素 | 通过 | 通过 |
| 延迟出现的元素 | 通过 | 通过 |
| 由 JavaScript 渲染的元素 | 通过 | 通过 |
| 按钮状态变化 | 通过 | 通过 |
| 显式等待代码 | 不需要 | WebDriverWait + 预期条件 |
| 我们测试中的执行时间 | 2.56 s | 3.96 s |
在本次运行中,Selenium 多用了 1.40 秒。但这不应被视为对框架性能的普遍基准评价,因为该测试规模很小且只运行了一次。更值得关注的差异在于 所需同步代码的数量.
测试说明了什么
两个框架都成功处理了全部四种动态情况。差异主要在于开发者需要为同步承担多少责任。
Playwright: 处理常见动态交互所需的代码更少,因为等待机制已内置于其操作之中。
Selenium: 对等待条件有更明确的控制,但需要编写额外的代码和选择器逻辑。
对于元素频繁出现或动态改变状态的现代重度 JavaScript 网站,Playwright 的内置等待机制可以让初始自动化代码写得更快、读起来更清晰。而当项目需要精确控制元素在何时被视为就绪时,Selenium 的显式方式会更有用。
Playwright 与 Selenium 的网页抓取对比
Playwright 和 Selenium 都能驱动真实浏览器并从已渲染的页面中提取数据。当网站依赖 JavaScript 或简单 HTTP 请求无法重现的浏览器行为时,这一点尤为重要。
为便于比较,我们用这两种工具构建了同一个小型爬虫。我们使用了 Books to Scrape,这是一个专为抓取练习设计的公开网站。抓取程序访问了三个页面,并从每本书中提取了相同的三个字段:
- 标题
- 价格
- 产品链接
每个页面包含 20 本书,因此预期结果为 60 条数据.
Playwright 抓取程序
Playwright 实现使用浏览器导航、CSS 选择器和元素定位器来提取数据:
该抓取程序处理了全部三个页面,并提取到 60 条中的 60 条数据 没有出现任何错误。

终端输出确认了完整的提取结果:
已抓取页面数:3
已提取条目数:60
前五个书名和价格也都被正确提取。
Selenium 抓取程序
随后我们用 Selenium 构建了同样的抓取程序:
Selenium 同样提取到 60 条中的 60 条数据 覆盖全部三个页面。

前五个书名和价格与 Playwright 的结果一致。
Selenium 的输出还返回了绝对产品 URL,而 Playwright 实现返回的是页面中的相对 href 值。这源于两种实现获取链接属性的方式不同,并不代表抓取准确性上存在实质差异。
抓取结果
| Metric | Playwright | Selenium |
| 已抓取页面数 | 3 | 3 |
| 预期项目 | 60 | 60 |
| 已提取条目数 | 60 | 60 |
| 抓取成功率 | 100% | 100% |
| 分页 | 通过 | 通过 |
| 标题抓取 | 通过 | 通过 |
| 价格抓取 | 通过 | 通过 |
| 链接抓取 | 通过 | 通过 |
| 报告的运行时间 | 27.00 秒 | 17.49 秒 |
| Failures | 无 | 无 |
测试说明了什么
对于这个简单的抓取任务, 两款工具都表现可靠.
两个框架都不需要对分页做特殊处理。页面结构保持一致,两款工具都成功定位了所有产品卡片并提取了所需字段。
代码量也相对接近。主要区别在于处理元素集合时所使用的 API。
Playwright 使用定位器(locator):
然后通过以下方式处理单个卡片:
Selenium 返回一组 WebElement:
随后,Selenium 版本直接对返回列表中的每个元素进行处理。
我们的结论:Playwright 与 Selenium 在网页抓取中的对比
就这个特定的抓取脚本而言,两款工具的差距比我们预想的更小。
一旦弄清页面结构和选择器,Selenium 使用起来就很直接。它的 find_elements() API 让你可以轻松收集匹配元素的列表并逐一遍历。
Playwright’s 的 locator API 同样简洁,在处理重复的产品卡片时表现良好。
对于像 Books to Scrape 这样简单的静态抓取目标, 我们不会仅凭抓取能力就在 Playwright 和 Selenium 之间做出选择。在我们的测试中,两者都提取了 100% 的预期条目。
代理支持:Playwright 与 Selenium 对比
为了公平地比较代理支持情况,我们使用相同的 NodeMaven 代理 和相同的目标对两个框架进行了测试, https://api.ipify.org/?format=json。此次对比重点考察了 使用用户名和密码进行身份验证的代理,因为在代理服务商要求提供凭据时,这是一种常见的配置方式。
这暴露出这两款工具之间最明显的实际差异之一。
Playwright 的代理支持
Playwright 允许在浏览器启动配置中直接提供代理服务器、用户名和密码。测试顺利完成,无需任何额外的身份验证机制。
结果:
- 代理连接: 通过
- 检测到的 IP: 109.127.17.1
- 运行时间: 7.94 秒
- 额外的身份验证设置: 无
返回的 IP 与本地连接不同,证实流量确实通过代理进行了转发。
Selenium 的代理支持
Selenium 测试暴露出一个重要的实际差异。
首先,我们为 Chrome 配置了 NodeMaven 的代理主机和端口。Chrome 成功连接到了代理,但弹出了原生的身份验证对话框,要求输入代理用户名和密码。

手动输入凭据后,页面成功加载并返回:
{“ip”:”188.64.10.56″}
这证实了 Selenium 浏览器 能够成功使用同一个代理 在通过身份验证的情况下。
随后我们尝试通过一个 Chrome 扩展来自动完成身份验证。尽管反复调整了多个版本,自动化版本仍会回退到本地 IP,而无法可靠地通过代理完成身份验证。
因此,我们 不 将自动化的 Selenium 结果视为一次成功的代理测试。
Selenium 的一个重要例外:IP 白名单
我们的身份验证代理测试对两个框架使用了相同的条件。 Playwright 处理用户名和密码认证要轻松得多,而 Selenium 的自动认证在我们的测试中无法稳定工作。
不过,当具备以下条件时,Selenium 也能与代理配合良好: IP 白名单 可用时。服务商无需通过浏览器发送凭据,而是直接授权你的公网 IP,从而避开 Chrome 的认证弹窗。
我们使用 NodeMaven 单独测试了 IP 白名单,Selenium 成功建立连接,并返回了与直连不同的 IP。
这是一次单独的测试,因此未纳入认证对比。关于 Selenium 的配置,包括 IP 白名单、IP 验证、粘性会话与轮换,请参阅我们的 Selenium 代理指南.
最终对比:使用代理时的 Playwright 与 Selenium
| Playwright | Selenium | |
| 代理主机/端口配置 | ✅ | ✅ |
| 需身份验证的代理 | ✅ | ✅ manually |
| 自动认证 | ✅ 原生配置 | ❌ 在我们的测试中未能稳定实现 |
| 额外设置 | Minimal | 需要 Chrome 认证的变通方案 |
| 已验证的代理 IP | 109.127.17.1 | 188.64.10.56 |
| 运行时间 | 7.94 秒 | – |
| 整体设置体验 | 简单直接 | 更为复杂 |
测试说明了什么
最大的差异并 不是浏览器性能,而是配置的复杂程度。
在 Playwright 中,需身份验证的代理凭据属于浏览器启动配置的一部分:
在 Selenium 中,配置代理本身很简单,但处理需身份验证的代理还需要一套额外的 Chrome 专用机制。我们的手动测试可以正常工作,而尝试将该身份验证自动化并未得到可靠的结果。
根据实际测试,在配置需身份验证的代理方面,Playwright 明显更容易上手。
为 Playwright 或 Selenium 自动化选择合适的代理类型
你选择哪种框架,并不会改变底层代理需要做的事情:保持身份验证有效、避免被标记,并在工作流需要时维持会话。有几类代理在 Playwright 和 Selenium 自动化中反复出现:
- 住宅代理 适用于能够从庞大且不断轮换的真实家庭 IP 池中受益的抓取与自动化场景。
- 移动代理 适用于面向移动端优先平台,或需要运营商级 IP 的工作流。
- ISP(静态住宅)代理 适用于长时间运行的会话,即在多步骤的 Playwright 或 Selenium 脚本中需要始终保持同一个 IP 的场景。
在通过任何代理运行自动化会话之前,值得先确认浏览器没有绕过代理泄露你的真实 IP。NodeMaven 的 免费 WebRTC 泄漏测试 可在一分钟内完成检测,且无需注册。
本文比较的是各个框架,而不是代理的设置步骤。 在 Playwright 中配置 NodeMaven 代理 或 Selenium 的方法,另有专门的分步指南介绍。
Playwright 与 Selenium 的最终测试结果
| 测试项目 | Playwright | Selenium | 我们的测试结果 |
| 安装软件包 | 16.57 秒 | 32.15 秒 | Playwright 的安装包安装更快 |
| 完整的首次设置 | 1 分 56.26 秒(含浏览器下载时间) | 32.15 秒(已安装 Chrome) | 在该环境中 Selenium 需要安装的组件更少 |
| 首次启动浏览器 | 9.33 秒 | 8.93 秒 | 接近,Selenium 略快 |
| 登录流程,首次运行 | 通过,无需显式等待 | 在提取结果时失败(NoSuchElementException) | Playwright 无需额外代码即可通过 |
| 登录流程,最终代码 | 12 行 | 15 lines | Selenium 需要多写 3 行等待代码 |
| 失效的选择器 | 30 秒超时,日志详尽 | 立即抛出 NoSuchElementException | Selenium 更快地暴露出错误 |
| 四种场景的动态等待测试 | 2.56 秒,无需显式等待 | 3.96 秒,需要 WebDriverWait | Playwright 所需的同步代码更少 |
| 抓取(3 个页面共 60 条数据) | 60/60,27.00 秒 | 60/60,17.49 秒 | 两者都完全准确,本次运行中 Selenium 更快 |
| 需身份验证的代理 | 自动完成,无需额外步骤 | 仅支持手动,自动化不可靠 | Playwright 的设置更简单 |
谁应该选择 Playwright?
在我们的测试中,Playwright 最适合以下场景:
- 全新的自动化或抓取项目,此时不存在需要迁就的既有框架选型。
- 以 JavaScript 为主或高度动态的网站,我们的登录工作流和四种情形的等待测试都无需额外的同步代码即可通过。
- 希望减少需要维护的计时逻辑代码量的团队。我们最终的工作流保持在 12 行,因为无需任何显式等待。
- 使用带身份验证的代理的配置,在我们的测试中,Playwright 直接在浏览器启动配置里接收代理凭据,无需单独的身份验证步骤。
- 能从隔离的浏览器上下文中获益的项目 可运行多个会话,而无需启动各自独立的驱动实例。
如果你的项目是从零开始,并且不依赖既有的 Selenium 工具链,我们的结果表明 Playwright 是阻力更小的选择。
谁应该选择 Selenium?
Selenium 依然是一个合理的选择,我们的测试也在特定场景中印证了这一点:
- 已有的 Selenium 代码库。目前没有证据表明,仅凭可靠性或抓取准确度就值得迁移一套成熟的测试套件。
- Selenium Grid 或分布式测试基础设施。本文并未直接测试 Grid,但它是 Selenium 生态中成熟且专门打造的组件,而 Playwright 并不打算取代它。
- 广泛的浏览器覆盖范围,除了 Chromium、Firefox 和 WebKit 之外,还可通过驱动程序支持 Edge、Safari 和 IE。
- 希望对同步过程有明确控制权的团队。使用 WebDriverWait 搭配预期条件(expected conditions)需要写更多代码,但它能让确切的等待条件在脚本中一目了然,而不是隐含在框架内部。
- 静态或较为简单的抓取目标。在我们的抓取测试中,Selenium 提取了全部 60 个条目,并且在那一次运行中比 Playwright 更快完成(17.49 秒对 27.00 秒)。
- 选择器错误时立即失败。在我们的失效选择器测试中,Selenium 的 find_element() 会立即失败并抛出清晰的 NoSuchElementException,而 Playwright 则要等满 30 秒的超时后才报告同样的问题。
如果你已经拥有 Selenium 基础设施、需要覆盖广泛的浏览器测试矩阵,或者团队精通 WebDriver,那么我们的测试结果并不能提供足够充分的理由让你转而使用其他方案。



