You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium XPath定位元素报NoSuchElementException求助

问题背景

使用Python Selenium库对接伊利诺伊州惩教署囚犯查询页面(https://www2.illinois.gov/idoc/Offender/Pages/InmateSearch.aspx),尝试通过XPath定位页面单选按钮并触发点击,代码运行抛出异常,自行排查未定位到根因。

原始代码
from select import select
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import csv
import time
PATH = "C:\Program Files (x86)\chromedriver.exe"

driver = webdriver.Chrome(PATH)

driver.get('https://www2.illinois.gov/idoc/Offender/Pages/InmateSearch.aspx')

button = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[1]/table/tbody/tr/td/form/table/tbody/tr/td/input[2]')
button.click()

driver.implicitly_wait(10)

driver.quit()
运行报错信息
DevTools listening on ws://127.0.0.1:62348/devtools/browser/ce37da62-856d-4159-ad45-9eca8e63115a
E:\Fiverr job\Orders\1\test.py:18: DeprecationWarning: find_element_by_xpath is deprecated. Please use find_element(by=By.XPATH, value=xpath) instead
  button = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[1]/table/tbody/tr/td/form/table/tbody/tr/td/input[2]')
Traceback (most recent call last):
  File "E:\Fiverr job\Orders\1\test.py", line 18, in <module>
    button = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[1]/table/tbody/tr/td/form/table/tbody/tr/td/input[2]')
  File "E:\Fiverr job\Orders\1\env\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 526, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "E:\Fiverr job\Orders\1\env\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1251, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "E:\Fiverr job\Orders\1\env\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
    self.error_handler.check_response(response)
  File "E:\Fiverr job\Orders\1\env\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/table/tbody/tr/td/table[2]/tbody/tr/td[1]/table/tbody/tr/td/form/table/tbody/tr/td/input[2]"}
  (Session info: chrome=102.0.5005.63)
Stacktrace:
Backtrace:
        Ordinal0 [0x0054D953+2414931]
        Ordinal0 [0x004DF5E1+1963489]
        Ordinal0 [0x003CC6B8+837304]
        Ordinal0 [0x003F9500+1021184]
        Ordinal0 [0x003F979B+1021851]
        Ordinal0 [0x00426502+1205506]
        Ordinal0 [0x004144E4+1131748]
        Ordinal0 [0x00424812+1198098]
        Ordinal0 [0x004142B6+1131190]
        Ordinal0 [0x003EE860+976992]
        Ordinal0 [0x003EF756+980822]
        GetHandleVerifier [0x007BCC62+2510274]
        GetHandleVerifier [0x007AF760+2455744]
        GetHandleVerifier [0x005DEABA+551962]
        GetHandleVerifier [0x005DD916+547446]
        Ordinal0 [0x004E5F3B+1990459]
        Ordinal0 [0x004EA898+2009240]
        Ordinal0 [0x004EA985+2009477]
        Ordinal0 [0x004F3AD1+2046673]
        BaseThreadInitThunk [0x7648FA29+25]
        RtlGetAppContainerNamedObjectPath [0x77BE7A7E+286]
        RtlGetAppContainerNamedObjectPath [0x77BE7A4E+238]

报错包含两部分:

  • 弃用警告:find_element_by_xpath方法在高版本Selenium中已被废弃,官方推荐使用find_element(by=By.XPATH, value=xpath)的新写法
  • 核心异常:NoSuchElementException,无法通过给定的绝对XPath定位到目标单选按钮元素
故障根因
  • 定位方式容错性极差:使用从html根节点开始的绝对XPath定位,只要页面任意一层嵌套结构变动(比如浏览器渲染时自动补全tbody节点、动态加载的表格节点位置偏移)就会定位失败,复制的绝对路径里包含多层table/tbody嵌套,和实际渲染后的DOM结构不匹配。
  • 缺少元素等待逻辑:页面发起请求后还没完成渲染,就立刻执行元素查找操作,此时目标单选按钮还没加载到DOM树中,自然无法定位。
  • 使用了已废弃的API,触发版本兼容警告。
  • 代码存在冗余:开头导入的select、csv、Keys、time库在当前逻辑中完全没有被调用,属于无效导入;Windows驱动路径没有加原始字符串标记,反斜杠可能被识别为转义字符引发驱动加载异常。
修复后代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 替换为本地chromedriver实际路径,路径前加r标记为原始字符串避免转义问题
PATH = r"C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)

driver.get('https://www2.illinois.gov/idoc/Offender/Pages/InmateSearch.aspx')

try:
    # 显式等待最长10秒,直到目标单选按钮可点击,使用基于元素属性的相对XPath定位
    # 索引[2]对应第二个单选按钮,如果需要选择第一个按钮将索引改为[1]即可
    radio_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//input[@type='radio'][2]"))
    )
    radio_button.click()
finally:
    # 预留5秒查看操作结果,可根据自身业务逻辑调整等待时间或关闭逻辑
    driver.implicitly_wait(5)
    driver.quit()
关键修复说明
  • 替换废弃的定位API,使用Selenium 4官方推荐的定位写法,消除弃用警告。
  • 替换极易失效的绝对XPath为基于元素属性的相对XPath,不受页面外层嵌套结构变动影响,定位稳定性大幅提升。
  • 引入显式等待逻辑,只有当目标元素加载完成、处于可点击状态时才执行点击操作,避免页面未渲染完成导致的定位失败。
  • 修复Windows路径转义问题,删除冗余导入,精简代码逻辑。

内容的提问来源于stack exchange,提问作者Tanvir Hossain Dihan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:01:12