Playwright 为 pytest 提供了一组专门的 fixtures,用于简化浏览器自动化测试的编写。这些 fixtures 管理浏览器、上下文和页面的生命周期,让测试更加简洁高效。
常用 Playwright Fixtures 列表
以下是 Playwright 最常用的 pytest fixtures:
playwright
- Playwright 实例browser
- 浏览器实例browser_name
- 当前浏览器名称browser_channel
- 浏览器渠道context
- 浏览器上下文page
- 页面实例is_webkit
,is_firefox
,is_chromium
- 浏览器类型检查
安装和配置
首先需要安装必要的包:
bash
pip install pytest-playwright
playwright install
各 Fixture 详解及示例
1. playwright
fixture
作用:提供 Playwright 的初始实例
示例:
python
def test_with_playwright(playwright):
chromium = playwright.chromium
browser = chromium.launch()
# 测试代码...
browser.close()
原理:管理 Playwright 的启动和清理,是其他浏览器相关 fixtures 的基础
2. browser
fixture
作用:提供已启动的浏览器实例
示例:
python
def test_with_browser(browser):
page = browser.new_page()
page.goto("https://example.com")
assert "Example" in page.title()
原理:
- 测试开始时自动启动浏览器
- 测试结束后自动关闭浏览器
- 默认使用 Chromium,可通过命令行参数更改
3. browser_name
fixture
作用:获取当前测试使用的浏览器名称
示例:
python
def test_browser_name(browser, browser_name):
print(f"Running test on {browser_name}")
assert browser_name in ["chromium", "firefox", "webkit"]
4. context
fixture
作用:提供浏览器上下文实例
示例:
python
def test_with_context(context):
page = context.new_page()
page.goto("https://example.com")
assert page.url == "https://example.com/"
原理:
- 浏览器上下文相当于一个独立的浏览器会话
- 隔离 cookies 和本地存储
- 测试结束后自动关闭
5. page
fixture (最常用)
作用:提供已创建的页面实例
示例:
python
def test_example(page):
page.goto("https://example.com")
heading = page.get_by_role("heading", name="Example Domain")
assert heading.is_visible()
原理:
- 每个测试自动创建新页面
- 测试结束后自动关闭页面
- 包含所有常用的页面操作方法
高级配置示例
自定义浏览器选项
在 conftest.py
中:
python
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {"width": 1920, "height": 1080},
"ignore_https_errors": True
}
多浏览器测试
运行不同浏览器的测试:
bash
pytest --browser chromium --browser firefox --browser webkit
对应的测试文件:
python
def test_multi_browser(page, browser_name):
page.goto("https://example.com")
if browser_name == "firefox":
# Firefox 特定的断言
pass
elif browser_name == "webkit":
# WebKit 特定的断言
pass
Fixture 作用域控制
Playwright fixtures 默认作用域是"function"(每个测试函数一个实例),但可以调整:
python
@pytest.fixture(scope="module")
def shared_page(page):
# 这个 page 将在整个模块中共享
yield page
运行原理
-
初始化阶段:
playwright
fixture 初始化 Playwright 实例browser
fixture 使用 Playwright 实例启动浏览器context
fixture 创建浏览器上下文page
fixture 在上下文中创建新页面
-
测试执行阶段:
- 测试函数接收配置好的 page 或其他 fixtures
- 执行测试逻辑
-
清理阶段:
- 按照创建的反向顺序自动清理资源
- 先关闭 page,然后 context,最后 browser
最佳实践
- 大多数测试只需使用
page
fixture - 需要特殊配置时才使用底层 fixtures
- 使用
browser_context_args
定制默认上下文设置 - 对于需要登录的测试,可以创建自定义 fixture 重用认证状态
python
@pytest.fixture
def authenticated_page(page):
page.goto("/login")
page.fill("#username", "testuser")
page.fill("#password", "password")
page.click("text=Sign in")
# 确保登录成功
assert page.url == "/dashboard"
return page
def test_dashboard(authenticated_page):
authenticated_page.goto("/dashboard")
# 测试代码...