Selenium WebDriver自动化测试日期设置失败问题求助
日历控件自动化测试填值问题解决
问题场景
编写自动化测试时,尝试为日历控件设置指定日期,但日期无法成功填入。测试代码如下:
class MvNowy(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(service=s) self.driver.implicitly_wait(30) self.base_url = "https://www.google.com/" self.verificationErrors = [] self.accept_next_alert = True def test_mv_nowy(self): driver = self.driver driver.maximize_window() # 进入orange.pl首页 driver.get("https://www.orange.pl/") print('进入orange首页') # 填写客户信息 driver.find_element(By.NAME, "firstName").send_keys('TESTABCD') driver.find_element(By.NAME, "lastName").send_keys('TESTOABCD') driver.find_element(By.NAME, "pesel").send_keys('14030356439') driver.find_element(By.NAME, "idNumber").send_keys('AKH467112') wait = WebDriverWait(driver, 5) elem = wait.until(EC.element_to_be_clickable((By.ID,"undefined-identificationRegisterDate-undefined"))) driver.execute_script("arguments[0].value ='2022-10-05';",elem) elem.send_keys("2022-10-05") driver.find_element(By.NAME, "postalCode").send_keys('05-270') print('填写完客户信息')
日历控件为带readonly属性的input元素,常规输入方式无法直接赋值。
解决方案
方法1:移除readonly属性后赋值
多数日历控件的input会设置readonly属性禁止手动输入,需先移除该属性再操作:
wait = WebDriverWait(driver, 10) # 等待元素加载完成 elem = wait.until(EC.presence_of_element_located((By.ID,"undefined-identificationRegisterDate-undefined"))) # 移除readonly属性 driver.execute_script("arguments[0].removeAttribute('readonly');", elem) # 清空输入框并填入目标日期 elem.clear() elem.send_keys("2022-10-05") # 触发change事件,确保页面识别到输入变化 driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", elem)
方法2:模拟日历弹窗选择日期
如果直接操作input无效,可模拟用户点击日历弹窗选择日期(需根据页面实际元素定位调整):
wait = WebDriverWait(driver, 10) elem = wait.until(EC.element_to_be_clickable((By.ID,"undefined-identificationRegisterDate-undefined"))) # 点击日历控件打开选择弹窗 elem.click() # 选择目标年份 wait.until(EC.element_to_be_clickable((By.XPATH, "//div[text()='2022']"))).click() # 选择目标月份 wait.until(EC.element_to_be_clickable((By.XPATH, "//div[text()='十月']"))).click() # 选择目标日期 wait.until(EC.element_to_be_clickable((By.XPATH, "//div[text()='5']"))).click()
注意事项
- 确保元素定位准确,避免因动态ID导致定位失败
- 优先使用显式等待(WebDriverWait)替代隐式等待,提升测试稳定性
- 部分控件需要触发
change或input事件才能识别输入值,需额外执行脚本触发
内容的提问来源于stack exchange,提问作者Cezary Paska
相关产品推荐
相关产品推荐

