pytest-selenium已停止维护,与Selenium 4.x+不兼容,因硬编码desired_capabilities参数而初始化失败;应改用原生pytest+手动管理ChromeOptions和Service的session级fixture。

pytest-selenium 本身不推荐用于新项目——它已停止维护,且与现代 Selenium 版本(4.x+)存在严重兼容问题,直接导致 WebDriver 初始化失败、find_element 行为异常、隐式等待失效等。
为什么 pytest-selenium 会初始化失败?
该插件依赖过时的 selenium.webdriver.Remote 构造逻辑,硬编码了 desired_capabilities 参数,而 Selenium 4.0+ 已弃用该参数,改用 options(如 ChromeOptions)。当你看到类似 TypeError: __init__() got an unexpected keyword argument 'desired_capabilities',基本就是这个原因。
- pytest-selenium 的
--driver参数(如--driver Chrome)会强制走旧路径,无法绕过 - 即使降级到 selenium==3.141.0,也会与新版 chromedriver(v115+)因 CDP 协议变更而连接超时
- 其内置的
self.seleniumfixture 不支持显式等待、无头模式配置粒度控制,容易在 CI 环境中挂起
替代方案:用原生 pytest + selenium 4.x 手动管理 WebDriver
更可控、更易调试。核心是把 driver 创建和销毁收归为一个 session-scoped fixture,避免每个测试重复启停浏览器。
- 安装最新稳定版:
pip install selenium==4.15.0(避坑 4.16.0 的get_screenshot_as_filebug) - 使用
ChromeOptions显式配置无头、禁用 GPU、忽略证书错误:options.add_argument('--headless=new')(注意不是--headless) - 务必设置
options.add_experimental_option('excludeSwitches', ['enable-logging']),否则 Windows 下日志刷屏阻塞进程 - driver 实例必须调用
.quit()(不是.close()),否则残留进程会吃光内存
# conftest.py
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
<p>@pytest.fixture(scope='session')
def driver():
options = Options()
options.add_argument('--headless=new')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
yield driver
driver.quit()
如何写出真正稳定的元素定位逻辑?
90% 的“脚本不稳定”其实源于等待策略粗糙,而非框架选型问题。pytest-selenium 默认只做隐式等待,但现代 SPA 页面大量依赖 JS 渲染,必须结合显式等待 + 预期条件。
立即学习“Python免费学习笔记(深入)”;
- 永远不要用
time.sleep()或仅靠implicitly_wait(10)—— 它对 AJAX 加载、Vue 组件挂载无效 - 优先用
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'submit'))),而不是driver.find_element(By.ID, 'submit') - 对动态 ID/Class 的元素(如
btn-xyz123),改用 XPath 文本匹配://button[contains(text(), '提交')],或 CSS 属性筛选:button[data-testid='submit-btn'] - 点击前加
EC.element_to_be_clickable判断,避免ElementClickInterceptedException
CI 环境下最常被忽略的三个点
本地跑通 ≠ 流水线稳定。Docker 或 GitHub Actions 中缺一不可:
- chromedriver 必须与 Chrome 版本严格匹配 —— 推荐用
webdriver-manager自动下载:from webdriver_manager.chrome import ChromeDriverManager; driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) - Linux 环境需预装字体库,否则中文截图乱码或 PDF 渲染失败:
apt-get install -y fonts-wqy-zenhei - GitHub Actions 默认磁盘空间小,chromium 缓存可能撑爆空间,加
options.add_argument('--disk-cache-size=1')
稳定不是靠框架自动兜底,而是对 driver 生命周期、等待边界、环境差异有明确掌控。越早放弃 pytest-selenium 这类黑盒封装,越快进入可预测的调试节奏。


















