我有一个带有WebBrowser控件的.NET Winform,它使用用户名和密码登录到网站。 "提交"按钮被禁用,直到在密码文本框中输入了某些内容,因此我无法使用txt.SetAttribute(),因为它似乎没有启用提交按钮。使用SendKeys.Send(密码)工作正常,并启用提交按钮。
问题是当我的计算机锁定时,似乎SendKeys命令会导致以下情况:
System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
起初我认为这与我的帐户有关,但我是PC上的管理员,我的会话仍然活着,只是PC被锁定了。
我读了here我可以使用SendMessage API函数,所以我尝试了这个:
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessesByName(_formProcessName).FirstOrDefault();
if (p == null)
{
throw new Exception(string.Format("Login Error. Cannot find window process name: [{0}]", _formProcessName));
}
IntPtr h = p.MainWindowHandle;
const int WM_SETTEXT = 0x000C;
SendMessage(h, WM_SETTEXT, IntPtr.Zero, _password);
......无济于事。没有错误,但它似乎没有向窗口发送任何内容,即使它确实获得了正确的窗口句柄。
我的问题是,即使我的电脑被锁定,我怎样才能对一个web浏览器控件执行SendKeys()?有人有什么建议吗?
答案 0 :(得分:0)
经过多次挖掘,我决定切换到Selenium。而且它更简单!!
using (var driver = new ChromeDriver())
{
// Go to the home page
driver.Navigate().GoToUrl("yourloginpageurl");
var userNameField = driver.FindElementByName("userIdTextInput");
userNameField.SendKeys("aaa");
var passwordField = driver.FindElementByName("pwdIdTextInput");
passwordField.SendKeys("bbb");
var loginButton = driver.FindElementByXPath("//form[@id='abc']/button");
loginButton.Click();
}
就这么简单。 PC锁定时工作正常,所以主要问题就解决了。它也更容易编码。 built-in wait objects比WebBrowser的DocumentWait事件更容易。如果您在使用WebBrowser控件后遇到问题,我建议您尝试使用Selenium。到目前为止,我看到的唯一缺点是它是您正在使用的浏览器的真实实例,因此它没有内置到您的表单中,您可以根据需要隐藏它。