目录
1. NoSuchElementException - 无法找到元素
2. ElementClickInterceptedException - 元素被遮挡
4. StaleElementReferenceException - 过时的元素
5. InvalidSelectorException - 无效的选择器
6. WebDriverException - 浏览器驱动错误
7. SessionNotCreatedException - WebDriver 版本问题
1. NoSuchElementException
- 无法找到元素
错误信息:
Message: no such element: Unable to locate element: {"method":"css selector","selector":"xxx"}
大部分错误报错的时候都是一长串,像这样
错误发生: Message: no such element: Unable to locate element: {"method":"css selector","selector":"body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2"}
(Session info: MicrosoftEdge=134.0.3124.72)
Stacktrace:
GetHandleVerifier [0x00007FF725D0A785+20677]
simdutf::get_active_implementation [0x00007FF725C66F30+492592]
Microsoft::Applications::Events::EventProperty::to_string [0x00007FF725F5DC3A+1807418]
(No symbol) [0x00007FF725AA72AC]
(No symbol) [0x00007FF725AA758B]
(No symbol) [0x00007FF725AE85A7]
(No symbol) [0x00007FF725AC849F]
(No symbol) [0x00007FF725A9D6ED]
(No symbol) [0x00007FF725AE5D61]
(No symbol) [0x00007FF725AC81C3]
(No symbol) [0x00007FF725A9CC36]
(No symbol) [0x00007FF725A9C0C4]
(No symbol) [0x00007FF725A9CA63]
(No symbol) [0x00007FF725B858DD]
(No symbol) [0x00007FF725B91D42]
(No symbol) [0x00007FF725B8A703]
Microsoft::Applications::Events::EventProperty::to_string [0x00007FF725DE478A+262026]
simdutf::get_active_implementation [0x00007FF725C74661+547681]
simdutf::get_active_implementation [0x00007FF725C6D914+519700]
simdutf::get_active_implementation [0x00007FF725C6DA59+520025]
simdutf::get_active_implementation [0x00007FF725C5F606+461574]
BaseThreadInitThunk [0x00007FFE0DF97374+20]
RtlUserThreadStart [0x00007FFE0FC9CC91+33]
注意找哦
原因分析:
定位方式错误:元素的
id
、class
、xpath
、css selector
写错元素未加载完成:页面 加载慢,但代码执行太快
元素在 iframe 里:未切换到
iframe
解决方案:
- 检查选择器
print(driver.page_source) # 打印整个页面源代码,确认元素是否存在
- 使用
WebDriverWait
等待元素加载from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待元素加载出来 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")) ) print(element.text) # 打印元素文本
- 切换到
iframe
# 先找到 iframe 并切换 iframe = driver.find_element(By.TAG_NAME, "iframe") driver.switch_to.frame(iframe) # 再查找目标元素 element = driver.find_element(By.CSS_SELECTOR, "你的选择器") print(element.text) # 记得切回主页面 driver.switch_to.default_content()
- 该元素是
Shadow DOM
里的元素shadow_host = driver.find_element(By.CSS_SELECTOR, "shadow-host-selector") shadow_root = driver.execute_script("return arguments[0].shadowRoot", shadow_host) element = shadow_root.find_element(By.CSS_SELECTOR, "h2") print(element.text)
如果是在 Shadow DOM 里,普通
find_element
找不到,需要用shadowRoot
- 页面上有动态加载(例如 AJAX)
# 等待元素可见 WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "你的选择器")) )
如果页面的元素是 JavaScript 动态加载,那么直接查找可能会失败。
- 页面可能跳转到了新窗口
# 切换到最新的窗口 driver.switch_to.window(driver.window_handles[-1]) # 重新查找元素 element = driver.find_element(By.CSS_SELECTOR, "你的选择器") print(element.text)
如果你的页面跳转到了新窗口或新标签页,你需要切换到新的窗口
2. ElementClickInterceptedException
- 元素被遮挡
错误信息:
Message: element click intercepted: Element is not clickable at point (541, 966)
原因分析:
弹窗、广告遮挡
页面未滚动到元素可见
元素被
display: none;
或opacity: 0;
设为不可见
错误发生: Message: element click intercepted: Element is not clickable at point (541, 966)
(Session info: MicrosoftEdge=134.0.3124.72)
Stacktrace:
GetHandleVerifier [0x00007FF725D0A785+20677]
simdutf::get_active_implementation [0x00007FF725C66F30+492592]
Microsoft::Applications::Events::EventProperty::to_string [0x00007FF725F5DC3A+1807418]
(No symbol) [0x00007FF725AADDFE]
(No symbol) [0x00007FF725AABDB7]
(No symbol) [0x00007FF725AA9839]
(No symbol) [0x00007FF725AA8A09]
(No symbol) [0x00007FF725A9DD5E]
(No symbol) [0x00007FF725AC845A]
(No symbol) [0x00007FF725A9D6ED]
(No symbol) [0x00007FF725A9D5AD]
(No symbol) [0x00007FF725AC8720]
(No symbol) [0x00007FF725A9D6ED]
(No symbol) [0x00007FF725AE5D61]
(No symbol) [0x00007FF725AC81C3]
(No symbol) [0x00007FF725A9CC36]
(No symbol) [0x00007FF725A9C0C4]
(No symbol) [0x00007FF725A9CA63]
(No symbol) [0x00007FF725B858DD]
(No symbol) [0x00007FF725B91D42]
(No symbol) [0x00007FF725B8A703]
Microsoft::Applications::Events::EventProperty::to_string [0x00007FF725DE478A+262026]
simdutf::get_active_implementation [0x00007FF725C74661+547681]
simdutf::get_active_implementation [0x00007FF725C6D914+519700]
simdutf::get_active_implementation [0x00007FF725C6DA59+520025]
simdutf::get_active_implementation [0x00007FF725C5F606+461574]
BaseThreadInitThunk [0x00007FFE0DF97374+20]
RtlUserThreadStart [0x00007FFE0FC9CC91+33]
解决方案:
- 先滚动页面再点击
目标元素可能在 页面外或被固定头部遮挡,可以先滚动到可见位置:
element = driver.find_element(By.CSS_SELECTOR, "你的元素选择器")
driver.execute_script("arguments[0].scrollIntoView();", element)
element.click()
- 等待元素可点击
使用 WebDriverWait
等待元素 变得可点击:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "你的元素选择器"))
)
element.click()
- 关闭可能的弹窗
如果页面有 弹窗、遮罩层 遮挡,先尝试关闭:
try:
close_btn = driver.find_element(By.CSS_SELECTOR, "关闭弹窗按钮的CSS选择器")
close_btn.click()
except:
print("没有弹窗")
然后再尝试点击目标元素。
- 使用 JavaScript 直接点击
如果 click()
仍然报错,可以尝试用 JavaScript 直接触发点击:
driver.execute_script("arguments[0].click();", element)
- 检查
iframe
如果目标元素在 iframe
里,需要先切换:
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
element = driver.find_element(By.CSS_SELECTOR, "你的元素选择器")
element.click()
driver.switch_to.default_content() # 记得切回主页面
3. TimeoutException
- 操作超时
错误信息
selenium.common.exceptions.TimeoutException: Message:
原因
等待的元素没有出现
等待时间过短
页面加载速度慢
解决方案
- 增加等待时间
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#element_id"))
)
- 检查
page_source
看看元素是否在DOM
里
print(driver.page_source)
4. StaleElementReferenceException
- 过时的元素
错误信息
selenium.common.exceptions.StaleElementReferenceException: Message:
原因
元素已经被删除或更新,引用失效
页面刷新后,之前的元素引用失效
解决方案
- 重新查找元素
重新查找元素
import time
time.sleep(1) # 等待页面更新
element = driver.find_element(By.CSS_SELECTOR, "#element_id")
element.click()
- 使用
WebDriverWait
重新获取元素
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def find_element(driver, selector):
return WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, selector))
)
element = find_element(driver, "#element_id")
element.click()
5. InvalidSelectorException
- 无效的选择器
错误信息
selenium.common.exceptions.InvalidSelectorException: Message:
原因
XPath 语法错误
CSS 选择器格式错误
find_element_by_css_selector
不支持 XPath
解决方案
- 检查 CSS 选择器
element = driver.find_element(By.CSS_SELECTOR, "div.class-name") # 正确
element = driver.find_element(By.CSS_SELECTOR, "div[class='class-name']") # 正确
- 检查 XPath
element = driver.find_element(By.XPATH, "//div[@class='class-name']")
6. WebDriverException
- 浏览器驱动错误
错误信息
selenium.common.exceptions.WebDriverException: Message:
原因
WebDriver 版本与浏览器不匹配
WebDriver 路径错误
浏览器未启动
解决方案
- 检查 WebDriver 路径
from selenium import webdriver
driver = webdriver.Edge(executable_path="C:\\path\\to\\msedgedriver.exe")
- 更新 WebDriver
selenium.common.exceptions.SessionNotCreatedException: Message:
pip install --upgrade selenium
- 尝试重新启动浏览器
driver.quit()
driver = webdriver.Edge()
7. SessionNotCreatedException
- WebDriver 版本问题
错误信息
selenium.common.exceptions.SessionNotCreatedException: Message:
WebDriver 版本与浏览器版本总有一个有问题,更新或者把浏览器对应驱动版本直接下载到本地,然后我们指定选择驱动版本,而不是自动下载驱动版本