如何用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
相关产品推荐
相关产品推荐

