【问题标题】:WebBrowser Control Receives Javascript Error When Simulating Click Or Enter Key...Works When Clicking Or Pressing EnterWebBrowser 控件在模拟单击或 Enter 键时收到 Javascript 错误...在单击或按 Enter 时有效
【发布时间】:2013-10-31 07:42:47
【问题描述】:

我正在尝试自动登录特定站点。它看起来像是一个典型的表单,有两个文本输入(用户名、密码)和一个“提交”类型的按钮。这三个都有 id,所以我可以轻松地为每个调用 GetElementById。

我的代码如下所示:

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

这(排序)有效。值被设置,表单提交/请求被发送到服务器。但我立即得到一个 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,enter - 它确实有效。

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

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

谁能告诉我发生了什么以及如何让这个登录名与 WebBrowser 控件一起使用?

【问题讨论】:

  • 我已经成功地使用 WatiN (watin.org) 自动登录,但如果有人有解释,我仍然很好奇。

标签: c# .net automation webbrowser-control


【解决方案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。

【讨论】:

  • 有道理;我今晚会试一试。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多