如何使用C#/ IHTMLDocument2

时间:2016-02-02 19:18:03

标签: c# .net wpf com ihtmldocument2

我是一名业余爱好者,希望做到以下几点:

  1. 通过用户名 - /密码
  2. 登录网站
  3. 点击指向某个(子)网站的图片
  4. 填写表格
  5. 在提交表单之前,我想在提交表单之前加载整个页面并查看我的应用程序提供的输入内容。
  6. 我在过去几个月里写过几个Web抓取器/解析器(全部用Java),但现在我在使用C#和.NET时遇到了一些困难。

    我正在使用Visual Studio 2015 IDE,如果可能的话,我不想使用第三方工具/插件等(如果可能的话,请尽量不提供暗示HtmlAgilityPack,JSoup ..等价物或其他的答案)。 .NET的一切核心(或者通常只是C#)等都很好。

    (1)和(2)已经可以使用,我可以登录提供用户名和密码,然后在图片上click(),并使用相同的代码重定向到表单。

    我现在有以下代码:( CAVE:这是一个WPF项目( NOT WINFORMS),使用IHTMLDocument(2)

    目前我的代码如下所示:

    using System;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Navigation;
    using mshtml;
    using System.Diagnostics;
    
    public partial class MainWindow : Window
    {
        private CustomObject testObject; 
        public IHTMLDocument2 doc2;
    
    public MainWindow()
        {
            InitializeComponent();
            Browser.Navigate("https://www.xXx.xXx/"); //The Browser is the standard WPF WebBrowser 
            // Several other functions like LoadComplete etc. here
        }
    
        // Function for login
    
        private void Browser_Login(object sender, RoutedEventArgs e)
        {
            doc2.all.item("ID_OF_USERNAME_TEXTFIELD").value = "MyUsername";
            doc2.all.item("ID_OF_PASSWORD_TEXTFIELD").value = "MyPassWord";
            doc2.all.item("NAME_OF_SUBMIT_BUTTON").click();
        } 
    
        private void Browser_ClickOnImageLinkToGetToForm(object sender, RoutedEventArgs e)
        {
            // Logic to get to the Form, everything works as expected
        }
    
        private void Browser_FillForm(object sender, RoutedEventArgs e)
        {
            doc2.all.item("NAME_OF_THE_TEXTFIELD_TO_FILL").value = "Text if want to put into the field";
    
        // /repeat for all other TextFields and a couple of other input elements.
    
                      --> Exception!
        }
    

    每次运行代码时,我都会执行以下操作:

    1. 启动应用程序 - > WebBrowser打开,将我引导至主页。

    2. 点击Button1(Browser_Login) - >自动填充用户名&&密码 - >点击提交(我现在登录)

    3. 单击Button2(Browser_ClickOnImageLinkToGetToForm) - > "点击()"在图像上,重定向到表单。

    4. 点击Button3(Browser_FillForm) - > RuntimeException的:

    5. 其他信息:' System .__ ComObject'不包含' textContent'的定义或定义'值'内容文字'的定义或定义' InnerHtml'等。

      我尝试过很多不同的东西,似乎没有用。

      我要填充的TextField具有以下属性:

          <input class="TxtField1" maxlength="800" type="text" id="Title" name="Title" value="" onkeyup="checkField(this.name);"  onblur="checkField(this.name);" style="width: 550px; cursor: help; background-color: rgb(228, 234, 224);" title="Some Title">
      

      我从来没有遇到过用Java编码的问题,也有人提到我应该检查32/64位系统,有些人建议为the_COM对象和其他一些东西编写Wrapper。我不想写一个Wrapper强硬,也不想检查32- / 64-bit,我想在每个系统上运行它。

      有人会为此提供一个简单的标准.Net / C#解决方案吗?请记住,我是一个业余爱好者,我不是一个专业的开发人员(也许如果不了解一些超级深入的例子(我绝对会学到它们很难))。

      TL; DR:

      如何使用.NET / C#填写使用WPF WebBrowser控件检查keyup上内容的表单!

1 个答案:

答案 0 :(得分:4)

如果你像这样抓住DOM,你可以做很多事情:

    private dynamic GetDOM(WebBrowser wb)
    {
        dynamic document = null;
        System.Threading.Thread.Sleep(500);
        while (document == null)
        {
            Dispatcher.Invoke(() => document = wb.Document);
            System.Threading.Thread.Sleep(100);
        }
        return document;
    }

不确定为什么你在做什么不起作用,但我从一个有效的解决方案中复制了这段代码。如果您在主线程上,可以删除Dispatcher。

你得到的COM对象有很多方法,就像在JavaScript中一样。因此,要设置文本,您可以执行以下操作:

document.getElementById("bob").value = "fred";