
Selenium 4 已废弃所有 find_element_by_* 系列方法,统一替换为 find_element(By.XXX, "value") 和 find_elements(By.XXX, "value"),需配合 By 类使用。
selenium 4 已废弃所有 `find_element_by_*` 系列方法,统一替换为 `find_element(by.xxx, "value")` 和 `find_elements(by.xxx, "value")`,需配合 `by` 类使用。
在 Selenium 4 及更高版本中,为提升 API 一致性与可维护性,官方正式移除了所有以 find_element_by_id、find_element_by_class_name、find_element_by_xpath 等为代表的“快捷定位方法”。取而代之的是统一的 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")
# 查找单个元素
element = driver.find_element(By.CLASS_NAME, "header-title")
input_field = driver.find_element(By.ID, "search-input")
submit_btn = driver.find_element(By.XPATH, "//button[@type='submit']")
# 查找多个元素(返回列表)
links = driver.find_elements(By.TAG_NAME, "a")
cards = driver.find_elements(By.CSS_SELECTOR, ".card-item")⚠️ 注意事项:
- 必须显式导入 By:from selenium.webdriver.common.by import By;
- By.CLASS_NAME 对应 class 属性值(不带点号),如 <div class="btn primary"> → 使用 "btn" 或 "primary"(仅匹配单个 class);
- 若需匹配含空格的复合 class(如 "btn primary"),推荐改用 CSS 选择器:By.CSS_SELECTOR, ".btn.primary";
- find_elements() 永远返回 list(即使无匹配项也返回空列表),而 find_element() 在未找到时抛出 NoSuchElementException,建议关键操作添加异常处理;
- 旧代码迁移时,只需将 driver.find_element_by_id("foo") 替换为 driver.find_element(By.ID, "foo"),逻辑不变,但更清晰、更易扩展。
? 总结:这不是 Bug,而是 Selenium 4 的标准化演进。掌握 By 枚举类的使用,不仅适配新版 API,也为后续支持更多定位策略(如 By.PARTIAL_LINK_TEXT、By.ROLE 等)打下基础。建议查阅 Selenium Python 官方文档 — Locating Elements 获取完整策略对照表。


















