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的逻辑覆盖
修复方案
按以下顺序调整代码逻辑即可解决:
- 页面加载完成后,首先主动点击历史数据Tab,等待历史数据模块DOM渲染完成后再做后续操作,不要直接操作日期控件
- 日期输入完成后,手动触发输入框的
change事件,确保前端逻辑能读取到输入的日期值;不要只输入内容就直接点按钮 - 点击Apply按钮后,等待日期选择器面板完全从DOM中移除,再加300ms固定延迟等待参数同步,再定位Search按钮点击
- 点击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
相关产品推荐
相关产品推荐

