1、Playwright 介绍
Playwright 是一个由 Microsoft 开发的开源自动化测试工具,主要用于 Web 应用程序的端到端测试。它支持多种主流浏览器内核,包括 Chromium(Chrome/Edge)、Firefox 和 WebKit(Safari),同时也提供了丰富的编程语言绑定,如 JavaScript、TypeScript、Python 和 C#。
本文详细介绍了 Microsoft 推出的开源自动化测试工具 Playwright。内容包括其核心特点、架构原理及与 Selenium 的性能对比。文章提供了 Python 环境安装、同步与异步代码示例、高级定位器策略、自动等待机制、断言方法及复杂 UI 场景处理方案。此外,还讲解了代码生成器使用和 Trace Viewer 调试技巧,并给出了 CI/CD 集成与最佳实践建议,旨在帮助开发者高效构建稳定的 Web 自动化测试体系。

Playwright 是一个由 Microsoft 开发的开源自动化测试工具,主要用于 Web 应用程序的端到端测试。它支持多种主流浏览器内核,包括 Chromium(Chrome/Edge)、Firefox 和 WebKit(Safari),同时也提供了丰富的编程语言绑定,如 JavaScript、TypeScript、Python 和 C#。
Playwright 的设计目标是解决现代 Web 应用测试中的复杂性,提供比传统工具更稳定、更快速的执行体验。它不仅仅是一个测试库,更是一个完整的自动化解决方案,涵盖了从脚本编写、调试到报告生成的全流程。
Playwright 的架构设计与其高性能密切相关,主要由三部分组成:
Playwright 使用 Chrome DevTools Protocol (CDP) 直接与浏览器内核通信。当测试启动时,Client 代码被转换为 JSON 格式,通过单个 WebSocket 连接发送至 Server。这种机制带来了以下优势:
相比之下,Selenium 通常使用 HTTP 协议,每个操作(如打开页面、点击按钮)都需要独立的 HTTP 请求,且每次请求后连接可能断开重建,导致整体执行速度较慢且不稳定。
Playwright 的安装过程非常简洁,无需像 Selenium 那样单独下载和管理浏览器驱动(如 chromedriver)。
# 1. 安装 Playwright Python 包
pip install playwright
# 2. 安装浏览器二进制文件(Chromium, Firefox, WebKit)
playwright install
# 3. 仅安装特定浏览器(例如只安装 Chromium)
playwright install chromium
在国内网络环境下,如果下载速度缓慢,建议更换 pip 镜像源:
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
为了保持项目依赖隔离,建议在虚拟环境中安装:
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
pip install playwright
Playwright 同时支持同步和异步两种编程模式,开发者可根据项目需求选择。
同步模式语法简单,适合初学者或简单的脚本任务:
from playwright.sync_api import sync_playwright
from time import sleep
with sync_playwright() as p:
# 启动浏览器,headless=False 表示显示浏览器窗口
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 导航到目标网址
page.goto('https://www.example.com')
# 获取页面标题
print(page.title())
# 等待 10 秒以便观察效果
sleep(10)
browser.close()
异步模式利用 asyncio 实现高并发,适合大规模测试场景:
import asyncio
from time import sleep
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.firefox.launch(headless=False)
page = await browser.new_page()
await page.goto('https://www.example.com')
title = await page.title()
print(title)
await browser.close()
asyncio.run(main())
稳定的元素定位是自动化测试成功的关键。Playwright 提供了多种强大的定位器。
page.click('#submit-button')
page.fill('.input-field', 'Hello World')
虽然不推荐作为首选,但 Playwright 仍支持 XPath:
page.click('//button[@type="submit"]')
直接根据页面上的可见文本来定位元素:
page.click('text=Submit')
page.click('text=Login')
利用 ARIA 角色进行定位,更符合无障碍规范:
page.click('role=button[name="Submit"]')
最佳实践是在 HTML 中为关键元素添加 data-testid 属性:
<button data-testid="login-btn">Login</button>
page.click('[data-testid="login-btn"]')
Playwright 最大的优势之一是自动等待。在执行大多数操作前,它会检查元素是否满足以下条件:
这意味着你不需要在代码中硬编码 sleep() 或复杂的显式等待逻辑。如果元素未就绪,Playwright 会自动重试直到超时。
# 即使按钮加载慢,click 也会自动等待其就绪
page.click('#submit-btn')
Playwright 内置了丰富的断言方法,用于验证页面状态。
# 验证元素存在
assert page.is_visible('#header')
# 验证文本内容
expect(page.locator('.title')).to_contain_text('Welcome')
# 验证 URL
expect(page).to_have_url('https://www.example.com/page')
# 验证颜色值
expect(page.locator('.box')).to_have_css('background-color', 'rgb(255, 0, 0)')
# 监听新窗口
with page.expect_popup() as popup_info:
page.click('#open-modal')
popup = popup_info.value
popup.wait_for_load_state()
page.set_input_files('input[type=file]', 'path/to/file.pdf')
frame = page.frame_locator('iframe[src="/embedded"]')
frame.locator('#inner-input').fill('Content in iframe')
Playwright 自带命令行工具,可记录用户操作并生成代码。
# 启动代码生成器
playwright codegen https://www.example.com
在弹出的浏览器中进行点击、输入等操作,右侧会实时显示对应的 Python 代码。这对于不熟悉 API 的开发人员非常友好,可作为学习起点。
当测试失败时,Trace Viewer 能提供详细的执行快照。
trace_path = 'trace.zip'
page.start_tracing(path=trace_path)
# ... 执行测试操作 ...
page.stop_tracing()
playwright show-trace trace.zip
这将打开一个交互式界面,展示每一步操作的 DOM 快照、网络请求、控制台日志和鼠标轨迹,极大简化了调试过程。
Playwright 易于集成到 GitHub Actions 等 CI 流程中。
- name: Install dependencies
run: npm ci && npx playwright install --with-deps
- name: Run tests
run: npx playwright test
data-testid 而非脆弱的 CSS/XPath。Playwright 凭借其现代化的架构、丰富的功能和优秀的开发者体验,已成为 Web 自动化测试的首选工具之一。无论是个人开发者还是企业团队,都能从中受益。掌握 Playwright 不仅能提升测试效率,还能推动研发流程的质量保障体系建设。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online