Windows下Selenium以服务运行时无法输入@等特殊字符问题
解决方案:Session 0环境下Selenium无法输入特殊字符
方案1:修改任务计划的会话模式(适合允许用户登录的场景)
- 打开任务计划程序,找到启动Selenium Server的任务
- 右键选择「属性」→「常规」标签页
- 在「安全选项」中,取消勾选「不管用户是否登录都要运行」,改为选择「只有在用户登录时才运行」
- 同时勾选「使用最高权限运行」,若需开机自动启动,切换到「触发器」标签页,添加「登录时」的触发器
此方法让Selenium运行在用户会话而非Session 0,加载完整的用户键盘布局配置,解决按键模拟异常问题。
方案2:用JavaScript直接设置输入值(推荐无人值守场景)
绕过SendKeys的系统按键模拟,直接通过JavaScript操作DOM设置输入框值,不受Session 0环境限制:
[TestMethod] public void LocalInputTest() { ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.AddArgument("--window-size=1920,1080"); chromeOptions.AddArgument("--headless"); var webDriver = new RemoteWebDriver(new Uri("http://localhost:4444/"), chromeOptions); webDriver.Navigate().GoToUrl("file:///C:/git/selenium-test/index.html"); var inputText = "@éáőöüú<#&@{}>asd@"; var element = webDriver.FindElement(By.XPath($"//*[@data-e2e-testing = 'problematic.input']")); // 用JS设置输入值,替代SendKeys IJavaScriptExecutor js = (IJavaScriptExecutor)webDriver; js.ExecuteScript("arguments[0].value = arguments[1];", element, inputText); // 触发input事件,确保页面校验逻辑捕获值变化 js.ExecuteScript("arguments[0].dispatchEvent(new Event('input'));", element); var screenshot1 = (webDriver as ITakesScreenshot).GetScreenshot(); screenshot1.SaveAsFile("C:/git/selenium-test/screenshot.png"); var text = webDriver.FindElement(By.XPath($"//*[@data-e2e-testing = 'problematic.input']")).GetAttribute("value"); Assert.AreEqual(inputText, text); }
方案3:为Chrome指定用户配置文件
创建包含正确键盘布局的Chrome用户配置文件,在启动参数中指定:
chromeOptions.AddArgument(@"--user-data-dir=C:\path\to\your\chrome-profile");
可先在普通cmd会话中启动Chrome,配置好键盘布局后,将用户目录复制到指定路径,确保Session 0环境加载该配置。
问题原因分析
Windows的Session 0隔离环境不加载用户个性化键盘布局和输入服务配置,SendKeys依赖系统级按键模拟,@、#、&等特殊字符需要特定键盘组合(如Shift+2输入@),但Session 0无法正确解析这些组合;而带重音的字符通过Unicode编码直接输入,不依赖键盘布局,因此不受影响。
内容的提问来源于stack exchange,提问作者Czinke Csaba
相关产品推荐
相关产品推荐

