写点什么

Playwright 与 PyTest 结合指南

  • 2025-08-26
    黑龙江
  • 本文字数:3042 字

    阅读完需:约 10 分钟

Playwright 与 PyTest 的结合,为 Web 自动化测试带来了强大的动力。它让你既能利用 Playwright 现代、跨浏览器的自动化能力,又能借助 PyTest 成熟测试框架的结构化、可扩展性来高效管理和组织测试用例。我会带你了解如何将这两者结合使用。


测试开发全景图:人工智能测试、智能驱动、自动化、测试开发、左移右移与DevOps的持续交付


为了让你快速上手,我先用一个流程图来概括 Playwright 与 PyTest 结合使用的核心步骤和关键配置:


flowchart TD    A[安装Playwright与PyTest] --> B[编写测试用例<br>使用page fixture与断言]    B --> C{配置与执行}        C --> D[命令行参数配置<br>--headed, --browser等]    C --> E[配置文件设置<br>pytest.ini]    C --> F[Fixtures深度使用<br>自定义作用域与参数]        D --> G[高级技巧]    E --> G    F --> G        subgraph G [高级技巧与优化]        H[并行测试<br>pytest-xdist]        I[跳过测试<br>pytest.mark.skip]        J[移动端模拟与<br>多浏览器矩阵测试]        K[录制功能生成用例<br>codegen]    end        G --> L[生成可视化报告<br>如Allure]
复制代码


下面我们来详细看看各个环节。

🛠️ 安装与环境搭建

首先,你需要安装pytestpytest-playwright插件,并安装 Playwright 所需的浏览器驱动。


# 1. 安装pytest和pytest-playwright插件pip install pytest pytest-playwright
# 2. 安装Playwright浏览器驱动(安装较慢,耐心等待)playwright install
复制代码

✍️ 编写你的第一个测试用例

创建一个测试文件(如test_example.py),PyTest 会自动发现以test_开头的文件或函数。


import pytestfrom playwright.sync_api import Page
# 使用page fixture,它由pytest-playwright提供def test_visit_baidu(page: Page): # 将page fixture作为参数注入 page.goto("https://www.baidu.com") page.fill('//*[@id="kw"]', "Playwright") # 使用XPath定位搜索框并输入 page.click('#su') # 使用CSS选择器定位并点击“百度一下”按钮 assert "Playwright" in page.title() # 断言页面标题包含特定文本 print(page.title) # 打印当前页面标题
复制代码

⚙️ 配置与执行测试

PyTest-P laywright 提供了丰富的命令行参数(CLI)来灵活控制测试行为:



你可以通过pytest.ini文件预设这些参数,避免每次手动输入:


# pytest.ini[pytest]addopts = --headed --browser chromium --slowmo 100 --video on --screenshot on
复制代码

📁 Fixtures 的深度使用

Fixtures 是 PyTest 的核心功能,用于设置和清理测试环境。pytest-playwright提供了开箱即用的 fixtures。


1. 使用内置 Fixtures 最常用的是page fixture,它为你提供了一个全新的浏览器页面。


def test_my_app(page: Page):    page.goto("https://example.com")    # ... 你的测试逻辑
复制代码


2. Fixture 的作用域 (Scope)Fixtures 可以有不同的作用域,控制其创建和销毁的频率。


@pytest.fixture(scope='module') # 该fixture在整个模块中只执行一次def browser():    with sync_playwright() as p:        browser = p.chromium.launch()        yield browser # 提供浏览器实例给测试用例        browser.close() # 所有测试完成后关闭浏览器
def test_example_1(browser): # 在不同的测试中复用同一个浏览器实例 page = browser.new_page() # ...
复制代码


3. 覆盖 Fixtures 的默认选项你可以自定义浏览器或上下文的启动参数。


# conftest.pyimport pytest
@pytest.fixture(scope="session")def browser_context_args(browser_context_args): return {**browser_context_args, "ignore_https_errors": True} # 忽略HTTPS错误
# 或在测试用例中直接标记以覆盖特定上下文的选项@pytest.mark.browser_context_args(timezone_id="Europe/Berlin", locale="de-DE")def test_with_custom_timezone(page): # 这个测试将在欧洲/柏林时区运行
复制代码

🧰 高级技巧与最佳实践

  1. 并行测试:使用pytest-xdist插件可以显著缩短大型测试集的运行时间。


    pip install pytest-xdist    pytest --numprocesses auto # 根据CPU核心数自动创建worker进程
复制代码


  1. 跳过测试:可以使用 PyTest 的skip标记根据条件跳过测试。


    import pytest
@pytest.mark.skip("skip this test for now") # 无条件跳过 def test_skip_example(): pass
@pytest.mark.skip_browser("firefox") # 自定义标记(需实现),跳过特定浏览器 def test_skip_firefox(page): pass
复制代码


  1. 录制生成代码:Playwright 的 Codegen 功能可以录制你的操作并生成 PyTest 代码。


    playwright codegen --target python-pytest -o test_recording.py https://baidu.com
复制代码


  1. 页面对象模式 (Page Object Model):对于复杂项目,强烈建议使用页面对象模式来分离页面元素定位和操作逻辑,提高代码的可维护性和可读性。


    # 示例:一个简单的页面对象    class BaiduPage:        def __init__(self, page: Page):            self.page = page            self.search_input = page.locator("#kw")            self.search_button = page.locator("#su")
def search(self, keyword): self.search_input.fill(keyword) self.search_button.click()
# 在测试中使用 def test_using_pom(page: Page): baidu_page = BaiduPage(page) baidu_page.search("Playwright") # ... 断言
复制代码


  1. 移动端模拟与多浏览器测试:Playwright 可以模拟移动设备,并利用 PyTest 的参数化功能进行多浏览器测试。


    import pytest    from playwright.sync_api import sync_playwright
# 多浏览器参数化测试 @pytest.mark.parametrize("browser_type", ["chromium", "firefox", "webkit"]) def test_cross_browser(browser_type): with sync_playwright() as p: browser = getattr(p, browser_type).launch() # ... 测试逻辑 browser.close()
# 移动端模拟 def test_mobile_emulation(playwright): # 使用playwright fixture iphone_12 = playwright.devices['iPhone 12 Pro'] browser = playwright.webkit.launch() context = browser.new_context(**iphone_12) page = context.new_page() page.goto("https://m.example.com") # ... 移动端测试逻辑 browser.close()
复制代码

💡 常见问题与排查

  • Fixtures 未注入:确保测试函数的参数名与 fixture 名称完全一致(例如page)。

  • 异步与同步 API:上述示例均使用同步 API。Playwright 也支持异步(async/await),如需使用异步,请确保使用async def定义测试函数,并使用from playwright.async_api import Page

  • 元素定位问题:充分利用 Playwright 强大的定位器(locator),如page.locator('css=button').click(),并配合page.wait_for_selector()等等待方法避免竞态条件。

  • 查看详细输出:运行测试时添加-v-s参数(如pytest -v -s)可以获取更详细的输出和打印语句。


测试开发全景图:人工智能测试、智能驱动、自动化、测试开发、左移右移与DevOps的持续交付




Playwright 与 PyTest 的结合,为你提供了一个功能全面、易于编写且易于维护的现代 Web 自动化测试方案。从简单的脚本到复杂的企业级测试套件,这个组合都能应对自如。


希望这份指南能帮助你快速上手。实践出真知,多写多试,你就会越来越熟练。

用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
Playwright与PyTest结合指南_#人工智能_测吧(北京)科技有限公司_InfoQ写作社区