在不可见的webbrowser对象中模拟按键C#

时间:2009-05-27 11:17:32

标签: c# .net html ajax browser

我目前正在开发一个必须浏览网页的应用程序,并使用.net 3.5中的webbrowser对象重新收集有关产品,价格,...的数据。

问题是该页面在ajax中有一些带有建议脚本的字段,我不能简单地修改innerText属性,因为该脚本还将代码保存在隐藏的输入字段中。

我需要一种方法来模拟该字段中的输入,然后发送“Enter”键,或启动ajax脚本然后发送“Enter”键,或者更好的方法来执行此操作。

4 个答案:

答案 0 :(得分:3)

使用Watin

然后你可以use this solution

答案 1 :(得分:2)

要提交表单或运行脚本,您可以执行以下操作: 如果您知道脚本名称,则可以使用InvoekScript of Document对象:

myWebBrowser.Document.InvokeScript("script-name",null);

第二个参数是一个传递参数值的对象数组。

如果你知道它的click事件触发脚本的元素的名称,你可以这样做:

HtmlElement element=myWebBrower.Document.GetElementById("element-name")[0];
element.InvokeMember("click");

答案 2 :(得分:1)

使用标准的WebBrowser控件有几种方法可以做到这一点。

对于HTML:如果您要填写文本框然后点击提交,那么请不要使用按键。这样做:

webbrowser1.Navigate("javascript:function%20E(){f0=document.forms[0];f0['login'].value='foo';}E()")
webbrowser1.Navigate("javascript:document.forms[0].submit()")

这比尝试发送HTML的按键更加可靠。

**对于Flash:**如果网页上有需要点击的flash元素,则无法使用。在这种情况下,SendKeys是可靠的,但只发送到活动应用程序,因此它不能在后台运行。您可以发送这样的Windows消息(示例将按下字母“f”):

Dim c as char = "f"c
Dim classname As New System.Text.StringBuilder(100)
Dim ExplorerHandle As IntPtr = webbrowser1.Handle
GetClassNameA(ExplorerHandle, classname, classname.Capacity)
Do While classname.ToString <> "Internet Explorer_Server"
    ExplorerHandle = GetWindow(GetExplorerHandle, GetWindow_Cmd.GW_CHILD)
    GetClassNameA(ExplorerHandle, classname, classname.Capacity)
Loop

PostMessageA(ExplorerHandle, WM_Constants.WM_KEYDOWN, IntPtr.Zero, IntPtr.Zero)
PostMessageA(ExplorerHandle, WM_Constants.WM_KEYUP, CType(VkKeyScanA(CType(Asc(c), Byte)), IntPtr), IntPtr.Zero)

您可以在pinvoke.net上在线找到PostMessage,GetClassName,GetWindow等的定义。请注意,WM_KEYUP使用c,但WM_KEYDOWN发送一个虚拟键(0)。 KEYDOWN和KEYUP必须成对出现,否则密钥将不会被注册,但如果您在发送时按住Control,例如KEYDOWN“p”,它将激活IE的打印功能。对于所有字母和数字,您可以为KEYDOWN发送0,为KEYUP发送正确的字母。 Backspace似乎需要一个真正的KEYDOWN,而不是0,但Control-Backspace似乎在IE中没有那么多,所以如果c = vbBack,KEYDOWN需要不同。

按键也不是非常准确,并且在未错过的约500次中有一次。但是你可以在窗口最小化,没问题和标准的WebBrowser控件的情况下完成它。

另一种选择是使用AxWebBrowser。 ActiveX控件似乎避免了Control-P问题,但它并不容易操作,因为它不是一个很好的.Net控件。

答案 3 :(得分:0)

某些AJAX元素不响应element.InvokeMember(“click”)。

一个简单的sendkeys脚本可能适用于您的项目,但最可靠的方法是挂钩Web浏览器控件(非常棘手,但可行)。或者您购买了现成的组件,例如iMacros:http://www.iopus.com/iMacros/component.htm