如何在Playwright Pytest自定义Browser类中添加浏览器类型CLI参数
解决pytest通过CLI参数指定浏览器执行测试的问题
问题背景
已自定义Browser类,通过CLI参数--browser_type指定浏览器,但不确定如何修改page_custom fixture来接收参数,实现用--browser_type firefox这类命令指定浏览器执行测试。现有代码如下:
主目录下的conftest.py
def pytest_addoption(parser): parser.addoption('--browser_type', action="store", default="chromium") def pytest_configure(config): os.environ["browser_type"] = config.getoption("browser_type")
子目录下的conftest.py
@pytest.fixture(scope="class") def page_custom(): params = Browser.context_parameters if not Browser.running_chromium: Browser("chrome", **Browser.browser_parameters) context = Browser.open_new_context(**params) Browser.context = context page = context.new_page() Browser.page = page yield page page.close()
解决方案
不需要通过os.environ传递参数,直接在fixture中通过request对象获取CLI参数,同时调整Browser初始化逻辑适配指定浏览器类型:
步骤1:简化主conftest.py
删掉pytest_configure函数,直接在fixture中获取参数即可:
def pytest_addoption(parser): parser.addoption('--browser_type', action="store", default="chromium")
步骤2:修改page_custom fixture
让fixture接收request参数,获取指定的浏览器类型,然后初始化对应的Browser实例:
import pytest @pytest.fixture(scope="class") def page_custom(request): # 获取CLI传入的浏览器类型 browser_type = request.config.getoption("--browser_type") params = Browser.context_parameters # 根据指定浏览器初始化Browser实例 if browser_type in ["firefox", "chrome", "chromium"]: # 覆盖原有判断逻辑,直接按指定类型初始化 Browser(browser_type, **Browser.browser_parameters) context = Browser.open_new_context(**params) Browser.context = context page = context.new_page() Browser.page = page yield page # 建议关闭context做完整清理,而非仅关闭page context.close() Browser.context = None Browser.page = None
步骤3:执行测试命令
现在可以通过CLI指定浏览器执行测试:
pytest --browser_type firefox
扩展:同时测试多个浏览器
如果需要批量测试多个浏览器,可以让CLI接受逗号分隔的浏览器列表,结合fixture参数化实现:
def pytest_addoption(parser): parser.addoption('--browser_type', action="store", default="chromium", help="指定浏览器,多个用逗号分隔,如chrome,firefox") @pytest.fixture(scope="class") def page_custom(request): # 拆分CLI传入的浏览器列表,作为fixture参数 browser_list = request.config.getoption("--browser_type").split(",") request._fixturedef.params = browser_list current_browser = request.param # 初始化当前浏览器 Browser(current_browser, **Browser.browser_parameters) params = Browser.context_parameters context = Browser.open_new_context(**params) page = context.new_page() yield page context.close()
执行命令即可批量测试:
pytest --browser_type chrome,firefox
内容的提问来源于stack exchange,提问作者M András
相关产品推荐
相关产品推荐

