3

WebBrowser DocumentCompleted イベントに関する他の質問を検索しましたが、私が抱えている正確な問題を抱えている人は誰もいないようです。

航空会社のウェブサイトでフライト検索を自動化しようとしています。私が使用する最初の URL は、日付の部分を除いて毎回同じなので、文字列を組み合わせて WebBrowser を簡単に URL に移動させることができます。ただし、そのページは、価格が表示される前にクリックする必要がある「続行」ボタンがある免責事項ページです。フォームで一連のボタンを使用する場合、button1 をクリックして最初の URL にアクセスし、button2 をクリックして続行ボタンをクリックします。それは正常に動作します。

しかし、button2 をクリックする必要をなくしたかったので、WebBrowser DocumentCompleted イベントを使用しようとしました。私が抱えている問題は、最初のページが Web ブラウザーに完全にロードされないように見えるため、ボタンがクリックされないことです。

これは、2 つのボタンと DocumentCompleted イベントに使用しているコードです。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    TextBox1.Text = fullURL
    WebBrowser1.Navigate(fullURL)

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    Dim allElements As HtmlElementCollection = WebBrowser1.Document.All

    For Each webpageelement As HtmlElement In allElements

        If webpageelement.GetAttribute("src") = proceedbuttonattribute Then

            webpageelement.InvokeMember("click")

        End If

    Next

    End Sub

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

    If TextBox1.Text.StartsWith(firstURL) = True Then 'make sure that button is only clicked after first webpage loads

        Dim allElements As HtmlElementCollection = WebBrowser1.Document.All

        'Click 'Proceed to Booking' button
        For Each webpageelement As HtmlElement In allElements

            If webpageelement.GetAttribute("src") = proceedbuttonattribute Then

                webpageelement.InvokeMember("click")

            End If

        Next

    End If

    End Sub

ありがとう!

4

2 に答える 2

3
WebBrowser1.Navigate(fullURL)
    Do While wb.ReadyState <> WebBrowserReadyState.Complete
        Application.DoEvents()

    Loop

;)

于 2012-09-25T14:14:34.403 に答える
1

DocumentCompletedがトリガーされないというのは、まったくトリガーされないということですか、それともIfステートメントがTrueを返さないため、コンテンツ(およびクリックアクション)が実行されないということですか?

また、このページにフレームやiframeはありますか?なぜなら、存在する場合、DocumentCompletedは、すべてのフレームがロードされて完了するまで実行されないためです。また、そのajaxedフレームの場合、mroeの問題が発生します。必要なのは、フレームの1つが正しくロードされないか、完全に適切にロードされる(.readystate = 4の場合)のではなく、「インタラクティブ」モード(.readystate = 3の場合)のままになることだけです。これにより、DocumentCompletedイベントが発生しなくなります。トリガーされます。

また、DCイベントがトリガーされるのをどのくらい待っていますか?

これを回避するためのより良い方法があります。あなたがする必要があるのは、DCイベントとまったく同じコードでDo / Whileループを実行することだけです。それは、そこに座って(.Navigate2が呼び出された後)、そのボタンはDOMに表示され、以下がTrueを返すとすぐに、.InvokeMemberを使用してボタンをクリックできます。

If webpageelement.GetAttribute("src") = proceedbuttonattribute Then

したがって、この場合、「WaitUntilButtonFound」という名前の別の関数を作成し、各ループの間に100ミリ秒のスリープ(待機)を配置し、Sleepメソッド(これも見つかります)の直後または直前に.DoEvents(.Threading名前空間にあります)を配置します。 .Threadingで)。

このように、関連性のあるボタンがドキュメントオブジェクトモデルに表示されたらすぐにクリックできます。必要に応じて、見つかったらすぐにさらに2〜3秒待つことができます(必要に応じて、実際には必要ありません)。そしてそれをクリックします。DOMでそのボタンを見つけることは、ページが読み込まれたか、部分的に読み込まれた(関連する部分または必要な部分の読み込みが完了した)ことを示しているため、そのボタンに対して実行したいアクションを再開できます(つまり、クリックする)、表示された直後。実際、それは前進するための最も速い方法でもあります。

どう思いますか?どうすればよいか、さらにヘルプやガイダンスが必要な場合はお知らせください。また、DCイベントが完全にトリガーされていないのか、またはDCがDCイベント内でコードを実行するのをブロックしているのがIFステートメントだけであるのかをお知らせいただければ、DCイベントがトリガーされている場合に役立ちます。トリガーされますが、内部のIfステートメントが原因で内部のコードが実行されていません。これは、まったくトリガーされていない場合でも、DCとはまったく異なるものです。

教えてください、ありがとう。

于 2012-09-13T14:18:22.487 に答える