Playwright 中特定的 Fixtures

Playwright 为 pytest 提供了一组专门的 fixtures,用于简化浏览器自动化测试的编写。这些 fixtures 管理浏览器、上下文和页面的生命周期,让测试更加简洁高效。

常用 Playwright Fixtures 列表

以下是 Playwright 最常用的 pytest fixtures:

  1. playwright - Playwright 实例
  2. browser - 浏览器实例
  3. browser_name - 当前浏览器名称
  4. browser_channel - 浏览器渠道
  5. context - 浏览器上下文
  6. page - 页面实例
  7. 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

运行原理

  1. 初始化阶段

    • playwright fixture 初始化 Playwright 实例
    • browser fixture 使用 Playwright 实例启动浏览器
    • context fixture 创建浏览器上下文
    • page fixture 在上下文中创建新页面
  2. 测试执行阶段

    • 测试函数接收配置好的 page 或其他 fixtures
    • 执行测试逻辑
  3. 清理阶段

    • 按照创建的反向顺序自动清理资源
    • 先关闭 page,然后 context,最后 browser

最佳实践

  1. 大多数测试只需使用 page fixture
  2. 需要特殊配置时才使用底层 fixtures
  3. 使用 browser_context_args 定制默认上下文设置
  4. 对于需要登录的测试,可以创建自定义 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")
    # 测试代码...
相关推荐
2601_9563198810 小时前
2026年零基础学量化:从看懂示例到写清条件和动作
人工智能·python
过期的秋刀鱼!11 小时前
LangChain-D1-模型的工作流程
人工智能·python·langchain
萤火工厂目视化设计11 小时前
智能制造与企业文化目视化浪潮下:中小工厂的机遇与挑战
python·制造
DeepVisionary12 小时前
从GPT-5.6 Sol的Ultrafast模式看推理速度竞赛:750 token/秒背后,Cerebras的晶圆级生意
python·自动化
leisoo809713 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
小柯南敲键盘13 小时前
跨马翻译:跨境电商批量图片翻译与视频字幕一站式工具
人工智能·python·音视频
卷无止境14 小时前
FastAPI Guard 全解析,从概念到工程落地的实战指南
后端·python
卷无止境14 小时前
FastAPI Users 全面解析:概念、原理与工程实战
后端·python
COOLMO研究AI14 小时前
Python 如何在 AI 接口中实现请求幂等性:防止重复提交与重复扣费
人工智能·python·php
CTA量化套保14 小时前
新手学量化,先做能复查的小流程
人工智能·python