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

如何指定单个WebDriver运行Selenium+Pytest测试?双浏览器启动排查

Selenium+Pytest多浏览器启动问题排查与解决

问题场景

我正在学习使用Selenium结合Pytest进行测试,配置的conftest.py代码如下:

import pytest
from selenium import webdriver
from pages.homepage import HomePage

def pytest_addoption(parser):
    parser.addoption('--platform', action='store', default='Chrome')

options=webdriver.EdgeOptions()
options.use_chromium=True
Edge_driver = webdriver.Edge(options=options)
Chrome_driver = webdriver.Chrome()

@pytest.fixture
def platform(request):

    plat = request.config.getoption('platform').lower()

    if plat not in ['MicrosoftEdge', 'Chrome']:
        raise ValueError('--platform value must be MicrosoftEdge or Chrome')
    return plat

@pytest.fixture
def driver():
    if platform == 'MicrosoftEdge':
        driver = Edge_driver 
    else:
        driver = Chrome_driver

    yield driver
    driver._platform = platform
    driver.quit()

执行命令pytest --platform=MicrosoftEdge mytest.py时,会同时打开MicrosoftEdge和Chrome两个浏览器,测试仅在MicrosoftEdge上运行,但Chrome浏览器也会被打开且无目标网站。

原因分析

问题出在代码的全局初始化逻辑:你在conftest.py的全局作用域中直接实例化了Edge_driver和Chrome_driver对象。这意味着只要pytest加载该配置文件,不管后续是否会用到这两个驱动,浏览器都会被直接启动,所以即使指定了MicrosoftEdge平台,Chrome浏览器也会提前被打开。

另外,driver fixture中直接引用platform fixture的方式存在错误——没有通过参数注入获取platform的值,而是直接使用变量名,实际执行中可能引发未定义错误。

解决方案

修改conftest.py,将浏览器驱动的实例化逻辑移到driver fixture内部,并正确注入platform参数:

import pytest
from selenium import webdriver
from pages.homepage import HomePage

def pytest_addoption(parser):
    parser.addoption('--platform', action='store', default='Chrome')

@pytest.fixture
def platform(request):
    plat = request.config.getoption('platform').strip()

    # 统一大小写判断,避免输入大小写问题
    if plat.lower() not in ['microsoftedge', 'chrome']:
        raise ValueError('--platform value must be MicrosoftEdge or Chrome')
    return plat.lower()

@pytest.fixture
def driver(platform):
    driver = None
    if platform == 'microsoftedge':
        options = webdriver.EdgeOptions()
        options.use_chromium = True
        driver = webdriver.Edge(options=options)
    elif platform == 'chrome':
        driver = webdriver.Chrome()

    yield driver
    # 确保浏览器能正常退出
    if driver:
        driver.quit()

关键修改点:

  • 移除全局作用域的驱动实例化,改为在driver fixture内部根据platform参数动态创建驱动对象,确保仅启动指定浏览器。
  • 优化platform fixture的大小写处理逻辑,统一转为小写判断,增强参数输入的鲁棒性。
  • 在driver fixture中通过参数注入获取platform的值,保证能正确拿到命令行传入的平台参数。
  • 添加驱动非空判断后再执行quit,避免潜在的空指针错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:04:56