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

如何用Selenium Python手动点击日期选择器改日期?JS修改提交失效

使用Selenium Python模拟手动点击修改日期选择器

直接通过JavaScript修改DOM内容会失效,是因为这类Angular驱动的日期选择器,仅修改界面文本不会触发组件内部的绑定事件,表单提交时会读取原始绑定值,导致恢复默认。必须模拟真实的点击交互流程,步骤如下:

1. 打开日期选择器面板

先点击触发日期选择器的元素(比如输入框或触发按钮),弹出日历弹窗:

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

# 定位并点击触发日期选择器的元素,根据实际页面调整定位方式
date_trigger = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@class='日期输入框的class']"))
)
date_trigger.click()

2. 切换到目标月份年份

通过前后月份切换按钮,将日历切换到目标日期所在的月份:

target_month_year = "August 2022"  # 替换为你的目标月份和年份
current_month_year = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.CLASS_NAME, "mdp-calendar-monthyear"))
).text

# 循环切换直到匹配目标月份
while current_month_year != target_month_year:
    # 判断需要切换的方向,这里示例为点击「下一月」按钮,如需切换上月则替换对应按钮定位
    next_btn = driver.find_element(By.XPATH, "//button[@aria-label='next month']")
    next_btn.click()
    # 等待月份更新后重新获取
    WebDriverWait(driver, 5).until(
        EC.text_to_be_present_in_element((By.CLASS_NAME, "mdp-calendar-monthyear"), target_month_year.split()[0])
    )
    current_month_year = driver.find_element(By.CLASS_NAME, "mdp-calendar-monthyear").text

3. 点击目标日期按钮

找到目标日期对应的可用按钮并点击,该操作会触发组件的选择事件,完成日期绑定:

target_day = "26"  # 替换为你的目标日期

# 定位到可用的目标日期按钮(排除disabled状态的按钮)
target_day_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, f"//button[not(@disabled)]//span[text()='{target_day}']/parent::button"))
)
target_day_btn.click()

注意事项

  • 所有元素定位方式(XPath、CLASS_NAME等)需根据实际页面结构调整,确保精准定位
  • 使用WebDriverWait显式等待可避免元素未加载完成导致的报错
  • 模拟真实点击会触发组件的ng-click事件(calendar.selectDate(day.value);datepicker.confirm()),确保日期被正确同步到表单绑定值,提交时不会恢复默认

内容的提问来源于stack exchange,提问作者Potato man l

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:45:38