You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:59:58