C# Selenium清空数值输入框后SendKeys赋值异常求解
Selenium操作number类型输入框清空后自动重置最小值、输入值拼接异常解决方案
问题根因
该异常由两点共同触发:
- 目标输入框为
type="number"的受控表单组件,绑定了前端实时校验逻辑:当输入框值被清空为空时,会自动重置为min属性定义的最小值0.01,该动作触发时机在Clear()方法执行完成、SendKeys()方法执行之前,因此Clear操作结束后输入框已存在默认值0.01,后续输入内容会直接拼接在该值后,最终得到0.01002的错误结果。 - Selenium原生
Clear()方法对绑定了自定义input/change事件的前端组件兼容性较差,无法拦截清空动作触发的自动赋值逻辑。
可行解决方案
方案1:全选覆盖输入(无JS依赖,兼容性最好)
不调用Clear()方法,通过快捷键全选输入框内已有内容,直接输入新值覆盖选中内容,全程不会出现输入框为空的阶段,不会触发最小值重置逻辑。
IWebElement element = webdriver.FindElement(By.Id("entry-lots")); element.Click(); // Windows环境下发送Ctrl+A全选,MacOS环境替换为Keys.Command + "a" element.SendKeys(Keys.Control + "a"); // 输入新值直接覆盖选中内容 element.SendKeys("0.02");
方案2:JS直接赋值(稳定性最高,不受UI焦点影响)
通过JavaScript执行器直接修改输入框的值,手动触发组件绑定的更新事件,绕过UI层面的键盘、点击交互,完全避开清空触发的校验逻辑。
IWebElement element = webdriver.FindElement(By.Id("entry-lots")); IJavaScriptExecutor jsExecutor = (IJavaScriptExecutor)webdriver; jsExecutor.ExecuteScript(@" const input = arguments[0]; input.value = arguments[1]; // 触发前端框架监听的输入、变更事件,确保值同步生效 input.dispatchEvent(new Event('input', { bubbles: true })); input.dispatchEvent(new Event('change', { bubbles: true })); ", element, "0.02");
方案3:退格删除后输入(适配特殊严格校验场景)
如果上述两种方案被页面特殊校验拦截,可以通过多次发送退格键删除原有内容,删除后立即输入新值,缩短空值存在的窗口,避开自动重置逻辑。
IWebElement element = webdriver.FindElement(By.Id("entry-lots")); element.Click(); // 多预留3次退格,覆盖自动填充的0.01长度 int deleteTimes = element.GetAttribute("value").Length + 3; for (int i = 0; i < deleteTimes; i++) { element.SendKeys(Keys.Backspace); } element.SendKeys("0.02");
注意事项:禁止在调用
Clear()方法后添加显式/隐式等待,否则自动填充的最小值会稳定写入输入框,必然出现内容拼接问题。
内容的提问来源于stack exchange,提问作者Dragon
相关产品推荐
相关产品推荐

