
Selenium 4 已全面弃用所有 `find_elementsby(如by_class_name、by_id等)方法,统一由find_elements(By.XXX, "value")替代,需配合selenium.webdriver.common.by.By` 枚举类使用。
selenium 4 已全面弃用所有 `find_elements_by_*`(如 `by_class_name`、`by_id` 等)方法,统一由 `find_elements(by.xxx, "value")` 替代,需配合 `selenium.webdriver.common.by.by` 枚举类使用。
自 Selenium 4.0 正式发布起,官方移除了所有以 find_element_by_* 和 find_elements_by_* 命名的定位方法(例如 find_elements_by_class_name、find_elements_by_id、find_element_by_xpath 等),这是为了统一 API 设计、提升可维护性,并与 WebDriver W3C 标准更深度对齐。
✅ 正确用法:统一使用 find_element() / find_elements() + By 枚举
你需要显式导入 By 类,并将定位策略作为第一个参数传入:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
# ✅ 查找多个元素(原 find_elements_by_class_name)
elements_by_class = driver.find_elements(By.CLASS_NAME, "btn")
# ✅ 查找单个元素(原 find_element_by_id)
element_by_id = driver.find_element(By.ID, "header-title")
# ✅ 其他常用定位方式
driver.find_elements(By.NAME, "username")
driver.find_elements(By.XPATH, "//input[@type='submit']")
driver.find_elements(By.CSS_SELECTOR, "a.nav-link.active")
driver.find_elements(By.TAG_NAME, "li")
driver.find_elements(By.LINK_TEXT, "Learn more")⚠️ 注意事项
- By.CLASS_NAME 不支持复合类名(如 "container-fluid" 是合法的,但 "class1 class2" 会失败);如需多类匹配,请改用 By.CSS_SELECTOR:driver.find_elements(By.CSS_SELECTOR, ".class1.class2")。
- find_element() 在未找到元素时抛出 NoSuchElementException;find_elements() 则始终返回空列表(不会报错),适合做存在性判断。
- 若代码中仍调用 find_elements_by_class_name(...),将触发 AttributeError,提示该方法不存在——这不是环境或 IDE(如 PyCharm)问题,而是 Selenium 4 的强制变更。
? 迁移建议
批量替换时,可使用正则替换(以 PyCharm 为例):
- 替换 find_elements_by_class_name\("(.+)"\) → find_elements(By.CLASS_NAME, "$1")
- 类似处理 by_id、by_name、by_xpath 等,再统一补上 from selenium.webdriver.common.by import By 导入语句。
掌握这一变化,不仅能让代码兼容最新 Selenium 版本,也使定位逻辑更清晰、策略更显式——这是现代 Web 自动化开发的最佳实践。

















