
selenium在自动化测试记事本(notepad)时,`sendkeys("iii")` 显示为“ııı”,根本原因是系统区域设置(locale)导致小写字母“i”被渲染为带点的土耳其语/阿塞拜疆语变体“ı”,需显式设置jvm默认locale为英语环境。
该问题并非Selenium驱动或元素定位错误,而是底层Windows文本输入行为受Java运行时Locale影响。当JVM默认Locale为tr-TR(土耳其语)、az-AZ(阿塞拜疆语)等特定语言环境时,Java的文本处理逻辑(尤其涉及Character.toLowerCase()等底层调用)可能间接影响AWT/Swing组件(如Notepad的Edit控件)对键盘事件的解析——尽管Notepad本身是原生Win32应用,但Selenium通过Windows UI Automation或SendInput模拟按键时,若Java进程的Locale未标准化,部分输入法上下文或系统API调用可能误判字符映射,最终导致拉丁字母“i”被替换为无点形式“ı”。
✅ 解决方案:在测试初始化阶段强制设置JVM默认Locale
@BeforeClass
public static void setUpLocale() {
// 强制设为美式英语,避免区域性字符映射干扰
Locale.setDefault(new Locale("en", "US"));
}⚠️ 注意事项:
- 此设置必须在WebDriver实例创建之前生效,否则无效;
- 若使用并行测试(TestNG/JUnit 5),需确保每个测试线程不相互覆盖Locale(可考虑ThreadLocal
封装,但对简单Notepad测试,全局@BeforeClass已足够); - 验证是否生效:可在测试中添加 System.out.println(Locale.getDefault()); 确认输出为 en_US;
- 替代方案:若无法修改JVM Locale(如CI环境受限),可改用Robot类绕过Selenium输入链路,直接模拟物理按键:
Robot robot = new Robot();
String text = "iii";
for (char c : text.toCharArray()) {
int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);
robot.keyPress(keyCode);
robot.keyRelease(keyCode);
Thread.sleep(50); // 防抖动
}? 总结:Notepad中“i”→“ı”的异常表现,本质是Locale敏感的字符处理链路引发的副作用。坚持“测试环境可控”原则——统一JVM Locale是最轻量、最可靠的修复方式,无需修改系统区域设置或依赖外部工具。










