
本文详解如何在 nse 官网(nseindia.com)股票查询页面中,通过 selenium 精准定位并点击动态加载的下拉建议项(如输入“infy”后出现的首个匹配股票),解决因 dom 延迟渲染、元素不可见或 xpath 不准确导致的点击失败问题。
本文详解如何在 nse 官网(nseindia.com)股票查询页面中,通过 selenium 精准定位并点击动态加载的下拉建议项(如输入“infy”后出现的首个匹配股票),解决因 dom 延迟渲染、元素不可见或 xpath 不准确导致的点击失败问题。
NSE 的 eq_security 页面采用基于 aria-autocomplete 的自定义下拉组件(非传统 <select></select> 元素),其选项实际由 JavaScript 动态渲染为嵌套 <div> 结构,并拥有固定 ID 容器 <code>hsa-symbol_listbox。因此,盲目等待 .ui-autocomplete 类名或尝试点击 <li> 元素往往失败——因为真实 DOM 中并不存在 <ul></ul>/<li>,而是类似如下结构:
<div id="hsa-symbol_listbox" role="listbox"> <div role="option"><div>INFY</div></div> <div role="option"><div>INFYEQ</div></div> </div>
✅ 正确做法是:直接定位到 #hsa-symbol_listbox 下第一个 role="option" 内层文本容器,使用高稳定性 XPath:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get("https://www.nseindia.com/report-detail/eq_security")
driver.maximize_window()
wait = WebDriverWait(driver, 10)
# 1. 输入股票代码(自动触发下拉)
symbol_input = wait.until(EC.element_to_be_clickable((By.ID, "hsa-symbol")))
symbol_input.clear()
symbol_input.send_keys("INFY")
# 2. 等待下拉面板出现并点击第一个选项(关键!)
# ✅ 精确匹配:ID + role + 嵌套 div 结构,避免受隐藏/禁用项干扰
first_option = wait.until(
EC.element_to_be_clickable((By.XPATH, "//div[@id='hsa-symbol_listbox']//div[@role='option'][1]"))
)
first_option.click()
# 3. (可选)等待表格数据加载完成(如需后续解析)
wait.until(EC.presence_of_element_located((By.XPATH, "//table[contains(@class, 'table')]//tbody/tr")))
print("✅ 成功选择股票并加载数据表格。")⚠️ 注意事项:
-
勿依赖
visibility_of_element_located检查整个下拉容器:hsa-symbol_listbox可能在未展开时已存在于 DOM 中(仅display: none),应改用element_to_be_clickable配合role="option"确保可交互; -
避免
time.sleep()替代显式等待:页面加载速度波动大,硬延迟易导致超时或过早操作; -
清除输入框再发送:部分场景下残留值会干扰自动补全,调用
.clear()更鲁棒; -
启用
maximize_window():防止因视口尺寸过小导致元素不可见(尤其对element_to_be_clickable判定有影响); -
若需选择第 N 项,仅需修改 XPath 末尾索引:
[1]→[2]→[n],无需重新查找全部元素。
? 进阶提示:若目标股票名称含空格或特殊字符(如 "TATA MOTORS"),建议在 .send_keys() 后增加 wait.until(EC.text_to_be_present_in_element(...)) 校验输入框内容,再触发下拉,进一步提升健壮性。完成选择后,即可用标准方式定位下方表格(如 //table[@id='equity-security-table']//tbody/tr)提取历史价格、成交量等结构化数据。

















