2017-11-04 3 views
0

WebフォームにWebブラウザーコントロールがあり、これをWebサイトに移動します。 WebBrowser1.DocumentCompletedイベントは5回発生しますが、その後に実行されるスクリプトはまだあります。私はページが完全に読み込まれたと考えることができる前に特定の要素が現れるのを待たなければなりません。 HtmlElementが.NETのWebブラウザーに表示されるのを待つ方法

While WebBrowser1.Document.GetElementById("username") Is Nothing 
    Application.DoEvents() 
End While 

しかし、それはページ上のスクリプトをフリーズするようにそれは(ページも私を伝えることがオフラインになっている)ようだ:私はこれを試してみました。あなたが助けたいのであれば、VBまたはC#で私にあなたの答えを教えてください。

EDIT:私は今、Timerを使用して要素が現れたかどうかを100msごとにチェックする方法を使用しています。

+1

このコードを実行しているのは、ページの読み込み中ですか? –

+0

@YogeshHShenoy私はカウンタを持っており、WebBrowser1.DocumentCompletedでこのコードを実行します。これは5回目の起動時に発生します。 – paulolol

答えて

2

Application.DoEvents()を使用しています(ほとんど)すべてのソリューションは、悪いソリューションであることに注意してください。 DoEvents()は、ユーザーインターフェイスの応答性を保つために使用しないでください。あなたがそれを使用する必要があると感じたら、あなたは何か間違っている可能性が最も高いです。参照:Keeping your UI responsive and the Dangers of Application.DoEvents

代わりに、DocumentCompletedWebBrowser.ReadyState propertyを確認してください。 Webページが完全に読み込まれたかどうかを教えてくれます(これはではありません。は非同期/遅延Javascriptコードを考慮します)。

Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted 
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then 
     'Do stuff. 
    End If 
End Sub 
+0

Okだから、 'ReadyState'が' Complete'の直後に表示されるので、 'Do stuffの後にMessageBoxを置くと、「Ok」をクリックした直後に表示されます)。今のところ私はTimerメソッドを保持します。 – paulolol

+0

@paulolol:ええと、ウェブページが動的に変更できるので、その場合はより良い方法はありません。このような状況では、 'DocumentCompleted'イベントハンドラを開始し、要素が見つかるたびにそれらを停止するようなタイマーも使用します。 'Windows.Forms.Timer'は、ウィンドウメッセージに基づく低優先度タイマーであり、〜50msの最小解像度を有する。このような状況で、数秒間しか実行していない場合は、実際にはパフォーマンスに影響しません。 –

+0

お手数ですが、ありがとうございます。 – paulolol

関連する問題