
selenium 使用 execute_script 设置日期时出现月日颠倒,根本原因在于输入框期望的日期格式(如 mm/dd/yyyy)与脚本传入的格式(如 yyyy-mm-dd)不匹配,浏览器未做解析校验,直接按字符串赋值导致语义误读。
selenium 使用 execute_script 设置日期时出现月日颠倒,根本原因在于输入框期望的日期格式(如 mm/dd/yyyy)与脚本传入的格式(如 yyyy-mm-dd)不匹配,浏览器未做解析校验,直接按字符串赋值导致语义误读。
在 Web 自动化测试中,通过 execute_script 直接向 或普通文本型日期输入框写入时间字符串是一种常见做法。但需明确:execute_script 是纯字符串赋值操作,不触发浏览器内置的日期解析逻辑,也不进行任何格式校验或标准化转换。因此,最终显示效果完全取决于目标 元素所声明的 type 属性及其所在前端框架(如 React、Vue 或原生 HTML 表单)对输入值的解析规则。
例如,当执行以下代码时:
start_time = self.driver.find_element(By.XPATH, '//*[@id="start-time"]')
self.driver.execute_script('arguments[0].value = "2024-02-20 16:00"', start_time)若该输入框实际为 type="text" 且前端 JavaScript 依赖 new Date("2024-02-20 16:00") 解析(尤其在某些旧版浏览器或自定义控件中),则可能因区域设置(Locale)差异导致解析异常;更常见的情况是——该字段预期用户手动输入的是 mm/dd/yyyy HH:MM 格式(如美国本地化场景),此时字符串 "2024-02-20 16:00" 被前端脚本错误地拆分为 [2024, 02, 20] 并误认为 02 是月、20 是日,而当后续逻辑再以 mm/dd/yyyy 模式重新格式化显示时,就表现为“02月20日”被展示为“20月02日”(即视觉上月日颠倒)。
✅ 正确做法是:严格匹配目标输入框的预期格式。可通过以下步骤确认并修复:
-
检查 HTML 结构:使用浏览器开发者工具查看目标元素,重点关注:
- type 属性(datetime-local、date、text 等)
- 是否存在 pattern、placeholder 或 data-format 等提示性属性
- 手动在页面输入符合 placeholder 的值(如 02/20/2024 4:00 PM),观察其是否被正确识别
-
统一使用目标格式构造字符串:
若确认需 mm/dd/yyyy HH:MM 格式(12 小时制需注意 AM/PM),可借助 Python 的 datetime 和 strftime 安全生成:from datetime import datetime dt = datetime(2024, 2, 20, 16, 0) # year=2024, month=2, day=20, hour=16 formatted = 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)? 推荐使用 arguments[1] 传参而非硬编码字符串,避免 XSS 风险,也提升可维护性。
-
特殊类型处理建议:
- 对 type="datetime-local":必须使用 yyyy-MM-ddTHH:mm 格式(ISO 8601),例如 "2024-02-20T16:00";
- 对 type="date":仅需 yyyy-MM-dd;
- 对自定义组件(如 Ant Design DatePicker):优先调用其公开 API(如 click() + send_keys() 模拟用户操作),而非绕过组件逻辑直接赋值。
⚠️ 注意事项:
- 不要依赖 execute_script 替代用户真实交互——它跳过了事件触发(如 input、change),可能导致表单验证未生效或状态不同步;
- 在 CI 环境中,确保测试浏览器的系统区域设置(Locale)与被测应用部署环境一致,避免隐式解析差异;
- 建议封装日期设置逻辑为通用方法,结合 @property 或配置驱动,便于多环境适配。
总结:日期格式错乱不是 Selenium 的 Bug,而是人机协同中「输入契约」未被遵守的表现。精准匹配前端约定格式、优先模拟真实用户行为、辅以运行时格式校验,才是健壮自动化测试的关键。










