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

Firefox中Selenium WebDriver C#无法向日期选择器SendKeys的问题

针对Firefox 58中SendKeys无法操作Date输入框的解决方案&原因分析

嘿,我之前也碰到过类似的浏览器兼容性坑,针对你的情况,咱们来拆解下问题根源和可行的解决办法:

问题出在哪?

Chrome和Firefox(尤其是58这种旧版本)对HTML5 type="date" 原生控件的处理逻辑差异很大:

  • Chrome对输入格式容错性高,直接输入纯数字串(比如01012018)能被自动解析成日期;
  • 但Firefox 58的原生日期控件只认ISO标准格式(YYYY-MM-DD),而且它的输入交互更依赖原生事件,直接SendKeys非标准格式的内容,控件根本无法识别。另外,旧版GeckoDriver对这类原生控件的支持也没ChromeDriver成熟,这也会导致模拟输入失效。

靠谱的解决办法(按优先级排序)

1. 直接通过JS修改元素value(最推荐)

绕过SendKeys的局限性,直接用JavaScript修改输入框的value属性,这招几乎通吃所有浏览器,不管控件是原生还是框架封装的:

var dateInput = Driver.FindElement(By.Id("uiAssessmentsDueDate"));
var jsExecutor = (IJavaScriptExecutor)Driver;
jsExecutor.ExecuteScript("arguments[0].value = '2018-01-01';", dateInput);

这个方法直接操作DOM属性,不依赖浏览器的输入交互逻辑,绝对稳。

2. 用ISO格式发送SendKeys

如果你坚持要用SendKeys,那得把输入内容改成Firefox能识别的YYYY-MM-DD格式,同时先激活输入框:

var dateInput = Driver.FindElement(By.Id("uiAssessmentsDueDate"));
dateInput.Click(); // 先激活输入框
dateInput.Clear(); // 清空原有内容避免干扰
dateInput.SendKeys("2018-01-01"); // 用标准ISO格式

你的原输入01012018不符合Firefox的解析规则,所以根本不会生效,换成标准格式就没问题了。

3. 用Actions类模拟完整用户操作

如果前两种方法都不行,试试用Actions模拟真实用户的操作流程,确保每一步都触发控件的事件:

var dateInput = Driver.FindElement(By.Id("uiAssessmentsDueDate"));
var actions = new Actions(Driver);
actions.MoveToElement(dateInput)
       .Click()
       .SendKeys(Keys.Control + "a") // 全选现有内容
       .SendKeys(Keys.Delete) // 删除内容
       .SendKeys("2018-01-01")
       .Build()
       .Perform();

这种方式模拟用户真实操作,能触发控件的所有事件监听,适合一些对交互逻辑要求严格的场景。

额外要检查的点

  • GeckoDriver版本兼容性:Firefox 58要搭配v0.20.1左右的GeckoDriver,太新的版本已经不再支持旧版Firefox了,版本不匹配也会导致各种奇怪的问题;
  • 元素是否只读:你的元素有ng-readonly="isReadonly"属性,一定要确认isReadonly的值是false,如果是只读状态,不管怎么操作都没法输入内容。可以用dateInput.GetAttribute("readonly")或者JS验证:jsExecutor.ExecuteScript("return arguments[0].readOnly;", dateInput)。

内容的提问来源于stack exchange,提问作者Aaron Rice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:54:39