如何在Playwright+pytest中跳过移动Webkit的指定测试?
解决Playwright自定义多浏览器fixture下跳过移动Webkit测试的问题
问题背景
我有在Chromium、Firefox和Webkit(移动)浏览器中运行的测试用例,但部分用例不应在移动浏览器中执行。尝试使用Playwright的pytest注解(如@pytest.mark.only_browser("firefox")或@pytest.mark.skip_browser("webkit"))未生效,所有测试仍照常执行。
测试代码示例:
import pytest @pytest.mark.only_browser("firefox") # @pytest.mark.skip_browser("webkit") def test_selected(order): order.open() order.set_channel('XXX')
执行命令:
pytest ./tests/Orders
自定义多浏览器fixture(conftest.py):
@pytest.fixture(scope="session", params=['chromium', 'firefox', 'mobile'], ids=['chromium', 'firefox', 'mobile']) def pw(get_playwright, request): headless = True if request.config.getini('headless').casefold() == 'true' else False match request.param: case 'chromium': app = App( get_playwright.chromium.launch(headless=headless), { 'base_url': request.config.getini('base_url'), 'viewport': {"width": 1920, "height": 1080}, }, ) case 'firefox': app = App( get_playwright.firefox.launch(headless=headless), { 'base_url': request.config.getini('base_url'), 'viewport': {"width": 1366, "height": 768} }, ) case 'mobile': app = App( get_playwright.webkit.launch(headless=headless), { 'base_url': request.config.getini('base_url'), **get_playwright.devices['iPhone 14 Pro Max landscape'] }, ) case _: assert False, 'Wrong browser' yield app app.close()
问题原因
Playwright官方的only_browser/skip_browser注解是基于其内置browser fixture的标准参数(chromium、firefox、webkit)识别的,但你自定义的fixture用mobile指代移动Webkit,而非官方参数名,导致注解无法匹配对应场景,所以失效。
解决方案
方案1:测试内直接判断浏览器参数
借助request fixture获取当前运行的浏览器参数,手动跳过移动场景:
import pytest def test_selected(order, request): # 匹配到mobile参数时跳过测试 if request.node.callspec.params.get('pw') == 'mobile': pytest.skip("该测试不支持移动浏览器") order.open() order.set_channel('XXX')
方案2:自定义pytest标记+钩子处理
- 在
conftest.py中注册自定义标记:
def pytest_configure(config): config.addinivalue_line( "markers", "skip_mobile: 跳过移动浏览器测试" )
- 在测试用例上添加标记:
import pytest @pytest.mark.skip_mobile def test_selected(order): order.open() order.set_channel('XXX')
- 在
conftest.py中添加钩子自动跳过:
def pytest_runtest_setup(item): # 获取当前测试的浏览器参数 browser_param = item.callspec.params.get('pw') if hasattr(item, 'callspec') else None # 标记了skip_mobile且当前是mobile场景时跳过 if browser_param == 'mobile' and item.get_closest_marker('skip_mobile'): pytest.skip("该测试不支持移动浏览器")
方案3:调整fixture参数为官方标准名
如果想继续使用Playwright官方注解,可以拆分Webkit为桌面和移动两个参数:
- 修改
pwfixture的参数配置:
@pytest.fixture(scope="session", params=['chromium', 'firefox', 'webkit', 'webkit_mobile'], ids=['chromium', 'firefox', 'webkit_desktop', 'webkit_mobile']) def pw(get_playwright, request): headless = True if request.config.getini('headless').casefold() == 'true' else False match request.param: case 'chromium': app = App( get_playwright.chromium.launch(headless=headless), { 'base_url': request.config.getini('base_url'), 'viewport': {"width": 1920, "height": 1080}, }, ) case 'firefox': app = App( get_playwright.firefox.launch(headless=headless), { 'base_url': request.config.getini('base_url'), 'viewport': {"width": 1366, "height": 768} }, ) case 'webkit': app = App( get_playwright.webkit.launch(headless=headless), { 'base_url': request.config.getini('base_url'), 'viewport': {"width": 1920, "height": 1080} }, ) case 'webkit_mobile': app = App( get_playwright.webkit.launch(headless=headless), { 'base_url': request.config.getini('base_url'), **get_playwright.devices['iPhone 14 Pro Max landscape'] }, ) case _: assert False, 'Wrong browser' yield app app.close()
- 此时既可以用官方注解(如
@pytest.mark.skip_browser("webkit")会跳过所有Webkit场景),也可以结合方案2的自定义标记只跳过移动Webkit,或者在测试内判断参数是否为webkit_mobile。
内容的提问来源于stack exchange,提问作者Yoooo
相关产品推荐
相关产品推荐

