WebBrowserで、JavaScriptを含んだ読み込み完了を待機する

2020-03-25

WebBrowserがサイトの読み込みを完了すると、DocumentCompletedイベントが発生するが、
これはサイトのデータを読み込み完了したタイミングである。

読み込み完了後に実行されるJavaScript等で、サイトが変化した後の内容を取得したい場合は
下記のように、内容を比較し、変化が無くなるまで待機する必要がある。
(常時どこかしらが更新されるようなサイトの場合、無限ループに陥るので注意。)

private async void ClsWebBrowserCustom_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    await Task.Run(() =>
    {
        int intSleepTime = 250;

        Application.DoEvents();

        // WebBrowserの読み込み完了まで待機
        do
        {
            if ((this.IsBusy == false) && (this.ReadyState == WebBrowserReadyState.Complete) && (this.Document.Body.InnerHtml != null))
            {
                break;
            }
            else
            {
                Thread.Sleep(intSleepTime);
                Application.DoEvents();
            }
        } while (true);

        Application.DoEvents();

        // 内容を比較し、変化がある場合は待機
        string strBeforeHTML = this.Document.Body.OuterHtml;

        do
        {
            if (strBeforeHTML == this.Document.Body.OuterHtml)
            {
                break;
            }
            else
            {
                strBeforeHTML = this.Document.Body.OuterHtml;

                Thread.Sleep(intSleepTime);
                Application.DoEvents();
            }
        } while (true);

    });

    // ドキュメント読み込み完了時イベント
    if (DocumentReady != null)
        DocumentReady(sender, e);
}