web-dev-qa-db-ja.com

WebBrowserの完全なページ読み込みを検出する

System.Windows.Forms.WebBrowserコントロールの読み込みが完了したことを検出するにはどうすればよいですか?

NavigateイベントとDocumentCompletedイベントを使用しようとしましたが、ドキュメントの読み込み中に両方のイベントが数回発生しました!

56
Neir0

DocumentCompletedイベントは、同様にロードされるすべての子ドキュメント(たとえば、JSやCSSなど)に対して発生すると思います。 WebBrowserDocumentCompletedEventArgsDocumentCompletedを見て、Urlプロパティを確認し、メインページのUrlと比較できます。

34

私は次のことをしました:

void BrowserDocumentCompleted(object sender,
        WebBrowserDocumentCompletedEventArgs e)
{
  if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
    return; 

  //The page is finished loading 
}

最後に読み込まれたページは、ナビゲート先のページになる傾向があるため、これは機能するはずです。

here から。

29
Kyle Rozendo

以下が動作するはずです。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //Check if page is fully loaded or not
    if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        return;
    else
        //Action to be taken on page loading completion
}
17
ePandit

DocumentCompletedのURLは、サーバー転送またはURLの正規化により、URLのナビゲートとは異なる場合があることに注意してください(たとえば、www.Microsoft.comに移動して、documentcompleteで http://www.Microsoft.com を取得しました)

フレームのないページでは、このイベントは読み込みが完了した後に1回発生します。複数のフレームを持つページでは、このイベントはナビゲーションフレームごとに発生します(フレーム内のナビゲーションはサポートされています。たとえば、フレーム内のリンクをクリックすると、フレームが別のページに移動します)。最上位のブラウザである場合とそうでない場合がある最高レベルのナビゲーションフレームが、最終的なDocumentCompleteイベントを発生させます。

ネイティブコードでは、 DocumentCompleteイベントの送信者を比較して、イベントがナビゲーションの最後のイベントであるかどうかを判断します です。ただし、Windowsフォームでは、senderパラメーターはWebBrowserDocumentCompletedEventArgsによってラップされません。 ネイティブイベントをシンク を使用してパラメーターの値を取得するか、DocumentCompletedイベントハンドラーで ブラウザーの準備状態プロパティ または フレームドキュメント を確認できます。すべてのフレームが準備完了状態にあるかどうかを確認します。

ダウンロードマネージャー が存在し、ダウンロード可能なファイルへのナビゲーションがある場合、readystateメソッドには問題があります。ダウンロードマネージャーによってナビゲーションがキャンセルされ、readystateが完了しません。

13

複数のDocumentCompletedイベントを起動するという同じ問題があり、上記のすべての提案を試しました。最後に、私の場合、IsBusyプロパティは正しく機能せず、Urlプロパティも機能しませんが、ReadyStateはステータスが「Interactive」であるため、必要なものであるようです。複数のフレームをロードすると、最後のフレームをロードした後にのみ、ステータスが「完了」になります。したがって、ページにそのすべてのコンポーネントが完全にロードされたときがわかります。

これが他の人にも役立つことを願っています:)

4
iArv

WPFを使用している場合、LoadCompletedイベントがあります。

もし Windows.FormsDocumentCompletedイベントは正しいものでなければなりません。ロードするページにフレームがある場合、WebBrowserコントロールは各フレームに対してDocumentCompletedイベントを発生させます(詳細については here を参照してください)。イベントが発生するたびにIsBusyプロパティをチェックすることをお勧めします。それがfalseの場合は、ページの読み込みが完全に完了しています。

3
alimbada

外部のJavascriptまたはCSSファイルに対してDocumentCompleted/Navigatedイベントをトリガーするようには見えませんが、iframeに対してはトリガーします。 PKが言うように、WebBrowserDocumentCompletedEventArgs.Urlプロパティを比較します(まだコメントを書くためのカルマを持っていません)。

3
Joel Rein

複数のネストされたフレームがあるページでDocumentCompletedイベントを使用しても機能しませんでした。

Interop.SHDocVWライブラリを使用して、次のようにWebBrowserコントロールをキャストしました。

public class webControlWrapper
{
    private bool _complete;
    private WebBrowser _webBrowserControl;

    public webControlWrapper(WebBrowser webBrowserControl)
    {
        _webBrowserControl = webBrowserControl;
    }

    public void NavigateAndWaitForComplete(string url)
    {
        _complete = false;

        _webBrowserControl.Navigate(url);

        var webBrowser = (SHDocVw.WebBrowser) _webBrowserControl.ActiveXInstance;

        if (webBrowser != null)
            webBrowser.DocumentComplete += WebControl_DocumentComplete;

        //Wait until page is complete
        while (!_complete)
        {
            Application.DoEvents();
        }
    }

    private void WebControl_DocumentComplete(object pDisp, ref object URL)
    {
        // Test if it's the main frame who called the event.
        if (pDisp == _webBrowserControl.ActiveXInstance)
            _complete = true;
    }

このコードは、webBrowserControl.Navigate(url)メソッドを使用して定義済みのURLに移動するときに機能しますが、htmlElement.InvokeMember( "click")を使用してhtmlボタンがクリックされたときにページの完了を制御する方法がわかりません。

0
Frank_FC

イベントProgressChangedを使用できます。最後に発生したときは、ドキュメントが完全にレンダリングされたことを示します。

this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
0
Vincent Lidou