如何指定单个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()
关键修改点:
- 移除全局作用域的驱动实例化,改为在
driverfixture内部根据platform参数动态创建驱动对象,确保仅启动指定浏览器。 - 优化
platformfixture的大小写处理逻辑,统一转为小写判断,增强参数输入的鲁棒性。 - 在
driverfixture中通过参数注入获取platform的值,保证能正确拿到命令行传入的平台参数。 - 添加驱动非空判断后再执行quit,避免潜在的空指针错误。
内容的提问来源于stack exchange,提问作者user30965980
相关产品推荐
相关产品推荐

