我正在使用" native" C#SendKeys以及AutoItX库,在C#(VS 2015)中手动将登录凭据输入到Windows 10计算机上的登录窗口中。
很长一段时间,这一直在顺利完成。然后,显然突然间 - 我没有做任何改变 - 延迟超过1分钟是我所有代码样本的主导。也就是说,SendKeys.SendWait()
和AutoItX的Send()
方法都有效,但将密钥发送到活动窗口需要一分多钟。
这是我的代码:
我使用Selenium WebDriver打开Chrome浏览器窗口,SendKeys.SendWait()
或AutoItX.Send()
将用户名和密码以及TAB和ENTER发送到登录窗口。
public void OpenAndLoginSelenium (string username, string password) {
// Create the Selenium instance and navigate to the page:
var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;
Instance = new ChromeDriver(driverService);
Instance.Navigate().GoToUrl("http://my-lab-drop2.telecomputing.com");
// Alternative 1 - using AutoItX:
AutoItX.WinActivate("Authentication required", "");
AutoItX.Send(username);
AutoItX.Send("{TAB}");
AutoItX.Send(password);
AutoItX.Send("{TAB}");
AutoItX.Send("{ENTER}");
// Alternative 2 - using SendKeys():
SendKeys.SendWait(username);
SendKeys.SendWait("{TAB}");
SendKeys.SendWait(password);
SendKeys.SendWait("{ENTER}");
}
两种选择都有效,但在执行第一次发送之前需要1分3秒(此延迟似乎非常稳定)。在此时间过去之前没有任何事情发生。但是,发送之间没有延迟;只要将用户名字符串(在此示例中)输入到用户名字段中,其余部分(TAB - 输入密码 - ENTER)就会快速执行。在做任何事情之前,Windows只需等待一分三秒。
登录框是Chrome进入需要身份验证的网页时创建的标准系统登录框。我无法发布指向该页面的链接,因为它是内部链接,但请相信我。 (直接进行身份验证,使用http://login:pass@url不是一个选项,因为输入用户名/密码后的过程涉及比标准htauth更复杂的过程,使用som标记等等。)
在一个下午正常工作之间系统没有任何可见的变化,并且在重新启动系统后第二天早上突然出现这种延迟。我甚至无法找到有关任何Windows更新或任何其他更改的任何日志条目。但事情显然已经发生了 - 我只是无法找出什么,以及为什么这种极端和持续的延迟已经生效。
更新: 这里的主要问题是:为什么SendKeys()和AutoItX.Send()不再工作。接下来的问题是:如果没有解决方案,那么最简单的选择是什么?我需要做的是在浏览器的登录提示中键入用户名和密码(由Selenium WebDriver打开并进一步控制)并登录到网站。并输入文本并单击文件上传对话框等按钮。