現在WebBrowserを用いたツールを作成中の者です。
WebBrowserを用いてWeb画面を読み込んで処理を実施しているのですが、表題の通りwebbrowser1.ReadyStateが完了になったタイミングはサイトのjsの処理が完了しておらず、一部の処理を実行することができません。
(webbrowser1.Document.GetElementById("hoge").All.Countの値が0になったりなど)
たどり着いた先が「非同期処理にてWebBrowserの処理を続行させ、画面の更新があったタイミングで処理を実施する」です。
しかし、非同期処理中にキャストの例外が発生し、実現することができていません。
以下にソースコードを示しますので、どなたかこの問題の解決方法をご教授いただければ幸いです。
※目的はjsとページが全て読み込まれて処理をすることなので、以下のソースコードを改善する他の手段でも構いません。
お手数ですがよろしくお願い致します。
await Task.Run(() => { int iSleepTime = 200; while (webbrowser1.Document.GetElementById("hoge").All.Count==0) { Thread.Sleep(iSleepTime ); System.Windows.Forms.Application.DoEvents(); } });
>while (webbrowser1.Document.GetElementById("hoge").All.Count==0)
でキャストの例外が発生します。
>int iCount= webbrowser1.Document.GetElementById("hoge").All.Count;
として同様に処理を確認しましたがやはり「webbrowser1.Document.GetElementById("hoge").All.Count」この箇所でキャストエラーが発生します。
ちなみに、この例だと場合によっては無限ループする可能性もありますが、できる限り処理を簡潔に書きたかったので諸々の処理は割愛しております。
【やってみたこと】
非同期処理ではなくwebbrowser1.ReadyStateの読み込みが完了した後に、
while (webbrowser1.Document.GetElementById("hoge").All.Count==0) { Thread.Sleep(iSleepTime); System.Windows.Forms.Application.DoEvents(); }
とやってみましたが、画面に表示されているWebBrowserコントロール上、ソース上で該当する箇所は空欄(js読み込みが完了してない)のままでした。
デバッガ上で、returnをかまして一度スレッドを手放すと、すぐに画面上には該当する箇所には値が設定されていました。
補足:
webbrowser1.Document.bodyの変化をキーに非同期で確認するやり方も試しましたが、同じでした、、、
その場合は
>string strBeforeHtml=webbrowser1.Document.Body.OuterHtml;
ここでキャストのエラーが発生しました。
回答1件
あなたの回答
tips
プレビュー