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

Selenium Python中无法点击下拉框选项的问题求助

问题

尝试从网页https://www.superfinanciera.gov.co/SIMEV2/rnve/informesfinancierosniif/110/000001/0下载文件,使用Selenium Python编写自动化代码时无法进入最终页面。点击名为“Tipo de Reporte”的下拉框第二个选项时,始终触发TimeoutException,已尝试使用XPATH和CSS_SELECTOR定位元素,均未解决问题。

用户代码

options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)
driver.get('https://www.superfinanciera.gov.co/SIMEV2/rnve')
busqueda_texto = driver.find_element(By.XPATH, '//*[@id="searchBarRNVE"]/div/input')
busqueda_texto.send_keys(seleccion)
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="searchBarRNVE"]/div/a[2]/a/span'))).click()
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="cardRNVE"]'))).click()
time.sleep(3)
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="dropdownMenuButton"]'))).click()
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="dropdownSubmenuButton"]/li[1]/a[11]'))).click()
time.sleep(3)

## AÑO
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="anioConsulta"]'))).click()
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '/html/body/app-root/app-layout-reportes-rnve/div/app-informes-financieros-niif/feature-toggle-provider/div/div/div[1]/div/div[1]/div/div/div/div[2]'))).click()

## TIPO DE REPORTE
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '/html/body/app-root/app-layout-reportes-rnve/div/app-informes-financieros-niif/feature-toggle-provider/div/div/div/div/div[2]/div/div'))).click()
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '/html/body/app-root/app-layout-reportes-rnve/div/app-informes-financieros-niif/feature-toggle-provider/div/div/div/div/div[2]/div/div/div/option[2]'))).click()

报错信息

---------------------------------------------------------------------------
TimeoutException                          Traceback (most recent call last)
<ipython-input-99-c1f3ee3cdf7e> in <cell line: 24>()
     22 WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '/html/body/app-root/app-layout-reportes-rnve/div/app-informes-financieros-niif/feature-toggle-provider/div/div/div/div/div[2]/div/div'))).click()
     23 WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '/html/body/app-root/app-layout-reportes-rnve/div/app-informes-financieros-niif/feature-toggle-provider/div/div/div/div/div[2]/div/div'))).click()
---> 24 WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, '/html/body/app-root/app-layout-reportes-rnve/div/app-informes-financieros-niif/feature-toggle-provider/div/div/div/div/div[2]/div/div/div/option[2]'))).click()
     25 
     26 

/usr/local/lib/python3.10/dist-packages/selenium/webdriver/support/wait.py in until(self, method, message)
     93             if time.monotonic() > end_time:
     94                 break
---> 95         raise TimeoutException(message, screen, stacktrace)
     96 
     97     def until_not(self, method, message: str = ""):

TimeoutException: Message: 
Stacktrace:
#0 0x586cdb24e6b3 <unknown>
#1 0x586cdaf241e7 <unknown>
#2 0x586cdaf6b566 <unknown>
#3 0x586cdaf6b651 <unknown>
#4 0x586cdafa8a74 <unknown>
#5 0x586cdaf8d0ed <unknown>
#6 0x586cdafa6322 <unknown>
#7 0x586cdaf8ce93 <unknown>
#8 0x586cdaf5f934 <unknown>
#9 0x586cdaf6071e <unknown>
#10 0x586cdb213cb8 <unknown>
#11 0x586cdb217bf0 <unknown>
#12 0x586cdb22219c <unknown>
#13 0x586cdb218808 <unknown>
#14 0x586cdb1e527f <unknown>
#15 0x586cdb23ce88 <unknown>
#16 0x586cdb23d059 <unknown>
#17 0x586cdb24d843 <unknown>
#18 0x7f494be08b43 <unknown>

注:代码中使用的XPATH是通过Chrome的“复制XPATH”按钮获取的。

解决方案

1. 替换绝对XPATH为相对定位

绝对XPATH依赖页面完整DOM结构,一旦页面更新就会失效。改用基于元素属性的相对定位,比如通过下拉框的关联文本或ID定位:

# 定位Tipo de Reporte下拉框(根据实际页面结构调整)
tipo_reporte_dropdown = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.XPATH, '//div[contains(text(), "Tipo de Reporte")]/following-sibling::div//select'))
)

2. 使用Selenium Select类操作原生下拉框

如果目标下拉框是原生<select>标签,直接用Select类操作更可靠,无需手动点击option:

from selenium.webdriver.support.ui import Select

# 等待下拉框加载并初始化Select对象
select = Select(WebDriverWait(driver, 20).until(
    EC.visibility_of_element_located((By.XPATH, '//select[contains(@id, "tipoReporte")]'))  # 根据实际ID调整
))
# 选择第二个选项(索引从0开始)
select.select_by_index(1)
# 或通过文本选择
# select.select_by_visible_text("目标选项文本")

3. 修复代码重复问题

原代码第22、23行重复点击同一个元素,直接删除其中一行即可,避免不必要的操作干扰页面状态。

4. 调整等待条件

如果元素存在但未完全渲染,可改用EC.visibility_of_element_located替代EC.element_to_be_clickable,或先滚动到元素位置:

element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '你的定位')))
driver.execute_script("arguments[0].scrollIntoView();", element)
element.click()

5. 检查是否存在iframe

如果目标元素嵌套在iframe中,需要先切换到iframe再定位:

# 根据iframe的ID或索引切换
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "iframe_id")))
# 操作元素后切回主文档
driver.switch_to.default_content()

内容的提问来源于stack exchange,提问作者Freddy Navarro Cea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:44:56