做 Web 自动化测试时,你是不是也遇到过这些糟心问题?——Selenium 脚本明明本地能跑,到服务器就报 “元素定位不到”;网络稍微波动,整个测试流程直接中断;动态加载页面要写一堆等待代码,稍不注意就超时。

我在电商 CRM 系统做自动化测试时,曾因 Selenium 的稳定性问题一周返工 3 次,直到换成 Playwright 才彻底解决。后来深入研究两者的底层驱动原理,才明白 “稳定性差异” 根本不是 “运气问题”,而是 “底层设计决定的必然结果”。

本文从 “底层原理→实战差异→避坑技巧” 三个维度,带你搞懂 Playwright 和 Selenium 的核心区别,帮你选对工具少走弯路。

一、先搞懂底层:为什么 Selenium 总 “掉链子”?

很多人用 Selenium 只知道 “写 find_element”,却不知道它的底层驱动逻辑藏着 “天生缺陷”—— 这也是脚本不稳定的根源。

1. Selenium 的 “HTTP 请求短板”

Selenium 的核心是WebDriver + 浏览器驱动的组合,通信全靠 HTTP 协议,流程是这样的:

  • 你写driver.click(),Selenium 把这个操作转成 JSON 格式的 HTTP 请求;
  • 请求发给浏览器驱动(比如 chromedriver),驱动控制浏览器执行点击;
  • 执行结果再通过 HTTP 响应返回给 Selenium;
  • 关键问题:每个操作都是独立 HTTP 请求,执行完就断开连接,下一个操作要重新建立连接。

举个实战例子:CRM 系统的 “考勤打卡” 流程要 3 步 —— 输入工号→点击查询→点击打卡。Selenium 会发 3 次独立 HTTP 请求,每次都要经历 “建立连接→发指令→断连接”。

如果网络稍有波动(比如测试服务器带宽不够),某一次请求超时或丢包,就会出现 “工号输完了,查询按钮点不动” 的情况,脚本直接报错。

2. 等待机制的 “手动噩梦”

Selenium 的等待机制堪称 “自动化测试的坑王”,新手很容易在这里栽跟头:

  • 隐式等待:全局设置等待时间(比如driver.implicitly_wait(10)),但它只能等 “元素出现”,不能等 “元素可点击”—— 比如按钮加载出来了,但还在禁用状态,隐式等待照样会提前执行点击,报 “元素不可交互”。
  • 显式等待:要写一堆额外代码,比如等 “打卡按钮可点击”:

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

# 显式等待打卡按钮可点击,超时10秒

WebDriverWait(driver, 10).until(

EC.element_to_be_clickable((By.CSS_SELECTOR, ".checkin-btn"))

)

复杂页面要写十几处显式等待,代码又长又容易漏。

  • 固定等待(time.sleep ()):最笨的方法,比如time.sleep(5)—— 如果页面 5 秒内加载完,会浪费时间;如果 5 秒没加载完,照样超时。

我之前在 CRM 系统测 “跨时区考勤报表”,报表加载时间不稳定(2-8 秒),用 time.sleep (5) 要么等半天,要么超时,最后写了 3 行显式等待才搞定,特别麻烦。

二、Playwright 的 “稳定性秘诀”:从底层设计碾压

Playwright 是微软 2020 年推出的工具,一出来就主打 “稳定性”,核心原因是它从底层重构了通信和等待机制。

1. WebSocket 的 “持久连接优势”

Playwright 不用 HTTP 协议,而是用WebSocket,流程完全不同:

  • 脚本启动时,Playwright 和浏览器建立 1 次 WebSocket 连接;
  • 所有操作(输入、点击、跳转)都通过这个连接发指令,不用反复断开重连;
  • 整个测试流程结束,才关闭连接。

还是 “考勤打卡” 3 步流程,Playwright 只建立 1 次连接,3 个操作在同一个连接里顺序执行,哪怕网络有小波动,也不会因为 “连接中断” 导致操作失败。

我在弱网环境(模拟 2G 网络)做过测试:Selenium 脚本执行 10 次失败 6 次,Playwright 只失败 1 次,稳定性差距特别明显。

2. 自动等待:不用写一行等待代码

Playwright 最香的功能就是自动等待机制,它会智能判断 “元素是否准备好”,不用你手动设置等待:

  • 执行page.click(".checkin-btn")时,Playwright 会自动等按钮 “可见 + 可点击”;
  • 执行page.fill("#work-id", "12345")时,会等输入框 “加载完成 + 可输入”;
  • 甚至动态加载的列表(比如考勤记录列表),Playwright 会等列表数据加载完再执行后续操作。

同样是 “跨时区考勤报表” 测试,Playwright 的代码只要 1 行,不用写任何等待:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:

browser = p.chromium.launch()

page = browser.new_page()

page.goto("https://crm.example.com/checkin-report")

# 自动等待报表加载,直接点击导出按钮

page.click(".export-btn") # 不用写等待,Playwright自动处理

browser.close()

这对新手太友好了,再也不用纠结 “到底要等几秒”。

三、实战对比:3 个场景看稳定性差异

光说原理不够,结合我在电商 CRM 系统的实战经历,带你看两者在真实场景中的表现。

场景 1:网络波动下的表单提交

需求:填写 “营销活动申请单”(5 个输入框 + 2 个下拉框 + 1 个提交按钮)。

  • Selenium 问题:网络波动时,第 3 个输入框刚输完,第 4 个输入框还没加载出来,脚本直接执行输入,报 “元素不存在”;
  • Playwright 表现:自动等第 4 个输入框加载完成,再执行输入,哪怕网络延迟 3 秒,也能正常提交。

场景 2:动态加载的考勤记录查询

需求:输入工号→点击查询→等待考勤记录列表加载→验证记录数。

  • Selenium 问题:要写显式等待 “列表加载完成”,如果列表加载时间超过设置的等待时间(比如 10 秒),就会超时;
  • Playwright 表现:执行page.locator(".record-item").count()时,自动等列表加载完再返回记录数,不用写等待代码。

场景 3:多浏览器兼容性测试

需求:在 Chrome、Firefox、Safari 上测试 “打卡功能”。

  • Selenium 问题:每个浏览器要下载对应的驱动(chromedriver、geckodriver、safaridriver),版本还要和浏览器匹配,经常因为 “驱动版本不兼容” 导致脚本跑不起来;
  • Playwright 表现:自动下载对应浏览器的驱动,不用你手动管理,一行代码切换浏览器:

# 启动Chrome

browser = p.chromium.launch()

# 启动Firefox

# browser = p.firefox.launch()

# 启动Safari

# browser = p.webkit.launch()

四、避坑指南:该选 Playwright 还是 Selenium?

很多人问 “我该放弃 Selenium 转 Playwright 吗?”,其实没有绝对答案,要根据项目需求选。

选 Playwright 的 3 种情况

  • 复杂业务场景:比如多步骤表单、动态加载页面、弱网环境,Playwright 的稳定性优势明显;
  • 追求效率:不想写大量等待代码,想快速实现自动化,Playwright 能节省 50% 的代码量;
  • 多浏览器兼容:需要同时测 Chrome、Firefox、Safari,Playwright 不用手动管理驱动。

选 Selenium 的 2 种情况

  • 老项目维护:公司已有大量 Selenium 脚本,重构成本高,暂时不用换;
  • 需要特殊插件:比如某些行业专用的浏览器插件(如金融领域的加密插件),Selenium 的兼容性更好(Playwright 对部分插件支持不足)。

我的建议

  • 新手入门:直接学 Playwright,不用踩 Selenium 的等待和连接坑;
  • 职场过渡:如果公司用 Selenium,先掌握基础,再逐步用 Playwright 重构核心脚本(比如把稳定性要求高的脚本换成 Playwright)。

五、总结:稳定性不是 “玄学”,是底层设计决定的

通过底层原理分析和实战对比,你会发现:Playwright 的稳定性优势,不是 “运气好”,而是 “WebSocket 持久连接 + 自动等待” 的底层设计带来的必然结果。

如果你正在被 Selenium 的稳定性问题折磨,不妨试试 Playwright。

最后送大家一句实战心得:选对工具比埋头写代码更重要,自动化测试的核心是 “稳定可靠”,而不是 “能用就行”。希望这篇文章能帮你少走弯路,高效搞定 Web 自动化测试!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐