写在前面
当 UI 自动化用例数量从 30 条增长到 300+ 时,团队会遇到一个典型痛点:
单线程执行太慢,回归需要 1–2 小时甚至更久。
而 Playwright 天然支持多浏览器并发(Browser Parallel Execution),正确使用可以让 执行速度提升 3~10 倍。
但企业落地中往往遇到:
-
• 并发导致元素争抢(测试互相影响) -
• Session混乱(Cookie丢失) -
• 服务器或测试环境抗压不足 -
• CI并发比本地更容易失败
本教程将带你:
-
• ✔ 正确开启 Playwright多浏览器并发 -
• ✔ Pytest xdist提升回归速度 -
• ✔ 浏览器 Context隔离,避免共享Session -
• ✔ 在 CI/GitHub Actions中稳定并发执行 -
• ✔ 结合 Saucedemo完整演示可运行代码
目录
-
• 多浏览器并发原理: BrowservsContextvsPage -
• 单台机器的并发策略(最佳并发度) -
• 使用 Pytest并发执行Playwright测试 -
• 多浏览器实例并发:可运行示例 -
• 如何避免 Session 冲突( Saucedemo实战) -
• CI并行执行(GitHub Actions/Jenkins) -
• 企业级实战:分布式并发 -
• 常见问题( FAQ)
多浏览器并发原理
Playwright 运行架构:
Browser(浏览器实例)
│
├── BrowserContext(上下文 / 独立 Session)
│ ├── Page(页面)
│ ├── Page
│
├── BrowserContext
🌟 企业级最佳实践
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
本地并发度建议(非常重要)
不要盲目开启 20 并发,否则机器会炸(CPU 100%、内存爆满)。
推荐值:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
你可以通过:
pytest -n auto
让 pytest 根据 CPU 自动调度。
使用 Pytest xdist 并发 Playwright 测试
安装依赖:
pip install pytest-xdist
执行:
pytest -n 4
或自动:
pytest -n auto
可运行示例:多浏览器实例并发(Python)
下面示例使用 pytest-xdist + Playwright 并发执行多个测试文件。
📁 目录结构推荐
tests/
│── conftest.py
│── test_inventory.py
│── test_cart.py
│── test_checkout.py
auth/
│── login.py
│── storage_state.json
conftest.py(可运行)
import pytest
from playwright.sync_api import sync_playwright
import login # 自动生成 storage_state.json
@pytest.fixture(scope="session")
def storage_state():
login.main()
return "auth/storage_state.json"
@pytest.fixture(scope="function")
def page(storage_state):
"""每个测试创建独立 Browser & Context,避免并发冲突"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(storage_state=storage_state)
page = context.new_page()
yield page
context.close()
browser.close()
为什么使用 scope="function"?
-
• 每条测试独立 Browser→ 永不共享Session -
• 并发互不影响 -
• CI更稳定
示例测试(全部可运行)
test_inventory.py
def test_inventory_page(page):
page.goto("https://www.saucedemo.com/inventory.html")
assert page.locator(".inventory_item").count() > 0
test_cart.py
def test_add_to_cart(page):
page.goto("https://www.saucedemo.com/inventory.html")
page.click("text=Add to cart", timeout=3000)
page.goto("https://www.saucedemo.com/cart.html")
assert page.locator(".cart_item").count() == 1
test_checkout.py
def test_checkout_flow(page):
page.goto("https://www.saucedemo.com/inventory.html")
page.click("text=Add to cart")
page.goto("https://www.saucedemo.com/cart.html")
page.click("text=Checkout")
page.fill("#first-name", "Tester")
page.fill("#last-name", "Automation")
page.fill("#postal-code", "00000")
page.click("text=Continue")
page.click("text=Finish")
assert "complete" in page.url
如何避免并发时的 Session 冲突?
Saucedemo 登录虽然简单,但仍需注意:
-
• ❌ 不要共享一个 BrowserContext -
• 否则多个测试修改同一 Session → 冲突 -
• ❌ 不要使用全局 Page -
• Page 是浏览器 Tab,会争抢焦点,导致: -
• 定位失败 -
• 不同测试影响彼此
✅ 最佳实践:每条测试用例一个 Browser
即:
browser = p.chromium.launch()
context = browser.new_context(storage_state="state.json")
这样可以:
-
• ✔ 每个用例的 Session 独立 -
• ✔ 登录态来自 storageState,不会相互覆盖 -
• ✔ 并发安全又稳定
CI 并行执行(GitHub Actions / Jenkins)
GitHub Actions 示例(可用)
name: Playwright Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
workers: [2, 4] # 并行配置
steps:
- uses: actions/checkout@v3
- name: Install Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
pip install pytest pytest-xdist playwright
playwright install
- name: Run tests
run: pytest -n ${{ matrix.workers }}
企业级实战:分布式并发(可加速 50 倍)
适用于 1000+ 回归用例的 UI 自动化体系。
常见方式:
🟦 方案 1:多机器并行(Jenkins)
Worker1 → 测试 A-M
Worker2 → 测试 N-Z
Worker3 → 专跑冒烟
🟩 方案 2:企业内部“用例切片”
根据业务模块分片:
商品 & 购物车
订单 & 支付
营销模块
权限模块
🟨 方案 3:结合 Docker + Playwright
不同容器独立执行,不互相干扰。
FAQ — 常见问题
-
• ❓ 多浏览器并发是否比多 Context更稳定? -
• 是的。 -
• Browser→ 完全进程隔离 -
• Context→ 单进程多Session,仍可能极端情况互相影响
企业推荐:Browser 并发。
-
• ❓ 并发执行时 CPU爆满怎么办? -
• 降低并发度:
pytest -n 4
并为 CI 设置:
n = CPU 核心数的 0.6 倍
-
• ❓ 网络不稳定时如何提高成功率?
加入重试:
pytest --reruns 2 --reruns-delay 3
总结
本教程提供了:
-
• ✔ Playwright 并发架构原理 -
• ✔ Pytest 并发执行(可运行代码) -
• ✔ 企业级 Session 隔离方案 -
• ✔ CI 中的并发执行 -
• ✔ 分布式并发最佳实践
如果你将并发执行加入测试体系,整体速度可提升 3~10 倍。

