自动化测试中Selenium设置的日期格式为何出现月日互换?
解决Selenium execute_script设置日期时日月互换的问题
问题原因
前端日期输入控件有预设的解析格式,当你直接通过execute_script设置value时,若传入的日期格式和控件期望的不匹配,控件会按照自身规则(比如浏览器区域设置、控件配置)解析,导致日月位置颠倒。比如你传入2024-02-20(yyyy-mm-dd),但控件期望的是dd/mm/yyyy格式,就会错误地把02当成日、20当成月,最终显示出颠倒后的日期。
解决方案
1. 按控件期望的格式直接设置值
先确认目标控件要求的日期格式(比如dd/mm/yyyy HH:mm),直接传入对应格式的字符串:
start_time = self.driver.find_element(By.XPATH, '//*[@id="start-time"]') self.driver.execute_script('arguments[0].value = "20/02/2024 16:00"', start_time)
2. 通过JS创建标准Date对象并格式化
如果不确定控件的解析规则,可以创建准确的Date对象,再格式化为控件支持的格式:
start_time = self.driver.find_element(By.XPATH, '//*[@id="start-time"]') script = ''' // 创建2024年2月20日16:00的Date对象(注意JS中月份是0基,2月对应1) const targetDate = new Date(2024, 1, 20, 16, 0); // 格式化为dd/mm/yyyy HH:mm const formatted = `${String(targetDate.getDate()).padStart(2, '0')}/${String(targetDate.getMonth()+1).padStart(2, '0')}/${targetDate.getFullYear()} ${String(targetDate.getHours()).padStart(2, '0')}:${String(targetDate.getMinutes()).padStart(2, '0')}`; arguments[0].value = formatted; ''' self.driver.execute_script(script, start_time)
3. 模拟真实用户输入(推荐)
避免直接操作value,改用send_keys模拟用户输入,更贴近真实交互,减少格式解析问题:
start_time = self.driver.find_element(By.XPATH, '//*[@id="start-time"]') start_time.clear() start_time.send_keys("20/02/2024 16:00") # 按控件要求的格式输入
内容的提问来源于stack exchange,提问作者Keerthana Baskar
相关产品推荐
相关产品推荐

