模拟单击或输入键时WebBrowser控件收到Javascript错误...单击或按Enter键时工作

时间:2013-10-30 16:50:36

标签: c# .net automation webbrowser-control

我正在尝试自动登录到特定网站。它似乎是一个典型的表单,有两个文本输入(用户名,密码)和一个类型为'submit'的按钮。这三个都有id,所以我可以轻松地为每个ID调用GetElementById。

我的代码与此类似:

webBrowser1.Document.GetElementById("username").SetAttribute("Value", "myUser");
webBrowser1.Document.GetElementById("password").SetAttribute("Value", "myPass");
webBrowser1.Document.GetElementById("submitButton").InvokeMember("Click");

这(sorta)有效。值已设置,表单的提交/请求将发送到服务器。但我立即得到一个javascript错误。如果我删除“点击”行并让我的程序加载页面/填充用户名/密码,我手动点击按钮 - 一切正常100%。

好的,我想......我不需要点击。我可以使用键盘!三个选项卡然后输入成功登录我。所以我尝试使用SendKeys.Send()

Thread.Sleep(250);
SendKeys.Send("{TAB}");
Thread.Sleep(250);
SendKeys.Send("{TAB}");
Thread.Sleep(250);
SendKeys.Send("{TAB}");
Thread.Sleep(250);
SendKeys.Send("{ENTER}");   

最初是一行,我在调试时介绍了延迟,但无济于事。上面的代码产生与我自动点击时完全相同的结果 - 一个javascript错误,并且下一页没有加载。

但是,如果我按Tab键,tab,tab,输入 - 它确实有效。

我更进了一步,如果保留SendKeys.Send(“{TAB}”)代码,我的自动化程序将填充用户名/密码并成功将焦点导航到提交按钮。如果我按下键盘上的Enter,没有javascript错误,一切都很好。但如果我使用SendKeys.Send(“{ENTER}”) - 没有任何作用。

我的印象是,就Windows操作系统而言,SendKeys.Send生成了一个“真正的”按键?

有人能告诉我发生了什么以及如何让这个登录使用WebBrowser控件吗?

1 个答案:

答案 0 :(得分:1)

难以猜测,但请尝试这样:

async Task SendSomeKeys()
{
  await Task.Delay(250);
  SendKeys.Send("{TAB}");
  await Task.Delay(250);
  SendKeys.Send("{TAB}");
  await Task.Delay(250);
  SendKeys.Send("{TAB}");
  await Task.Delay(250);
  SendKeys.Send("{ENTER}");
}

不同之处在于,您可以通过这种方式异步发送密钥,使浏览器有机会在击键之间处理Windows消息(与Thread.Sleep不同)。因此,它更接近手动操作。如果可行,则相同的方法可能适用于SetAttribute / InvokeMember