目录
[CLI 参数](#CLI 参数)
[使用自定义浏览器通道(如Google Chrome或Microsoft Edge)运行](#使用自定义浏览器通道(如Google Chrome或Microsoft Edge)运行)
[使用 pdb](#使用 pdb)
简介
Playwright 提供了一个 Pytest 插件,用于编写端到端测试。要开始使用它,请参考入门指南。该插件使您能够利用 Pytest 的测试框架功能来组织和运行您的 Playwright 测试,同时享受 Playwright 提供的丰富 API 和功能,以模拟用户在浏览器中的行为。
用法
要使用 Pytest CLI 运行您的测试,请执行以下命令:
pytest --browser webkit --headed
这个命令会启动 Playwright 的 WebKit 浏览器(类似于 Safari),并以有界面的模式(headed mode)运行测试,这样您就可以看到浏览器在执行测试时的操作。
如果您希望在不手动指定 CLI 参数的情况下自动添加这些参数,您可以在项目的根目录下创建一个 pytest.ini文件,并在其中配置 addopts
选项。例如:
# pytest.ini 文件的内容
[pytest]
# 使用 Firefox 浏览器并以有界面的模式运行测试
addopts = --headed --browser firefox
CLI 参数
请注意,CLI 参数仅适用于默认的浏览器、上下文和页面夹具(fixtures)。如果您通过 API 调用(如 browser.new_context())创建浏览器、上下文或页面,则 CLI 参数不会应用于这些实例。
--headed
:以有界面的模式运行测试(默认为无界面模式,即 headless)。--browser
:指定运行测试时使用的浏览器,可以是 chromium、firefox 或 webkit。此选项可以多次指定(默认为 chromium)。--browser-channel
:指定要使用的浏览器通道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)
夹具(Fixtures)
此插件为 pytest 配置了 Playwright 特定的夹具(fixtures)。要使用这些夹具,请将夹具名称作为参数传递给测试函数。
def test_my_app_is_working(fixture_name):
pass
# 使用 fixture_name 进行测试
# ...
函数作用域(Function Scope):这些夹具在测试函数中请求时创建,并在测试结束时销毁。
context
:为测试创建的新浏览器上下文。page
:为测试创建的新浏览器页面。new_context
:允许为测试创建不同的浏览器上下文。这对于多用户场景很有用。它接受与browser.new_context()
相同的参数。
会话作用域(Session Scope):这些夹具在测试函数中请求时创建,并在所有测试结束时销毁。
playwright
:Playwright 实例。browser_type
:当前浏览器的BrowserType
实例。browser
:由 Playwright 启动的浏览器实例。browser_name
:浏览器名称(字符串形式)。browser_channel
:浏览器通道(字符串形式)。is_chromium
、is_webkit
、is_firefox
:分别对应浏览器类型的布尔值。
自定义夹具选项:对于浏览器和上下文夹具,使用以下夹具来定义自定义启动选项。
browser_type_launch_args
:覆盖browser_type.launch()
的启动参数。它应该返回一个字典(Dict)。browser_context_args
:覆盖browser.new_context()
的选项。它应该返回一个字典(Dict)。
通过这些自定义选项,您可以为不同的测试场景配置不同的浏览器启动参数和上下文选项,以满足不同的测试需求。
也可以通过使用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 插件来同时运行多个测试,从而加快你的测试套件的整体执行时间:
# 安装依赖
pip install pytest-xdist
# 使用 --numprocesses 标志
pytest --numprocesses auto
根据你的硬件和测试的性质,你可以将numprocesses
设置为从2到机器上CPU数量的任何值。如果设置得太高,你可能会注意到一些意外的行为。
有关pytest
选项的一般信息,请参阅运行测试Running Tests部分。
示例
为自动补全配置Mypy类型注解
#test_my_application.py
from playwright.sync_api import Page
def test_visit_admin_dashboard(page: Page):
page.goto("/admin")
# ...
test_visit_admin_dashboard
函数使用了 Playwright 的同步 API。该函数的参数 page
被注解为 Page
类型,这是 Playwright 提供的用于与浏览器页面交互的类。通过使用类型注解,你可以享受到来自IDE或代码编辑器的自动补全功能,以及类型检查工具(如Mypy)提供的类型检查优势。
配置慢速模式
使用 --slowmo
参数以慢动作模式运行测试
pytest --slowmo 100
这会将 Playwright 的操作速度减慢 100 毫秒。这对于观察测试的执行过程或调试问题非常有用。
按浏览器跳过测试
你可以使用 pytest 的自定义标记(marker)功能来定义一个特殊的标记,比如 skip_browser
,用于根据浏览器的类型跳过特定的测试。但是,需要注意的是,pytest 本身并不直接提供名为 skip_browser
的内置标记。因此,你需要先定义这个标记,并在测试执行时根据条件判断是否跳过测试。
然而,Playwright 并不直接通过 pytest 标记来识别浏览器类型,因为浏览器类型的选择通常是在 Playwright 的配置或测试夹具(fixture)中完成的。不过,你可以通过一些方法间接实现按浏览器跳过测试。
import pytest
# 定义一个自定义的 pytest 标记
def pytest_configure(config):
config.addinivalue_line(
"markers",
"skip_browser(browser): mark test to skip if run on the specified browser"
)
# 假设你有一个能够获取当前浏览器类型的函数或夹具
# 这里我们用一个模拟的浏览器类型作为示例
def get_browser_type():
# 这里应该返回实际的浏览器类型,比如 'chromium', 'firefox', 'webkit'
# 但为了示例,我们直接返回一个固定的值
return "firefox"
# 使用自定义的 skip_browser 标记
@pytest.mark.skip_browser("firefox")
def test_visit_example(page, browser_info):
# 假设 browser_info 是一个包含浏览器类型信息的夹具
if browser_info == "firefox":
pytest.skip("Skipping test on Firefox browser")
page.goto("https://example.com")
# ...
# 注意:上面的 test_visit_example 函数中的 browser_info 并没有在示例中定义
# 你需要在实际的测试环境中定义一个能够返回浏览器类型信息的夹具
# 并在测试函数调用时传递它
# 示例夹具(并非真实代码,仅用于说明)
# @pytest.fixture
# def browser_info():
# # 这里应该返回当前的浏览器类型
# return get_browser_type()
# 但是,由于 Playwright 的浏览器类型通常在 Playwright 夹具中配置
# 你可能需要以不同的方式获取浏览器类型信息
# 例如,通过修改 Playwright 夹具来返回浏览器类型
在特定的浏览器上运行
conftest.py
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
# test_my_application.py
def test_example(page):
page.goto("https://example.com")
配置基本url
在使用Pytest运行测试时,可以通过--base-url
参数来设置基础URL。为了实现这一点,通常会使用pytest-base-url
插件,这个插件允许你从配置文件、命令行参数或作为夹具(fixture)来设置基础URL。
pytest --base-url http://localhost:8080
# test_my_application.py
def test_visit_example(page):
page.goto("/admin")
# -> Will result in http://localhost:8080/admin
忽略HTTPS错误
# conftest.py
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"ignore_https_errors": True
}
使用自定义视窗大小
# conftest.py
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {
"width": 1920,
"height": 1080,
}
}
设备模拟
在conftest.py
文件中,你可以使用pytest
的夹具(fixture)来配置Playwright的浏览器上下文(browser context),以便进行设备模拟。设备模拟允许你测试网站或应用在不同设备上的表现,比如模拟iPhone 11 Pro的屏幕大小和用户代理字符串。
以下是一个使用pytest
和playwright
进行设备模拟的示例,该示例定义了一个名为browser_context_args
的夹具,它接受browser_context_args
和playwright
作为参数,并返回一个包含iPhone 11 Pro设备参数的字典,这些参数将被用于配置浏览器上下文。
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,
}
或者通过命令行------device="iPhone 11 Pro"
调试
使用 pdb
在你的测试代码中,使用 breakpoint()
语句可以暂停执行并获取一个 pdb REPL(Read-Eval-Print Loop,即 Python 的交互式调试环境)。这样,你就可以在代码执行到该点时检查变量值、执行代码片段等,从而帮助你理解代码的行为或定位问题。
def test_bing_is_working(page):
page.goto("https://bing.com")
breakpoint() # 在这里暂停执行,并进入 pdb REPL
# ... (原本这里可能会有一些断言或其他测试逻辑)
当 Python 解释器执行到 breakpoint()
语句时,如果它检测到当前环境支持调试(并且没有禁用断点),它就会暂停执行,并启动 pdb。在 pdb 中,你可以输入各种命令来检查程序的状态,比如使用 l
(list)来查看当前位置的代码,使用 p
(print)来打印变量的值,使用 n
(next)来执行下一行代码等。
部署到CI
请参阅CI提供程序的指南guides for CI providers,以将测试部署到CI/CD。