在 Web 自动化测试领域,Selenium 曾长期占据主流地位,但稳定性差、报错率高、通信延迟久、脚本冗余复杂等痛点,一直是测试工程师的日常困扰。
而微软推出的 Playwright 凭借直连浏览器内核、WebSocket 长连接、内置智能等待等能力,成为现代 UI 自动化主流方案,但有明确适用边界。
今天我们从零拆解 Playwright 的工作原理、跨进程架构、性能对比、常用核心方法、适配场景、完整优劣势,结合架构原理图,帮你彻底吃透这款爆款自动化框架。
核心要点:
【测试脚本】Python/Java/JS/C#
↓
【API封装层】通用操作方法(点击/输入/网络拦截)
↓
【Playwright Core核心层】
(指令翻译、浏览器调度、内置自动等待逻辑、上下文管理)
↓
【WebSocket长连接】全双工持久连接,仅一次握手,无反复建连开销
↓
【浏览器原生协议】
CDP(Chromium) / Marionette(Firefox) / WebKit协议
↓
【浏览器多进程内核】
Browser主进程 + Render渲染进程 + Network网络进程
渲染引擎(Blink/Gecko) + V8 JS引擎 + 网络栈
↓
【网页DOM页面】执行页面行为,返回执行结果
page.click("按钮") 点击操作完整全过程page.click("按钮"),多语言 SDK 做 API 封装。⭕关键:跨进程运行模型测试脚本进程、Playwright‑Server (Node.js) 进程、浏览器 Browser 进程、Render 渲染进程、Network 网络进程全部是相互独立的跨进程。
Playwright 采用多层分布式架构:
Playwright 不模拟鼠标界面点击,直接和浏览器内核模块(渲染引擎、JS 引擎、网络栈)通信。所以可以做到普通用户做不到的能力:
内置自动等待机制内置等待逻辑是 Core 层实现,自动校验页面加载、网络状态、元素可见、可交互、动画结束,不用手动写 sleep、轮询,大幅降低脚本复杂度。
无头模式原理不管有头 / 无头,浏览器完整多进程(Browser、Render、Network)全部运行;无头只是不启动 GUI 窗口,渲染、JS 执行、事件触发逻辑完全一致,非常适合 Linux CI 后台运行。
支持范围边界✅支持:Web 应用;移动端设备模拟;Electron/NW.js 内嵌内核桌面应用;❌不支持:安卓 /iOS 原生 App (.apk/.ipa);Windows 原生桌面软件(记事本、Qt 程序等)。
以 Page 对象为核心,全部 API 自带自动等待,无需手动 sleep。
最佳实践:优先使用locator定位器,不要用老式page.$,locator 自带自动重试,稳定性更高。
page.goto(url):跳转访问网页,自动等待页面加载完成page.reload():页面刷新page.go_back():浏览器回退page.go_forward():浏览器前进page.wait_for_url():等待跳转到指定 URLpage.click(selector):点击元素,自动等待元素可见、可交互page.fill(selector, text):输入文本,清空后填入内容page.type(selector, text):逐个字符输入,模拟真实键盘打字page.dblclick(selector):双击page.hover(selector):鼠标悬浮page.check(selector):勾选复选框page.uncheck(selector):取消勾选page.select_option(selector, value):下拉选择框page.set_input_files(selector, 文件路径):文件上传page.locator(selector):定位器,Playwright 推荐首选,自动重查询元素locator.text_content():获取元素文本locator.inner_html():获取元素 HTMLlocator.is_visible():判断元素是否可见expect(locator).to_be_visible():断言元素可见expect(locator).to_have_text():断言文本内容expect(page).to_have_url():断言页面 URLpage.route(url, handler):拦截路由,篡改请求 / 响应page.unroute():取消拦截page.set_offline(True):设置离线模式page.emulate_network():模拟弱网、限速网络page.request:直接发起 http 请求,不打开页面page.wait_for_event("dialog"):捕获 alert/confirm 弹窗page.frame_locator():定位 iframe 内部元素page.wait_for_event("page"):监听新打开标签页browser.contexts:多浏览器上下文隔离page.screenshot():页面截图,支持整页截图page.video:开启录屏,上下文级别配置绝大多数场景不需要手动等待,API 内置等待;仅特殊业务使用
page.wait_for_timeout(ms):强制固定等待(尽量少用)page.wait_for_selector(selector):等待元素出现page.wait_for_load_state("networkidle"):等待网络空闲简单 Python 示例片段
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com")
page.locator("#kw").fill("Playwright教程")
page.locator("#su").click()
browser.close()
| 维度 | Selenium | Playwright |
|---|---|---|
| 通信模型 | HTTP 短连接,每一步操作新建 HTTP 请求,频繁握手销毁 | WebSocket 持久全双工长连接,一次握手反复复用,双向消息 |
| 进程模型 | 脚本 ↔ WebDriver 驱动 ↔浏览器,进程隔离弱 | 完整多跨进程隔离:客户端 SDK、Playwright‑Server、浏览器主进程、渲染进程、网络进程互相独立 |
| 单步表面速度 | 看起来更快,不做任何状态等待,直接执行 | 单步会做自动等待校验,简单操作体感略慢;这不是性能差,是稳定性校验开销 |
| 复杂页面综合效率 | 页面动态渲染、AJAX 多的时候,需要手动 sleep/retry,大量不稳定失败,整体有效执行效率低 | 内置自动等待,一次执行成功,复杂动态页面综合执行效率更高 |
| 长时间批量执行 | 内存泄漏风险相对高 | 可精准回收 BrowserContext、页面资源,长时间跑 CI 稳定性更好 |
误区澄清:Playwright 并不是硬件执行速度慢,默认开启大量自动校验(元素可见、网络空闲、动画结束);Selenium 什么都不等直接操作,表面快,实际极易出现元素找不到、操作时机不对导致用例失败。
Selenium 链路:脚本 → HTTP请求 → WebDriver中间驱动 → 浏览器,每一步都 HTTP 往返,延迟累积。Playwright 链路:脚本 ↔ WebSocket长连接 ↔ Playwright Core ↔浏览器原生协议 ↔浏览器内核,一次连接持续通信,消除大量 HTTP 开销。
Playwright 的核心竞争力不是单纯 “跑的更快”,而是底层架构带来的更高稳定性和更丰富原生浏览器能力。
✅跳过中间驱动层,直连浏览器多进程内核
✅WebSocket 全双工长连接,消除 HTTP 频繁请求开销
✅Core 层内置全套自动等待,解决大部分 UI 自动化 “时机问题”
✅强大网络模拟、权限管控、多隔离上下文
✅丰富简洁的高层 API,locator 定位器大幅降低脚本维护成本
✅Linux 无头环境完美适配 CI 流水线
现代 Web、SPA、需要网络 mock、CI 高频回归、多内核验证,是 Playwright 的甜蜜区;老旧浏览器、海量存量脚本,不要盲目上。