Selenium sendKeys无法输入字符串中的非零数字问题求助
Selenium sendKeys() 丢失非零数字的问题排查与解决
问题现象
使用Selenium的sendKeys()方法向特定type="text"输入框输入内容时,非零数字会被异常忽略,具体表现:
- 输入
5.0,实际输入.0 - 输入
5,实际输入空白 - 输入
55.0,实际输入.0 - 输入
550.0,实际输入0.0
其他页面的同类或不同类输入框无此问题,已排除ChromeDriver版本兼容问题(其他同类型字段可正常工作)。技术栈为Java 8、Selenium 4.13.0、ChromeDriver 118.0.5993.70,测试环境为Azure Linux实例(通过RealVNC连接)。
相关代码
输入设置方法
public void setValue(String value) { if(selectedField.getTagName().equalsIgnoreCase("input")) { selectedField.clear(); selectedField.sendKeys(value); } else if(selectedField.getTagName().equalsIgnoreCase("select")) { this.setCombo(value); } else throw new AssertionError("Trying to assign value to an unrecognized field type"); }
private WebElement selectedField; // 已确认该元素定位正确
异常输入框的HTML代码
<input id="scheduleRun:elipsu" type="text" name="scheduleRun:elipsu" value="10.0" size="5" title="Size of the screening volume in the radial direction of the OCRF reference frame of the target">
可能原因
- 前端自定义事件拦截:该输入框绑定了
keydown/keyup/input等自定义事件,输入逻辑中错误过滤了非零数字。 - VNC环境按键映射异常:通过RealVNC连接Linux环境时,按键输入的映射出现问题,导致数字键信号未被浏览器正确接收。
- 焦点丢失问题:
clear()操作后输入框焦点丢失,导致sendKeys()的输入不完整。 - 模拟按键与前端事件不兼容:Selenium默认的模拟按键触发方式,和前端的事件监听逻辑不匹配。
解决办法
1. 直接通过JS修改输入框值(绕过前端事件)
用JavaScript直接设置输入框的value属性,避免模拟按键触发异常的前端逻辑:
public void setValue(String value) { if(selectedField.getTagName().equalsIgnoreCase("input")) { JavascriptExecutor js = (JavascriptExecutor) driver; // 直接赋值 js.executeScript("arguments[0].value = arguments[1];", selectedField, value); // 可选:触发input事件,确保前端感知值变化 js.executeScript("arguments[0].dispatchEvent(new Event('input'));", selectedField); } else if(selectedField.getTagName().equalsIgnoreCase("select")) { this.setCombo(value); } else throw new AssertionError("Trying to assign value to an unrecognized field type"); }
2. 优化sendKeys()执行逻辑
- 确保输入框始终保持焦点:
public void setValue(String value) { if(selectedField.getTagName().equalsIgnoreCase("input")) { selectedField.click(); // 点击获取焦点 selectedField.clear(); selectedField.sendKeys(value); } // 其他逻辑不变 }
- 逐字符输入,给前端足够的处理时间:
public void setValue(String value) { if(selectedField.getTagName().equalsIgnoreCase("input")) { selectedField.clear(); for (char c : value.toCharArray()) { selectedField.sendKeys(String.valueOf(c)); Thread.sleep(50); // 可选:添加短暂延迟,确保每个字符被处理 } } // 其他逻辑不变 }
3. 排查前端事件逻辑
在浏览器控制台执行以下命令,查看输入框绑定的事件:
getEventListeners(document.getElementById('scheduleRun:elipsu'));
如果发现异常的输入过滤逻辑,联系前端团队修复或调整测试逻辑适配前端规则。
4. 排除VNC环境影响
- 在VNC连接的Linux环境中手动操作浏览器,在该输入框输入数字,确认是否能正常输入,排除环境按键映射问题。
- 尝试用无头模式运行ChromeDriver,避开VNC的干扰:
ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new"); WebDriver driver = new ChromeDriver(options);
内容的提问来源于stack exchange,提问作者Mastarius
相关产品推荐
相关产品推荐

