vb2005 webbrowserでリンクをクリックした後の表示待ちの方法

このQ&Aのポイント
  • VB2005を勉強中の方が、WebBrowserコントロールを使用してリンクをクリックした後の表示待ちの方法について質問しています。
  • WebBrowser1.Navigateメソッドを使用してページを開いた場合、表示待ち部分が機能することが確認されていますが、InvokeMemberメソッドを使用してリンクをクリックした後では表示待ちがうまく機能しないため、問題点を解決したいとのことです。
  • 質問者はWebBrowser1.Document.GetElementsByTagNameを使用して特定のリンクをクリックし、その後の表示待ちがうまく機能しない問題に直面しています。解決策を求めています。
回答を見る
  • ベストアンサー

vb2005 webbrowserでリンクをクリックした後の表示待ちの方法

VB2005を勉強中の者です。 WebBrowser1.Navigateを使ってwebページを開いた際は下記while文での表示待ちが機能するのですが、ページ表示後、さらにInvokeMemberを使って先のページにクリックで進んだ後では同一の表示待ち部分がうまく機能せずにそのまま次の処理へと進んでしまいいます。 どこに問題があるのか分からず困っております。どなたか助けていただけませんでしょうか? WebBrowser1.Navigate("https://yahoo.co.jp") '↓ここは機能します While WebBrowser1.IsBusy Or WebBrowser1.ReadyState <> WebBrowserReadyState.Complete Application.DoEvents() End While WebBrowser1.Document.GetElementsByTagName("a").Item(15).InvokeMember("click") '↓これが機能しなくて困っています! While WebBrowser1.IsBusy Or WebBrowser1.ReadyState <> WebBrowserReadyState.Complete Application.DoEvents() End While '↓目的 TextBox1.Text = WebBrowser1.Document.Body.InnerText

質問者が選んだベストアンサー

  • ベストアンサー
  • hitodesu
  • ベストアンサー率77% (7/9)
回答No.2

同様の問題で私も今先ほどまでうなっていました。 Webbrowser1.Navigaterの後、即座にWebbrowser1.Document.ReadyStateが非completeになるわけではないようです。 つまり、あなたのソースコードの3行目のWhileは、あなたが期待しているNavigateの結果によるcompleteではなく、Navigate以前の表示状態のcompleteだという事です。 詳しい事を確かめたわけではありませんが、WebBrowserコントロールは非同期ですので、Navigate後即座に反応するのではなく、WebBrowserコントロールのプロセス?が実際に実行されるまでにタイムラグがあるらしいのです。 多分そうだと思います。 1、completeである限りループ(タイムアウトは次へ、タイムアウト時間は任意) 2、非completeである限りループ とすれば良いと思います。 タイムアウトが必要なのは、Navigateがあなたの思う度折の即座の反応をし、さらに表示も俊足で終わるという状況(ありえないでしょうが、そうなった 場合ループから脱出しないので)のため必要かと思います。 いかがでしょうか。 内容に自信はありませんが、私の場合それでさっき動きましたから。

takabee
質問者

お礼

ご返答ありがとうございます。 下記の方法のご提案ありがとうございます。 1、completeである限りループ(タイムアウトは次へ、タイムアウト時間は任意) 2、非completeである限りループ 実は数ヶ月前に私もなにか強引な方法でもいいから手はないかなぁとおもって、下記の方法で一時しのぎをしておりました。 1、クリック前のWEBテキストをtextboxに表示 2、InvokeMember("click") 3、WEBテキストをtextboxに再表示 4、textboxの内容が切り替わりきるまでループ 上記の方法はtextboxでの切り替わりの最中の内容がまっさらになった状態で一旦NULLエラー?見たいなのが出るのでtry catchもはさむ必要があったりとちょっと面倒だったのでご提案いただいた方法も試みてみます。 ありがとうございました!

その他の回答 (1)

  • mo_gu
  • ベストアンサー率51% (56/109)
回答No.1

WebBrowser1_DocumentCompletedで TextBox1.Text = WebBrowser1.Document.Body.InnerText これをやるのはだめなんでしょうか?

takabee
質問者

お礼

お詫び Navigate("https://yahoo.co.jp") ↓ Navigate("http://yahoo.co.jp") に訂正します。 ご回答ありがとうございます。 説明不足で申し訳ありません。若干処理方法の違う似たようなプロシージャが複数あり、それぞれページ表示後に個別の処理対応をさせたいので、1つのプロシージャ内で解決させる方法を考えている次第です。 お力添えお待ちしてます!

関連するQ&A

  • WebBrowserでHTML要素のclick処理

    WebBrowserで画面の自動遷移制御をしたいですが、うまくいかないです。 なぜかHTML要素のbuttonにInvokeMember("click")を呼び出す後の画面更新待ちができないようです。 ソースコードをご覧ください。 WebBrowser wb = new WebBrowser(); wb.Navigate("http://www.google.co.jp"); Application.DoEvents(); while (wb.ReadyState != WebBrowserReadyState.Complete || wb.IsBusy) { Console.WriteLine("waiting..."); System.Threading.Thread.Sleep(10); Application.DoEvents(); } Console.WriteLine(wb.DocumentTitle);   <----ここでGoogleが出力される //キーワードより検索する HtmlElement input = wb.Document.All.GetElementsByName("q")[0]; HtmlElement button = wb.Document.All.GetElementsByName("btnG")[0]; input.InnerText = "test"; button.InvokeMember("click"); Application.DoEvents(); while (wb.ReadyState != WebBrowserReadyState.Complete || wb.IsBusy) { Console.WriteLine("waiting..."); System.Threading.Thread.Sleep(10); Application.DoEvents(); } Console.WriteLine(wb.DocumentTitle); <----ここでもGoogleが出力される 2回目のタイトルは「test - Google 検索」がでるはずですが、 なぜか前のページのままです。 Documentの中身も前のページのままです。 解決方法お願いします。

  • WebBrowserにてsubmitの前にnavigateしてしまう

    いつもお世話になっております。 VB2005ユーザーです。 WebBrowser内の"submit"を押したあと、違うページに行きたいのですが、 "submit"を押す前に"Navigate"で指定しているページに行ってしまいます。 このようなコードを書いています。 With WebBrowser1 .Navigate("最初のURL") Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop .Document.Forms(0).InvokeMember("submit") Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop .Navigate("次の指定URL") Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop 「指定URL」は"submit"により新しいHTMLが生まれるので、その後の作業のためにどうしても"submit"を押したいのですが、上のようなコードですと先に「指定URL」に行ってしまいます。 "submit"をクリックせず、無視してしまうのです。 Navigate("次の指定URL")を外せばクリックしてくれるのですが・・・。 WebBrowserを完全に待機させる方法などが必要なのでしょうか? 宜しくご教授のほどお願い致します。

  • vb2005のWebbrowserコントロールでSubmitすると動作

    vb2005のWebbrowserコントロールでSubmitすると動作がおかしいのですが Browser.Navigate("http://hyperlink.xrea.jp/regist.php") Do While Not Browser.ReadyState = WebBrowserReadyState.Complete Application.DoEvents() Loop Browser.Document.All.GetElementsByName("site_name")(0).InnerText = "test"           ・           ・ Browser.Document.Forms(0).InvokeMember("submit") このようなソースなのですが、submit後のページが <div id="copyright"> Copyright By ***</div></body></html> のように、最後の方しか返してこないのです。 手動でsubmitボタンをクリックすると大丈夫なのですが、なぜだかわかるでしょうか?

  • vb2005にてhtmlソースの中のある値を取得したい。

    WebBrowser1.Navigate("http://www.yahoo.co.jp/") Do While (WebBrowser1.IsBusy Or WebBrowser1.ReadyState <> WebBrowserReadyState.Complete) My.Application.DoEvents() System.Threading.Thread.Sleep(50) Loop にてホームページを表示させたとき タグの中の値を取得したいんですが、 xmlみたいにピンポイントで取得するにはどのようにすればよろしいでしょうか?教えてください。

  • WebBrowserについて

    Visual Studio 2008を使っています 途中で処理が停止しまい困っています デバックで一時停止をすると Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop この部分で作業が止まっています 何かいい方法はないでしょうか? ソースは下記の通りです WebBrowser1.Navigate(New Uri("http://※※※※※※※※※※※※)) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop ______________________________ Threading.Thread.Sleep(1000)とか入れても止まってしまいます 秒数はいろいろ試しましたが駄目でした WebBrowser1.Navigate(New Uri("※※※※※※※※※※※※)) Threading.Thread.Sleep(1000) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop

  • webbrowserの読込完了が反応しない

    何度も質問してすみません。 どうしても自力では解決できないことがありましたので質問させていただきます。 webbrowserでの読み込み後の処理についてなのですが、現在表示されているページ内のリンクを自動でクリックし、次のページにあるテキストボックス内にテキストを打ち込みたいのです。 While WebBrowser1.IsBusy Or WebBrowser1.ReadyState <> WebBrowserReadyState.Complete  Application.DoEvents() End While を置いているのですが、どうやらこれが機能せずにテキストボックスへの書き込みがうまくいきません。 試しに、上記の記載の後ろに msgbox("待ってみる") と記載してみると、前ページのリンクをクリックした瞬間、メッセージボックスが表示されます。 メッセージボックスのOKボタンをしばらく待って手動でOKをクリックするとテキストボックスへのテキストの書き込みも正常に行われます。 ほかには Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop や System.Threading.Thread.Sleep(1000) も試してみたのですが、sleepに関してはwebbrowserの読込自体が止まってしまいます。 何か良い方法はないのでしょうか? よろしくお願いいたします。

  • Webbrowserで完全にHPを表示させるまで待機したい。

    VB6.0を使っています。 Webbrowserを使いまして HPの表示を完了するまで待機するようにしようと思いました。 しかし表示前に”読み取り終了”になってしまいます。 表示するまで待機させるにはどうすればいいのでしょうか? どうかお願いいたします。 Label1.Caption = "読み取り中" WebBrowser1.Navigate "http://www.yahoo.co.jp" Do While WebBrowser1.Busy = True DoEvents Loop Do While WebBrowser1.Document.ReadyState <> "complete" DoEvents Loop Label1.Caption = "読み取り終了" あと、基本的な操作なのですが プロジェクトを読み込んだすぐにはコードもオブジェクトも表示されません。 一度実行してからコードを出さざるを得ないのですが これはどうすればいいのでしょうか?

  • VB2005、WebBrowserにてログインが成功したか失敗したかを判断

    お世話になっております。 VB2005ユーザーです。 WebBrowserを使用し、windowsフォームに入力した内容を元にログインし、ログインが成功したか失敗したかを判断したいのです。 With WebBrowser1 .Navigate("ログインしたいURL") Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete '読み込み終わるまで待つ System.Windows.Forms.Application.DoEvents() Loop .Document.All.GetElementsByName("ID")(0).InnerText = ID.Text .Document.All.GetElementsByName("パスワード")(0).InnerText = パスワード.Text .Document.Forms(0).InvokeMember("submit") という物を使い、その後にログイン成功か失敗かを判断するために、 If .Document.Body.Innertext = "ログイン失敗" Then MsgBox("だめ") Exit Sub Else MsgBox("OK") Exit Sub End If というコードを使ってみたのですが、Innertextの情報を読み取っていないのか、Else MsgBox("OK")に飛んでしまいます。 Navigateにて進んだ先のHTML情報(Innertext)と、コチラが指定したい情報が一致しているかの判断はどのようなコードを記述すればいいのでしょうか?

  • WebBrowserの読み込み待ちの処理の仕方

    VB2005にてプログラムしております。 WebBrowser内にて表示したページでID、PASSを自動入力、ログインするというプログラムですが、 -------------------------------------------------------------     Dim IDCODE As String = TextBox1.Text Dim PASSCODE As String = TextBox2.Text '文字列で指定したURLに飛ぶ WebBrowser1.Navigate("https://XXXXXXXXX.ne.jp/") '表示終了まで待つ ??????    ‘WebBrowser1へID、PASS入力処理 ------------------------------------------------------------- 上記の ?????? 部分に表示待ちの処理をするコードを入れると思うのですが、 With WebBrowser1 Do While .IsBusy = True Loop Do While .ReadyState <> "complete" Loop End With を入力すると読み込み途中で止まってしまうみたいです。 なにかいい方法がありますか?

  • (VB)WebBrowserの値が更新されない

    VisualStudio2008の環境でFormにWebBrowserを配置し そこから以下の処理でHtml内の値を取得するプログラムを作成しています。 For Each he_TR As HtmlElement In he_TableChild.GetElementsByTagName("TD") If he_TR.Id = "AAAAA" Then TXT= he_TR.InnerText.ToString .TextBox1.Text = TXT End If Next これを1s間隔のタイマーで動かすと一定時間経過で(5分くらい?)値が取得できなくなります。 アタッチするとTimer処理は行われTextBoxに値を入れる箇所も通っています。 Html内のデータが更新されていない様に思えるのですが何か解決策があればご教示下さい。 下記が起動時のメソッドとなります。 Private Sub View() Me.WebBrowser1.Navigate("") '文字列で指定したURLに飛ぶ Me.WebBrowser1.Navigate("http://www.xxxxxxxxxxxxxxxx/") '完全に表示しきるまでWait Do Application.DoEvents() Loop Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete And WebBrowser1.IsBusy = False 'Dim lngCno As Long, lngTno As Long Timer1.Interval = 1000 Timer1.Start() End Sub

専門家に質問してみよう