1

私は趣味のプログラマーで、次のことをしたいと考えています。

  1. ユーザー名 - / パスワードでサイトにログインします
  2. 特定の (サブ) サイトに移動する画像をクリックします
  3. フォームに記入する
  4. フォームを送信する前に、ページ全体を読み込み、アプリケーションによって提供された入力内容を確認してから送信したいと考えています。

過去数か月間 (すべて Java で) いくつかの Web スクレイパー/パーサーを作成しましたが、現在、C# と .NET でかなりの問題に直面しています。

私は Visual Studio 2015 IDE を使用していますが、可能であれば、サードパーティのツールやプラグインなどを使用したくありません (可能であれば、HtmlAgilityPack、JSoup .. 同等のものなどを示唆する回答を提供しないようにしてください)。ただし、Core から .NET (または一般的には C# のみ) などはすべて優れています。

(1)と(2)はすでに機能しています。ユーザー名とパスワードを入力してログインしclick()、画像にログインして、以下の同じコードを使用してフォームにリダイレクトできます。

私は現時点で次のコードを持っています: (CAVE: これは WPF プロジェクトです ( 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) をクリック --> Image の "Click()" をクリックすると、フォームにリダイレクトされます。

  4. Button3 (Browser_FillForm) をクリック --> RunTimeException:

追加情報:「System.__ComObject」には、「textContent」の定義、または「値」の定義、または「innerText」の定義、または「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 ビットをチェックしたくもないし、すべてのシステムで実行したい。

誰かがこれに対する単純な標準の.Net / C#ソリューションを提供してくれますか? 私は愛好家であり、プロの開発者ではないことを覚えておいてください(おそらく、非常に詳細な例を理解できない場合があります(間違いなく難しいことを学ぶでしょう))。

TL;DR:

.NET / C# を使用して WPF WebBrowser コントロールでキーアップ時にコンテンツをチェックするフォームに入力する方法!

4

1 に答える 1

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 のものを切り取ることができます。

JavaScript と同じように、多くのメソッドを持つ COM オブジェクトを取得します。したがって、テキストを設定するには、次のようにすることができます。

document.getElementById("bob").value = "fred";
于 2016-02-02T19:27:30.090 に答える