在不可见的网络浏览器对象 C# 中模拟按键
Posted
技术标签:
【中文标题】在不可见的网络浏览器对象 C# 中模拟按键【英文标题】:Simulate keypress in a non-visible webbrowser object C# 【发布时间】:2010-10-29 05:56:51 【问题描述】:我目前正在使用 .net 3.5 中的 webbrowser 对象浏览网页并收集有关产品、价格等数据的应用程序。
问题是页面有一些字段带有ajax中的建议脚本,我不能简单地修改innerText属性,因为脚本还将代码保存在隐藏的输入字段中。
我需要一种方法来模拟在该字段中的输入,然后发送“Enter”键,或者启动 ajax 脚本然后发送“Enter”键,或者任何更好的方法来执行此操作。
【问题讨论】:
【参考方案1】:使用Watin
那你可以use this solution。
【讨论】:
这似乎正是我所需要的,我将首先用 Beatles1692 的想法进行快速测试(用于原型),然后我将开始使用 Watin 进行最终版本。【参考方案2】:要提交表单或运行脚本,您可以执行以下操作: 如果您知道脚本名称,则可以使用 Document 对象的 InvoekScript:
myWebBrowser.Document.InvokeScript("script-name",null);
第二个参数是传递参数值的对象数组。
如果您知道点击事件触发脚本的元素名称,您可以这样做:
htmlElement element=myWebBrower.Document.GetElementById("element-name")[0];
element.InvokeMember("click");
【讨论】:
【参考方案3】:使用标准的 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必须成对出现,否则key不会被注册,但是如果你在发送时按住Control,例如KEYDOWN "p",它会激活IE的打印功能。对于所有字母和数字,您可以为 KEYDOWN 发送 0,为 KEYUP 发送正确的字母。 Backspace 似乎需要一个真正的 KEYDOWN,而不是 0,但 Control-Backspace 在 IE 中似乎作用不大,所以如果 c = vbBack,KEYDOWN 需要不同。
按键也不是很准确,大约 500 次按键有 1 次未命中。但是你可以用最小化的窗口来做到这一点,没问题,和一个标准的 WebBrowser 控件。
另一个选择是使用 AxWebBrowser。 ActiveX 控件似乎避免了 Control-P 的问题,但操作起来并不容易,因为它不是一个好的 .Net 控件。
【讨论】:
以上是关于在不可见的网络浏览器对象 C# 中模拟按键的主要内容,如果未能解决你的问题,请参考以下文章