2013-10-30 45 views
0

我试图自动登录到一个特定的站点。它看起来像是一个典型的带有两个文本输入(用户名,密码)和一个'submit'类型的按钮。所有三个人都有ID,所以我可以轻松地为每个人调用GetElementById。WebBrowser控件接收Javascript错误当模拟点击或输入键......当点击或按Enter键时工作

我的代码看起来与此类似:

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错误,并且下面的页面没有加载。

但如果我按标签,标签,标签,输入 - 它确实有效。

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

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

任何人都可以告诉我发生了什么以及如何让这个登录与WebBrowser控件一起工作吗?

+0

我已经使用WatiN(http://watin.org/)成功地实现了登录的自动化,但是如果有人有解释,我仍然会好奇。 –

回答

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

+1

这很有道理;我今天晚上会去。谢谢 –

相关问题