VisualBasic2005で勉強中です。WebBrowser1.Document.GetelementsByTagName("a").Item(0).InvokeMember("click") でページを移動したとします。この場合、WebBrowser1に移動後のページ内容が表示されているにもかかわらず、データ自体はWebBrowser1のDocumentTextプロパティに格納されていないようなのですが、どこに格納されているのでしょうか? よろしくお願い申し上げます。

回答の条件
  • 1人2回まで
  • 登録:2006/05/25 18:11:01
  • 終了:2006/06/01 18:15:02

回答(2件)

id:KirakiraHikaru No.1

KirakiraHikaru回答回数354ベストアンサー獲得回数682006/05/25 20:58:25

ポイント60pt

的外れな回答だったらもうしわけございません。


DocumentTextはいつ参照していますか?

InvokeMember("click")

の直後でしょうか?


WebBrowserコントロールは非同期でページを読み込むので、

clickを実行させた直後だと、ページの読み込みが完了していない状態だと思います。


ですので、

clickを呼び出す前の状態(Complete)から、

いったん他の状態に変化してから、読み込みが完了した状態(Complete)になった後に、DocumentTextを参照してみると、遷移後のページが設定されていると思います。

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.we...


まずは、簡単に確認してみるために、

System.Threading.Thread.Sleep(5000)

のようにして5秒くらい待機させてからDocumentTextを参照してみてください。

id:crashtruck

ご解答ありがとうございます。しかし、DodumentCompletedイベント後にで取得しても、だめでした。そういうタイミング的な問題ではなくて、InvokeMemberが本質的にNavigateと全く違う動作をしているように思っているのですが。

2006/05/25 23:48:32
id:KirakiraHikaru No.2

KirakiraHikaru回答回数354ベストアンサー獲得回数682006/05/26 07:53:19

ポイント10pt

私の環境(VisualBasic2005 Pro)で確認したところ、

WebBrowser.Documentから取得したHtmlElementのInvokeMemberメソッドで、

タグAのClickを実行させると、読み込み完了後のDocumentTextは読み込んだページの内容に変化していました。

同様に、FormタグのSubmitをInvokeMemberにより実行しても、遷移先のページの内容に変化していました。

(Document・DocumentTitle等も変化していました)


WebBrowserコントロールを設置したFormのWebBrowser1.DocumentCompletedのイベントハンドラ内であれば確実に変わっていると思います。(フレームが複数存在するページの場合はそのページ数分呼ばれます)


また、InvokeMemberメソッドを実行したメソッド内で、DocumentTextが変化するまで待機しても同様です。(ReadyStateで見たほうがよい)


たとえば、

Sub DocTextTest()

Dim prevDocText As string = WebBrowser1.DocumentText

WebBrowser1.Document.Links(0).InvokeMember("Click")

Dim start As Date = Now

Do

'DoEventsを使用しないと、WebBrowser1の処理が滞る

System.Windows.Forms.Application.DoEvents()

'最大待機秒数(無限ループしないように念のため)

If DateDiff(DateInterval.Second, start, Now) > 10 Then

Exit Do

End If

'DocumentTextが変化するまで待機

If prevDocText <> WebBrowser1.DocumentText Then

Exit Do

End If

Loop

End Sub


InvokeMemberでなくNavigateの後でも同様の方法で待機できます。

ちなみにInvokeMemberはリフレクションという機能で、動的に型のメンバにアクセスできるものです。(これを利用するとPrivateなものにもアクセスできてしまいますが・・・)

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません