
selenium通过execute_script设置日期时出现月日颠倒,根本原因是输入框期望的日期格式(如mm/dd/yyyy)与脚本传入的格式(如yyyy-mm-dd)不匹配,浏览器未做解析校验,直接按字符串赋值导致语义误读。
selenium通过execute_script设置日期时出现月日颠倒,根本原因是输入框期望的日期格式(如mm/dd/yyyy)与脚本传入的格式(如yyyy-mm-dd)不匹配,浏览器未做解析校验,直接按字符串赋值导致语义误读。
在Web自动化测试中,使用 driver.execute_script() 直接向 或普通文本型时间输入框写入日期字符串是一种常见做法。但需特别注意:该操作不触发浏览器的日期解析逻辑,仅执行纯字符串赋值。若目标输入框的底层逻辑(如前端框架、HTML5 input type、或自定义日期组件)约定采用 mm/dd/yyyy 格式,而你传入 "2024-02-20 16:00"(ISO 8601 格式),浏览器可能将 "02" 误判为月份、"20" 误判为日期——看似正确;但一旦传入 "2024-13-05" 这类非法值,部分浏览器会静默忽略或重置字段,而 "2024-05-13" 则可能被错误解析为 05/13/2024(即5月13日),与预期 13/05/2024(13日5月)完全相悖。
关键在于:输入框的格式契约由前端定义,而非 Selenium 决定。因此,解决方案不是修改 Selenium 脚本逻辑,而是严格对齐前端所接受的格式。
✅ 正确做法是先确认目标输入框的实际格式要求。可通过以下方式判断:
- 查看 HTML 源码中 input 元素的 type 属性(如 type="date" 默认要求 yyyy-mm-dd;type="datetime-local" 要求 yyyy-MM-dd'T'HH:mm);
- 检查页面 JavaScript 初始化逻辑或框架文档(如 Bootstrap Datepicker、Flatpickr 等常强制 mm/dd/yyyy);
- 手动在浏览器中输入合法值并观察 DOM 变化;
- 使用 element.get_attribute('value') 获取当前值,反推格式。
例如,若确认输入框期望 mm/dd/yyyy HH:MM 格式,则应统一转换:
from datetime import datetime
# 原始时间对象
dt = datetime(2024, 2, 20, 16, 0)
# 格式化为前端所需格式(如 mm/dd/yyyy HH:MM)
formatted_value = dt.strftime("%m/%d/%Y %H:%M") # 输出:"02/20/2024 16:00"
start_time = self.driver.find_element(By.XPATH, '//*[@id="start-time"]')
self.driver.execute_script('arguments[0].value = arguments[1]', start_time, formatted_value)⚠️ 注意事项:
- 避免硬编码字符串(如 "02/20/2024 16:00"),应动态生成以保证可维护性;
- 对于 type="datetime-local" 输入框,必须使用 ISO 格式并带 T 分隔符:"2024-02-20T16:00",否则可能被清空;
- 执行 execute_script 后,建议触发 change 或 input 事件,确保前端监听器响应:
self.driver.execute_script('arguments[0].dispatchEvent(new Event("change", {bubbles: true}))', start_time) - 在跨时区场景下,注意 datetime 对象是否含 tzinfo,必要时使用 astimezone() 统一本地时区。
总结:日期格式错乱不是 Selenium 的 Bug,而是前后端格式契约未对齐的表现。自动化脚本应作为“忠实用户”,严格遵循前端接口规范——精准匹配格式,方能稳定可靠。










