System.Windows.Forms.WebBrowserコントロールの読み込みが完了したことを検出するにはどうすればよいですか?
NavigateイベントとDocumentCompletedイベントを使用しようとしましたが、ドキュメントの読み込み中に両方のイベントが数回発生しました!
DocumentCompleted
イベントは、同様にロードされるすべての子ドキュメント(たとえば、JSやCSSなど)に対して発生すると思います。 WebBrowserDocumentCompletedEventArgs
のDocumentCompleted
を見て、Urlプロパティを確認し、メインページのUrlと比較できます。
私は次のことをしました:
void BrowserDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
//The page is finished loading
}
最後に読み込まれたページは、ナビゲート先のページになる傾向があるため、これは機能するはずです。
here から。
以下が動作するはずです。
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
}
DocumentCompletedのURLは、サーバー転送またはURLの正規化により、URLのナビゲートとは異なる場合があることに注意してください(たとえば、www.Microsoft.comに移動して、documentcompleteで http://www.Microsoft.com を取得しました)
フレームのないページでは、このイベントは読み込みが完了した後に1回発生します。複数のフレームを持つページでは、このイベントはナビゲーションフレームごとに発生します(フレーム内のナビゲーションはサポートされています。たとえば、フレーム内のリンクをクリックすると、フレームが別のページに移動します)。最上位のブラウザである場合とそうでない場合がある最高レベルのナビゲーションフレームが、最終的なDocumentCompleteイベントを発生させます。
ネイティブコードでは、 DocumentCompleteイベントの送信者を比較して、イベントがナビゲーションの最後のイベントであるかどうかを判断します です。ただし、Windowsフォームでは、senderパラメーターはWebBrowserDocumentCompletedEventArgsによってラップされません。 ネイティブイベントをシンク を使用してパラメーターの値を取得するか、DocumentCompletedイベントハンドラーで ブラウザーの準備状態プロパティ または フレームドキュメント を確認できます。すべてのフレームが準備完了状態にあるかどうかを確認します。
ダウンロードマネージャー が存在し、ダウンロード可能なファイルへのナビゲーションがある場合、readystateメソッドには問題があります。ダウンロードマネージャーによってナビゲーションがキャンセルされ、readystateが完了しません。
複数のDocumentCompleted
イベントを起動するという同じ問題があり、上記のすべての提案を試しました。最後に、私の場合、IsBusy
プロパティは正しく機能せず、Url
プロパティも機能しませんが、ReadyState
はステータスが「Interactive」であるため、必要なものであるようです。複数のフレームをロードすると、最後のフレームをロードした後にのみ、ステータスが「完了」になります。したがって、ページにそのすべてのコンポーネントが完全にロードされたときがわかります。
これが他の人にも役立つことを願っています:)
WPFを使用している場合、LoadCompleted
イベントがあります。
もし Windows.Forms
、DocumentCompleted
イベントは正しいものでなければなりません。ロードするページにフレームがある場合、WebBrowser
コントロールは各フレームに対してDocumentCompleted
イベントを発生させます(詳細については here を参照してください)。イベントが発生するたびにIsBusy
プロパティをチェックすることをお勧めします。それがfalseの場合は、ページの読み込みが完全に完了しています。
外部のJavascriptまたはCSSファイルに対してDocumentCompleted/Navigatedイベントをトリガーするようには見えませんが、iframeに対してはトリガーします。 PKが言うように、WebBrowserDocumentCompletedEventArgs.Urlプロパティを比較します(まだコメントを書くためのカルマを持っていません)。
複数のネストされたフレームがあるページで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ボタンがクリックされたときにページの完了を制御する方法がわかりません。
イベントProgressChangedを使用できます。最後に発生したときは、ドキュメントが完全にレンダリングされたことを示します。
this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);