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

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">

可能原因

  1. 前端自定义事件拦截:该输入框绑定了keydown/keyup/input等自定义事件,输入逻辑中错误过滤了非零数字。
  2. VNC环境按键映射异常:通过RealVNC连接Linux环境时,按键输入的映射出现问题,导致数字键信号未被浏览器正确接收。
  3. 焦点丢失问题:clear()操作后输入框焦点丢失,导致sendKeys()的输入不完整。
  4. 模拟按键与前端事件不兼容: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:35:18