Pytest 插件参考
简介
Playwright 提供了一个 Pytest 插件来编写端到端测试。要开始使用它,请参考 入门指南。
用法
要运行测试,请使用 Pytest CLI。
pytest --browser webkit --headed
如果要自动添加 CLI 参数而无需指定它们,可以使用 pytest.ini 文件
# content of pytest.ini
[pytest]
# Run firefox with UI
addopts = --headed --browser firefox
CLI 参数
请注意,CLI 参数仅应用于默认的 browser
、context
和 page
固定装置。如果使用 API 调用(如 browser.new_context())创建浏览器、上下文或页面,则不会应用 CLI 参数。
--headed
:以有头模式运行测试(默认:无头)。--browser
:在不同的浏览器chromium
、firefox
或webkit
中运行测试。可以多次指定(默认:chromium
)。--browser-channel
要使用的 浏览器通道。--slowmo
以指定的毫秒数减慢 Playwright 操作速度。有助于查看正在发生的事情(默认:0)。--device
要模拟的 设备。--output
测试产生的工件的目录(默认:test-results
)。--tracing
是否为每个测试录制 跟踪。on
、off
或retain-on-failure
(默认:off
)。--video
是否为每个测试录制视频。on
、off
或retain-on-failure
(默认:off
)。--screenshot
是否在每次测试后自动捕获屏幕截图。on
、off
或only-on-failure
(默认:off
)。--full-page-screenshot
失败时是否拍摄全页面屏幕截图。默认情况下,仅捕获视口。需要启用--screenshot
(默认:off
)。
固定装置
此插件配置特定于 Playwright 的 pytest 固定装置。要使用这些固定装置,请将固定装置名称用作测试函数的参数。
def test_my_app_is_working(fixture_name):
pass
# Test using fixture_name
# ...
函数作用域:这些固定装置在测试函数中请求时创建,并在测试结束时销毁。
context
:测试的新的 浏览器上下文。page
:测试的新的 浏览器页面。new_context
:允许为测试创建不同的 浏览器上下文。对于多用户场景很有用。接受与 browser.new_context() 相同的参数。
会话作用域:这些固定装置在测试函数中请求时创建,并在所有测试结束时销毁。
playwright
:Playwright 实例。browser_type
:当前浏览器的 BrowserType 实例。browser
:Playwright 启动的 Browser 实例。browser_name
:浏览器名称(字符串)。browser_channel
:浏览器通道(字符串)。is_chromium
、is_webkit
、is_firefox
:分别对应浏览器类型的布尔值。
自定义固定装置选项:对于 browser
和 context
固定装置,请使用以下固定装置来定义自定义启动选项。
browser_type_launch_args
:覆盖 browser_type.launch() 的启动参数。它应该返回一个字典。browser_context_args
:覆盖 browser.new_context() 的选项。它应该返回一个字典。
还可以使用 browser_context_args
标记覆盖单个测试的上下文选项(browser.new_context())
import pytest
@pytest.mark.browser_context_args(timezone_id="Europe/Berlin", locale="en-GB")
def test_browser_context_args(page):
assert page.evaluate("window.navigator.userAgent") == "Europe/Berlin"
assert page.evaluate("window.navigator.languages") == ["de-DE"]
并行处理:同时运行多个测试
如果您的测试在具有大量 CPU 的机器上运行,则可以通过使用 pytest-xdist
同时运行多个测试来加快测试套件的整体执行时间。
# install dependency
pip install pytest-xdist
# use the --numprocesses flag
pytest --numprocesses auto
根据硬件和测试的性质,您可以将 numprocesses
设置为从 2
到机器上 CPU 数量的任意值。如果设置过高,您可能会注意到意外行为。
有关 pytest
选项的一般信息,请参阅 运行测试。
示例
为自动完成功能配置 Mypy 类型提示
from playwright.sync_api import Page
def test_visit_admin_dashboard(page: Page):
page.goto("/admin")
# ...
配置慢动作
使用 --slowmo
参数以慢动作运行测试。
pytest --slowmo 100
将 Playwright 操作速度减慢 100 毫秒。
按浏览器跳过测试
import pytest
@pytest.mark.skip_browser("firefox")
def test_visit_example(page):
page.goto("https://example.com")
# ...
在特定浏览器上运行
import pytest
@pytest.mark.only_browser("chromium")
def test_visit_example(page):
page.goto("https://example.com")
# ...
使用自定义浏览器通道(如 Google Chrome 或 Microsoft Edge)运行
pytest --browser-channel chrome
def test_example(page):
page.goto("https://example.com")
配置基本 URL
使用 base-url
参数启动 Pytest。为此使用 pytest-base-url
插件,它允许您从配置、CLI 参数或作为固定装置设置基本 URL。
pytest --base-url https://127.0.0.1:8080
def test_visit_example(page):
page.goto("/admin")
# -> Will result in https://127.0.0.1:8080/admin
忽略 HTTPS 错误
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"ignore_https_errors": True
}
使用自定义视口大小
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {
"width": 1920,
"height": 1080,
}
}
设备模拟
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args, playwright):
iphone_11 = playwright.devices['iPhone 11 Pro']
return {
**browser_context_args,
**iphone_11,
}
或通过 CLI --device="iPhone 11 Pro"
与 unittest.TestCase
结合使用
有关与 unittest.TestCase
结合使用的示例,请参阅以下示例。这有一个限制,即只能指定一个浏览器,并且在指定多个浏览器时不会生成多个浏览器的矩阵。
import pytest
import unittest
from playwright.sync_api import Page
class MyTest(unittest.TestCase):
@pytest.fixture(autouse=True)
def setup(self, page: Page):
self.page = page
def test_foobar(self):
self.page.goto("https://microsoft.com")
self.page.locator("#foobar").click()
assert self.page.evaluate("1 + 1") == 2
调试
与 pdb 结合使用
在测试代码中使用 breakpoint()
语句暂停执行并获取 pdb REPL。
def test_bing_is_working(page):
page.goto("https://bing.com")
breakpoint()
# ...
部署到 CI
请参阅 CI 提供商指南,将您的测试部署到 CI/CD。