一、项目简介
Playwright 是由微软开发的现代化浏览器自动化库,支持通过统一 API 控制 Chromium、Firefox、WebKit 三大浏览器引擎。其核心特性包括:
- 跨浏览器兼容性:一套代码适配所有主流浏览器
- 自动等待机制:智能等待元素就绪,告别随机失败
- 强大网络控制:支持请求拦截、模拟和修改
- 移动设备模拟:内置 50+ 种设备参数,轻松适配移动端
- 同步/异步双模式:兼顾易用性与执行效率
本文介绍微软开发的 Playwright 浏览器自动化库。涵盖安装部署、核心功能(跨浏览器、自动等待、网络控制)、基础操作、元素定位、高级功能(请求拦截、设备模拟、异步模式)及最佳实践。通过 Pytest 集成测试,提供调试技巧与常见问题解决方案,帮助开发者构建可靠的 Web 自动化测试体系。
Playwright 是由微软开发的现代化浏览器自动化库,支持通过统一 API 控制 Chromium、Firefox、WebKit 三大浏览器引擎。其核心特性包括:
# 安装核心库
pip install playwright
# 下载浏览器二进制文件(自动识别系统环境)
python -m playwright install
# 安装 Pytest 插件(可选)
pip install pytest-playwright
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://playwright.dev")
print(page.title()) # 应输出 "Playwright"
browser.close()
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 启动浏览器(有头模式便于调试)
browser = p.chromium.launch(headless=False)
# 创建新上下文(隔离环境)
context = browser.new_context()
# 打开页面
page = context.new_page()
# 基础操作示例
page.goto("https://baidu.com")
page.fill("input[name=wd]", "Playwright 教程")
page.click("text=百度一下")
# 截图保存
page.screenshot(path="search_result.png")
# 关闭资源
context.close()
browser.close()
# 文本选择器(推荐)
page.click("text=立即购买")
# CSS 选择器
page.fill(".search-box", "关键词")
# XPath 选择器
page.click('//button[@id="submit"]')
# 响应式选择器(自动适配移动端)
page.locator("button:visible").click()
def test_api_mock():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# 启用请求拦截
page.route("**/api/data", lambda route: route.fulfill(
status=200,
json={"message": "Custom Response"}
))
page.goto("https://example.com")
assert page.locator(".data-display").text_content() == "Custom Response"
browser.close()
def test_mobile_view():
with sync_playwright() as p:
iphone = p.devices['iPhone 12']
browser = p.chromium.launch()
# 创建移动设备上下文
context = browser.new_context(**iphone, locale='zh-CN', timezone_id='Asia/Shanghai')
page = context.new_page()
page.goto("https://m.taobao.com")
page.screenshot(path="mobile_view.png")
context.close()
browser.close()
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto("https://example.com")
await browser.close()
asyncio.run(main())
# pytest_playwright 示例
import pytest
@pytest.fixture(scope="function")
def browser():
pw = sync_playwright().start()
browser = pw.chromium.launch()
yield browser
browser.close()
def test_search(browser):
page = browser.new_page()
page.goto("https://bing.com")
page.fill("input[name=q]", "Playwright 最佳实践")
page.click("text=搜索")
assert "Playwright 最佳实践" in page.content()
# 日志记录配置
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# 截图辅助调试
try:
page.click("#submit")
except Exception as e:
page.screenshot(path="error_debug.png")
raise e
# 并行执行配置(pytest.ini)
# [pytest]
# addopts = -n auto
# 资源复用
def test_parallel():
with sync_playwright() as p:
contexts = []
for _ in range(10):
contexts.append(p.chromium.launch().new_context())
# 并行执行测试...
Q1: 安装时提示"Permission denied"
A: 使用以下命令修复权限:
sudo chown -R $USER ~/.cache/playwright
Q2: 元素定位失败
A: 尝试以下方法:
# 增加等待时间
page.wait_for_selector(".target-element")
# 使用更鲁棒的选择器
page.locator("text=立即购买 >> nth=0").click()
Q3: 如何处理登录认证
A: 使用存储状态功能:
context = browser.new_context(storage_state="auth_state.json")
# 或手动输入凭证
page.fill("#username", "admin")
page.fill("#password", "123456")
page.click("#login")
Playwright 通过其现代化的设计和丰富的功能集,已成为 Web 自动化领域的首选工具。其核心优势体现在:
建议开发者从基础操作入手,逐步掌握网络拦截、设备模拟等高级功能,结合项目需求构建完整的自动化测试体系。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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