使用Selenium WebDriver填写fast2sms注册表单日期字段报错如何解决
Selenium操作fast2sms注册页出生日期字段报错解决方案
问题根因
抛出ElementNotInteractableException的核心原因是该出生日期输入框默认设置了readonly只读属性,禁止用户直接输入内容,只能通过配套的日期选择器选择值,所以直接调用send_keys方法会触发交互异常。
解决方案
方案1:通过JavaScript直接操作输入框(推荐)
该方案无需操作复杂的日期选择器节点,兼容性高、代码简洁,优先选择:
# 定位出生日期输入框 dob_field = driver.find_element_by_css_selector('input[name="signup_dob"]') # 执行JS代码移除输入框的只读属性 driver.execute_script("arguments[0].removeAttribute('readonly')", dob_field) # 清空默认值后写入生成的日期 dob_field.clear() dob_field.send_keys(dob)
如果移除只读属性后send_keys依然失效,可以直接通过JS给输入框赋值:
driver.execute_script(f"arguments[0].value = '{dob}'", dob_field)
方案2:模拟真实用户操作日期选择器
如果需要完全模拟真实用户的点击选择操作,可以使用该方案:
# 点击输入框唤起日期选择器 dob_field.click() # 等待日期选择器加载完成后按顺序选择年、月、日 # 选择1990年 year_opt = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//span[@class="year" and text()="1990"]'))) year_opt.click() # 选择1月(月份选项索引从0开始,1月对应第一个选项) month_opt = driver.find_element(By.XPATH, '//span[@class="month" and text()="Jan"]') month_opt.click() # 选择2号 day_opt = driver.find_element(By.XPATH, '//td[@class="day" and text()="2"]') day_opt.click()
注:该方案的元素选择器需要根据页面日期组件的实际类名、文本内容微调,如果页面日期选择器结构有更新需要同步修改定位逻辑。
注意事项
如果通过JS赋值后,表单校验依然提示出生日期未填写,说明页面监听了输入框的change事件,需要主动触发一次事件通知页面值已更新:
driver.execute_script("arguments[0].dispatchEvent(new Event('change'))", dob_field)
内容的提问来源于stack exchange,提问作者Datajack
相关产品推荐
相关产品推荐

