Selenium自动化测试中常见报错类型及解决方案

发布于:2025-09-10 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

1. NoSuchElementException - 无法找到元素

2. ElementClickInterceptedException - 元素被遮挡

 3. TimeoutException - 操作超时

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]

注意找哦

原因分析:

  • 定位方式错误:元素的 idclassxpathcss 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:

原因

  1. 等待的元素没有出现

  2. 等待时间过短

  3. 页面加载速度慢

解决方案

  • 增加等待时间
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:

原因

  1. 元素已经被删除或更新,引用失效

  2. 页面刷新后,之前的元素引用失效

解决方案

  • 重新查找元素
重新查找元素
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:

原因

  1. XPath 语法错误

  2. CSS 选择器格式错误

  3. 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:

原因

  1. WebDriver 版本与浏览器不匹配

  2. WebDriver 路径错误

  3. 浏览器未启动

解决方案

  • 检查 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 版本与浏览器版本总有一个有问题,更新或者把浏览器对应驱动版本直接下载到本地,然后我们指定选择驱动版本,而不是自动下载驱动版本


网站公告

今日签到

点亮在社区的每一天
去签到