6

Windows フォーム アプリケーション – 入力要素の操作WinForm WebBrowser

私はウェブサイトへのログインに慣れていHttpWebResponseますHttpWebRequestが、mshtml ライブラリを使用して試してみたところ、奇妙な動作が見つかりました。他の誰かが私を助けてくれるかどうかを確認したいと思います..

Usernameフィールド、フィールドPassword、およびButton.

ロジックは非常に基本的なもので、Web ブラウザーが組み込まれた winform アプリを作成しました。イベントではDocument_Completed、次のコードを使用して設定を入力し、ボタンをクリックします。

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (webBrowser.Url.ToString() == @"MyWebPage/signin")            
    {
        HTMLDocument hdc = new HTMLDocumentClass();
        hdc = (HTMLDocument)webBrowser.Document.DomDocument;

        IHTMLElement elb = hdc.getElementById("login_button");
        IHTMLInputElement elu = (IHTMLInputElement)hdc.getElementById("username");
        IHTMLInputElement elp = (IHTMLInputElement)hdc.getElementById("password");

        try
        {
            elu.value = "MyID";
            elp.value = "MyPwd";
            elb.click();
        }
        catch { }
    }
}

このコードが非常に高速でエラー処理がないことを除けば、部分的にうまくいくはずです..

次の 2 つのシナリオがあります。

  • ツールを起動すると、Web ページが読み込まれます。

    • ツールは UserID フィールドと Password フィールドを正しく入力します。
    • ツールがボタンをクリックできない
  • ボタンを手動でクリックし、ログインしました。ログアウトをクリックし、ログイン ページに戻りました。

    • すぐに再度ログインすると、ツールが情報を入力します
    • ツールもすぐにボタンをクリックします。

なぜこれが起こるのか、現在のセットアップでこれを回避する方法を説明できる人はいますか (したがって、を使用しませんHttpWebRequest)。起動時にページをロードするか、ログアウト後にリダイレクトされるかの違いはわかりませんが、どうやらそこに違いがあるか、何か間違ったことをしています。

この件に関するご意見をお待ちしております。

ありがとう、ケビン

編集:

ButtonWeb ページのボタンをクリックするために、以下と同じバックエンド コードを使用する Windows フォームにを追加しました。これは完全に機能します。

イベントでこのボタンのクリックをトリガーしましたwebBrowser_Completedが、機能しません。何らかの理由で、イベントに追加したものすべてで、コントロールwebBrowser_DocumentCompleted内のボタンのクリック イベントをトリガーできません。WebBrowserそのイベント全体が完了したら、それをトリガーしようとすると動作しますが、これを自動化したい..何かアドバイスはありますか?

4

2 に答える 2

3

これはロング ショットであり、最も洗練された回避策ではないかもしれませんが、 DocumentCompletedイベントでバックグラウンド ワーカーを 1 秒間実行し、別のスレッドからクリックしたボタンをトリガーするのはどうでしょうか。これは、これを自動化するだけかもしれません。これは別のスレッドから実行されるため、特定のコントロールを呼び出さなければならない場合があるため、この回避策の別の欠点になる可能性があることに注意してください.

これがうまくいかない場合は、Regfor が以前に提案したように、Watin.org があなたを助けることができます。

于 2012-05-21T13:43:04.077 に答える
3

これはどう :

HtmlElement button = webBrowser.HtmlDocument.GetElementById("login_button");
button.InvokeMember("click");

それは私のプログラムで動作します。

于 2012-05-11T09:49:59.620 に答える