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

Selenium Python操作DatePicker设值后异常跳转OVERVIEW页报错

沙特交易所历史数据爬取重定向报错解决方案

问题现象

  • 目标为爬取指定公司详情页HISTORICAL DATA(历史数据)板块全量数据,页面初始仅加载约45行,原计划通过修改日期选择范围、逐页遍历的方式获取全量数据
  • 原操作流程:打开页面后将From起始日期输入框设置为2000/01/01,依次点击Apply、Search按钮
  • 异常表现:执行操作后页面未停留在历史数据页,异常重定向到OVERVIEW(概览)页面,同时抛出运行时错误

复现代码

driver.get(url)

# 输入起始日期From
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="themeBody"]/div[4]/div[3]/div/div[1]/input'))).send_keys('2000/01/01')

# 点击Apply按钮
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="themeBody"]/div[4]/div[3]/div/button[1]'))).click()

# 点击Search按钮
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="reloadHistoricalData"]'))).click()

触发报错信息

Message: 
  Stacktrace:
  #0 0x55d611b76553 <unknown>
  #1 0x55d611861183 <unknown>
  #2 0x55d611897619 <unknown>

问题原因

  • 直接通过send_keys给日期输入框赋值不会触发日期控件内置的值校验、参数同步事件,页面判定日期参数非法时,点击Search会触发默认路由逻辑跳回概览页
  • 点击Apply按钮后,日期面板关闭、参数同步到前端逻辑需要100-300ms的渲染时间,此时立刻点击Search会出现DOM元素引用失效,抛出栈跟踪中的未知错误
  • 站点为单页应用,页面初始加载完成后默认停留在概览Tab,未主动切换到历史数据Tab时,后续DOM更新会被默认Tab的逻辑覆盖

修复方案

按以下顺序调整代码逻辑即可解决:

  1. 页面加载完成后,首先主动点击历史数据Tab,等待历史数据模块DOM渲染完成后再做后续操作,不要直接操作日期控件
  2. 日期输入完成后,手动触发输入框的change事件,确保前端逻辑能读取到输入的日期值;不要只输入内容就直接点按钮
  3. 点击Apply按钮后,等待日期选择器面板完全从DOM中移除,再加300ms固定延迟等待参数同步,再定位Search按钮点击
  4. 点击Search后等待历史数据表格的行元素加载可见,再执行后续翻页操作,不要提前触发其他点击事件

修正后参考代码

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver.get(target_url)

# 第一步:切换到历史数据Tab,等待模块加载完成
history_tab = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//a[@href="#chart_tab2"]')))
history_tab.click()
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.ID, 'reloadHistoricalData')))

# 第二步:输入起始日期并触发值同步事件
from_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="themeBody"]/div[4]/div[3]/div/div[1]/input')))
from_input.clear()
from_input.send_keys('2000/01/01')
driver.execute_script("arguments[0].dispatchEvent(new Event('change'))", from_input)

# 第三步:点击Apply后等待日期控件关闭、参数同步
apply_btn = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="themeBody"]/div[4]/div[3]/div/button[1]')))
apply_btn.click()
WebDriverWait(driver, 20).until(EC.invisibility_of_element_located((By.CLASS_NAME, 'datepicker-dropdown')))
time.sleep(0.3)

# 第四步:点击Search拉取数据,等待表格加载完成
search_btn = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="reloadHistoricalData"]')))
search_btn.click()
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//div[@id="historicalDataTable"]//tbody/tr')))

内容的提问来源于stack exchange,提问作者amsr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:03:43