You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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标记+钩子处理

  1. 在conftest.py中注册自定义标记:
def pytest_configure(config):
    config.addinivalue_line(
        "markers", "skip_mobile: 跳过移动浏览器测试"
    )
  1. 在测试用例上添加标记:
import pytest

@pytest.mark.skip_mobile
def test_selected(order):
    order.open()
    order.set_channel('XXX')
  1. 在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为桌面和移动两个参数:

  1. 修改pw fixture的参数配置:
@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()
  1. 此时既可以用官方注解(如@pytest.mark.skip_browser("webkit")会跳过所有Webkit场景),也可以结合方案2的自定义标记只跳过移动Webkit,或者在测试内判断参数是否为webkit_mobile。

内容的提问来源于stack exchange,提问作者Yoooo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:08:29