【问题标题】:Simulate keypress in a non-visible webbrowser object C#在不可见的网络浏览器对象 C# 中模拟按键
【发布时间】:2010-10-29 05:56:51
【问题描述】:

我目前正在使用 .net 3.5 中的 webbrowser 对象浏览网页并收集有关产品、价格等数据的应用程序。

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

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

【问题讨论】:

    标签: c# .net html ajax browser


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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        相关资源
        最近更新 更多