
selenium在自动化测试windows记事本时,`sendkeys("iii")`意外输出为“ııı”,根本原因是jvm默认locale影响了键盘事件的字符映射;通过显式设置英文locale可强制使用标准ascii字符集。
在使用Selenium驱动Windows原生应用(如记事本)进行UI自动化测试时,sendKeys()方法的行为不仅依赖于WebDriver本身,还受Java运行时环境(JVM)的系统区域设置(Locale) 影响。当JVM的默认Locale为土耳其语(tr_TR)、阿塞拜疆语等特定语言时,其内部字符规范化机制会将小写字母 i 映射为带点的 ı(Unicode U+0131),而非标准ASCII中的 i(U+0069)。这导致向记事本的Edit控件发送 "iii" 实际写入的是 ııı,进而使断言 Assert.assertEquals(np.textArea().getText(), "iii") 失败。
✅ 推荐解决方案:在测试初始化阶段显式设置JVM默认Locale为英语(US)
@BeforeClass
public static void setUpLocale() {
Locale.setDefault(new Locale("en", "US"));
}⚠️ 注意事项:
- 此设置需在driver启动之前执行,否则可能无效;
- 若测试并行运行,建议避免全局修改Locale.setDefault(),可改用ThreadLocal
或在关键操作前临时切换、操作后恢复; - 记事本本身不支持getText()获取内容(其Edit控件在Selenium中返回空字符串或不可靠值),上述断言 np.textArea().getText() 在实际中通常无法通过——应改用getDomAttribute("value")(对部分控件有效)或更可靠的方案:调用Windows API(如GetWindowText)或借助AutoIt/JNA读取文本;若仅验证输入行为,可跳过该断言,聚焦于后续关闭流程是否成功。
? 补充建议:
为提升跨环境稳定性,还可结合以下措施:
- 启动JVM时添加参数:-Duser.language=en -Duser.country=US;
- 使用Robot类模拟底层按键(绕过Locale影响),但需注意焦点与权限限制;
- 优先考虑专用Windows自动化框架(如WinAppDriver + WinAppDriver UI Recorder)替代Selenium操作原生桌面应用。
综上,"i" → "ı"的本质是Locale引发的字符映射偏差,而非Selenium或记事本缺陷;正确配置区域设置是解决该问题的关键一步。










