pytest-selenium已淘汰,不推荐新项目使用;它自2020年起停止维护,与Selenium 4+和Pytest 7+严重不兼容,存在API废弃、驱动管理缺失、不支持Shadow DOM等关键缺陷,应改用原生Pytest自定义driver fixture。

直接说结论:pytest-selenium 是一个过时的、已被弃用的第三方插件,**不推荐在新项目中使用**。它早在 2020 年就停止维护,与现代 Selenium 4+、Pytest 7+ 严重不兼容,强行安装会导致 AttributeError: 'WebDriver' object has no attribute 'find_element_by_id' 等大量报错,且无法支持 Shadow DOM、相对定位、等待策略等关键特性。
为什么 pytest-selenium 已淘汰?
这个插件本质是给 Pytest 提供一个预封装的 driver fixture,但它的设计停留在 Selenium 3 时代:
- 硬编码依赖已废弃的
find_element_by_*()方法(Selenium 4 全部移除) - 不支持
Service类驱动管理(必须手动处理 ChromeDriver 路径) - 无法配置
pageLoadStrategy或strictFileInteractability等现代 WebDriver 选项 - 与
webdriver-manager冲突,常引发版本错配和启动失败
替代方案:用原生 Pytest + Selenium 4 自定义 fixture
你不需要任何第三方插件,只需几行代码就能获得更稳定、更可控的 driver fixture:
- 在
conftest.py中定义:
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
<p>@pytest.fixture
def driver():
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")</p><h1>关键:禁用隐式等待,强制使用显式等待</h1><pre class="brush:php;toolbar:false;">options.set_capability("pageLoadStrategy", "eager")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
yield driver
driver.quit()
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 测试用例中直接使用:
def test_upload_audio(driver): - 所有 Selenium 4 原生 API 都可调用,比如:
driver.find_element(By.ID, "upload-btn") - 可自由扩展:加日志、截图、Allure 步骤标注,全由你控制
遇到“找不到元素”怎么办?
RVC WebUI 这类动态前端常见问题,不是靠插件能解决的,得靠正确等待策略:
- 永远不用
time.sleep()—— 它不可靠,且拖慢整体执行 - 优先用
WebDriverWait+expected_conditions:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC <p>wait = WebDriverWait(driver, 15) upload_btn = wait.until(EC.element_to_be_clickable((By.ID, "upload-btn"))) upload_btn.click() </p>
- 对 Shadow DOM 组件(如 RVC 的模型选择器),必须穿透:
# 先定位 shadow host 元素
host = driver.find_element(By.CSS_SELECTOR, "rvc-model-selector")
# 再获取 shadow root
shadow_root = driver.execute_script("return arguments[0].shadowRoot", host)
# 最后在 shadow root 内查找
model_dropdown = shadow_root.find_element(By.CSS_SELECTOR, "select#model-name")
真正难的不是写几行点击代码,而是理解页面渲染时机、DOM 封装层级和异步行为触发点。RVC WebUI 里上传音频后要等 Whisper 分词完成、模型加载完毕、GPU 推理结束,每个环节都可能卡住或超时 —— 这些必须靠显式等待 + 合理超时 + 失败重试逻辑来兜底,而不是指望某个过时插件自动处理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










