Protractor中无法为禁用键盘输入的<input type="date">选择日期
我太懂这种头疼的情况了——当日期输入框用onkeydown="return false"把键盘输入锁死时,Selenium的sendKeys()肯定不管用,因为所有键盘事件都被直接拦截了。别慌,这里有几个经过验证的解决方案,你可以根据自己的场景选:
解决方案
1. 直接通过JavaScript设置输入框的value属性(最推荐)
HTML5的type="date"输入框,实际存储的是**ISO格式(YYYY-MM-DD)**的日期值,不管前端显示的是什么格式,直接设置value属性就能绕过键盘事件的限制,这是最直接有效的方法。
以Selenium Java为例:
// 定位日期输入框 WebElement dateInput = driver.findElement(By.id("eventdate")); // 执行JavaScript设置value值 ((JavascriptExecutor) driver).executeScript("arguments[0].value = '2018-07-07';", dateInput);
如果是Python版本的Selenium:
date_input = driver.find_element(By.ID, "eventdate") driver.execute_script("arguments[0].value = '2018-07-07';", date_input)
⚠️ 注意:必须传入YYYY-MM-DD格式的字符串,这是HTML5 date输入框的标准值格式,其他格式(比如你之前用的07/07/2018)即使没有禁用键盘,也可能无法正确设置值。
2. 操作Angular表单控件(适配你的Angular场景)
因为你的输入框绑定了formcontrolname="attractionDate",属于Angular响应式表单,直接操作Angular的表单控件可以触发框架的验证和变更检测,和用户正常操作的逻辑完全一致:
// 执行JavaScript获取表单并设置控件值 ((JavascriptExecutor) driver).executeScript(""" // 找到包含目标表单的元素(根据你的实际DOM结构调整选择器) const formElement = document.querySelector('form'); // 从Angular的上下文获取表单实例(不同Angular版本可能需要调整__ngContext__的索引) const formInstance = formElement.__ngContext__.find(item => item?.controls?.attractionDate); if (formInstance) { formInstance.controls.attractionDate.setValue('2018-07-07'); } """);
这种方法适合需要确保表单状态同步的场景,比如设置后要触发后续的表单校验逻辑。
3. 移除onkeydown限制后使用sendKeys
如果你一定要用sendKeys()模拟键盘输入,可以先移除输入框的onkeydown属性解除限制,再发送符合标准格式的日期:
WebElement dateInput = driver.findElement(By.id("eventdate")); // 移除onkeydown属性,解除键盘输入拦截 ((JavascriptExecutor) driver).executeScript("arguments[0].removeAttribute('onkeydown');", dateInput); // 发送ISO格式的日期(部分浏览器也支持MM/DD/YYYY,但YYYY-MM-DD兼容性最好) dateInput.sendKeys("2018-07-07");
这个方法的优势是更贴近用户的真实操作流程,但需要注意不同浏览器对输入格式的兼容性。
内容的提问来源于stack exchange,提问作者Mancy Saxena
相关产品推荐
相关产品推荐

