【问题标题】:Submission of a webpage form using WebBrowser control in C#在 C# 中使用 WebBrowser 控件提交网页表单
【发布时间】:2011-02-04 19:17:22
【问题描述】:

我在 SO 以及一般网络上看到了很多关于这个特定主题的帖子,并且大多数(如果不是全部)代码如下所示

private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
  webBrowser1.Navigate(new Uri("http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/onsubmit.htm"));
}

private void btnLogin_Click(object sender, RoutedEventArgs e)
{
    mshtml.HTMLDocument htmlDoc = null;

    htmlDoc = (mshtml.HTMLDocument) this.webBrowser1.Document;

    if (webBrowser1.Document != null)
    {
        foreach (mshtml.HTMLFormElement form in htmlDoc.forms)
        {
            form.submit();
            break;
        }
    }
}

代码没有任何错误,但终生没有提交。我正在使用的示例页面有一个简单的按钮,它的作用是提醒选择单选按钮,然后提交表单。由于某些奇怪的原因,当使用 WebBrowser 控件通过代码提交表单时,表单已提交但警报从未出现。

我不确定我在这里做错了什么。对此的任何帮助将不胜感激。

【问题讨论】:

  • 请问您为什么要这样做?
  • 您是如何将事件挂钩的,以及与什么挂钩?
  • @Matti,我正在尝试在没有记住我选项的内部网络上自动化登录过程。
  • @Yochai,很抱歉,我确实理解了你的问题。
  • @vikramjb,为什么不将登录信息和您需要的任何其他信息源转换为 wcf 服务?对我来说似乎是最合乎逻辑的解决方案,无论如何都比通过 html 解析要好得多。

标签: c# controls wpf-controls webbrowser-control


【解决方案1】:

点击按钮会做你需要做的事情吗?您将需要添加对 Microsoft HTML 对象库(您可能已经拥有)的 COM 引用。例如,如果您将 google 加载到 webbrowser 控件中,此代码会将“hello world”放入搜索框中并执行搜索:

        mshtml.IHTMLDocument2 doc = ((mshtml.HTMLDocumentClass)webBrowser1.Document);


         ((mshtml.IHTMLElement)doc.all.item("q")).setAttribute("value", "hello world");
         MessageBox.Show("Clicking I'm feeling lucky button");
        ((mshtml.HTMLInputElement)doc.all.item("btnI")).click();

编辑:我更新了 WPF WebBrowser 控件使用的组件的代码。另请注意,这有时会从 google 引发脚本错误,但这似乎是基于 google 在主页上的一些 ajax 调用的时间问题。

【讨论】:

  • WebBrowser1 控件中似乎没有 All 方法。我错过了什么吗?
  • .all 属性是 webbrowser 类的 .Document 成员的成员。它从 .net 2.0 开始可用:msdn.microsoft.com/en-US/library/…
  • 我在 WPF 项目中使用 webBrowser 控件,但在任何地方都看不到该方法。此外,webBrowser 控件的文档属性似乎是 Object 数据类型。
  • 我更新了代码以使用 WPF 控件公开的 COM 对象,我最初使用 WinForms 控件进行测试。
  • 知道了,约翰。做了一些小的代码更改,我准备好了。
【解决方案2】:

要解决您的问题,您需要替换行:

form.submit();

使用以下代码:

var children = form as IEnumerable;
var inputs = children.OfType<mshtml.HTMLInputElement>();
var submitButton = inputs.First(i => i.type == "submit");

submitButton.click();

这将显示有关用户选择和提交表单的警报。

【讨论】:

  • 提交按钮是一个图像,它调用 JS 来提交表单,这就是我做 form.submit 的原因。
  • 您可以在表单中找到一张图片(就像我使用提交按钮所做的那样),然后单击它。如果您提到的脚本不仅仅是提交表单,它将为您提供帮助。
  • 奥列格你的回答也是正确的,但是因为我先尝试了约翰的样本,所以我把赏金给了他。
【解决方案3】:

通过注入 JavaScript 来提交表单,我有一个更脏的单行代码

_webBrowser.InvokeScript("eval", new object[] { "document.getElementById('formName').submit()" });

当我使用大量 JavaScript 和表单之外的按钮与网站交互时,这一直对我有用。

【讨论】:

  • 确实是一条脏话,但这是此页面上唯一对我有用的答案。
猜你喜欢
  • 2011-01-18
  • 1970-01-01
  • 2013-10-03
  • 2011-12-18
  • 2010-10-18
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多