• ベストアンサー

WebBrowserでgoogle検索するには?

WebBrowserを使ってgoogle検索をVBで作ったブラウザ上で行いたいです。 具体的には、 「ComboBoxで選択した値」と「TextBoxで書き込んだキーワード」を &検索したいのですが Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = ComboBox1.SelectedItem WebBrowser1.Document.Forms(0).InvokeMember("submit") End Sub では、&検索ができません。常にコンボボックスで選択されたものだけが 検索され、しかも無限に検索をします。 対処法を教えていただけないでしょうか?

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

  • ベストアンサー
回答No.3

ANo.1です。 DocumentCompletedは、ページが読み込まれるたびに呼ばれるルーチンですから・・・ 個人的にはフラグを設定するだけで、別の終了待ちルーチンでループで待つってのを書くと思いますので、以下みたいです。 ついでにタイムアウトの場合も考えた方がいいと思います。 追加でbutton1が必要です。 Private isComplete As Boolean = False Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted isComplete = True End Sub Private Function waitCompleted() As Boolean Do While Not isComplete = True Application.DoEvents() 'タイムアウトチェック 'タイムアウトなら、 'MsgBox("タイムアウトです") 'WebBrowser1.Stop '現在のNavigateを中止するのはこれだったっけ?(自信なし) 'isComplete = False '一応チェック以降に終わったという場合に備えて 'Return False Loop isComplete = False '次に備えて Return True End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WebBrowser1.Navigate("http://www.google.co.jp") If waitCompleted() = False Then Exit Sub End If WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem WebBrowser1.Document.Forms(0).InvokeMember("submit") waitCompleted() End Sub p.s. ちなみに、こんなページがあるので、DocumentCompletedだけでチェックするのはまずいのかもしれない http://dobon.net/vb/bbs/log3-26/15422.html http://feedyomi.blog32.fc2.com/blog-entry-73.html

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

待機する理由がページを完全に読み込んでからでないと、   GetElementsByName("q") などでフォームエレメントにアクセスできない、結果検索キーワードを セットできない...という話であれば最初から Google に検索パラメータ 付きの URL を投げれば良いのでは? DOM の解析(検索結果によって分岐させるなど)処理が続かないなら、 Http Request も少なくて済むし、効率的だと思いますが... ' // 要参照 System.Web(System.Web.dll) --> HttpUtility 使用のため ' // Google 設定 ' // IDE に貼り付けると URL 記載部の前後が多少文字化けしますので ' // 修正して下さい Private Const QRYURL As String = "http://www.google.com/search?q=" Private Const PARAMS As String = "&num=20&ie=" Private Const CHRSET As String = "UTF-8" Private Sub Form1_Load( _     ByVal sender As Object, _     ByVal e As System.EventArgs _ ) Handles Me.Load   With Me.ComboBox1     .Items.Add("DocumentComplete MSDN")     .Items.Add("WebBrowser サンプル")   End With End Sub Private Sub ComboBox1_SelectedIndexChanged( _     ByVal sender As System.Object, _     ByVal e As System.EventArgs _ ) Handles ComboBox1.SelectedIndexChanged   Dim Enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(CHRSET)   Dim Kwd As String = ComboBox1.Text   If Kwd.Length > 0 Then     ' // 検索キーワードを UrlEncode する     Kwd = System.Web.HttpUtility.UrlEncode(Kwd, Enc)     ' // Google 問い合わせ     WebBrowser1.Navigate(QRYURL + Kwd + PARAMS + CHRSET)   End If End Sub ご参考までに。  # TextBox と ComboBox のキーワード連結の件は #1 ご回答で解決  # したようですから ComboBox のみに省略させてもらいました

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

DocumentComplatedでも構わないと思いますよ ただ 検索するかどうかを判定すればいいだけです 現在の TextBoxとComboBoxの内容と WebBrowserのテキストボックスとを見比べて 違えばsumbitを実行 同じなら何もしないとしてやればいいでしょう Dim sSearch sSearch = TextBox1.Text & " " & ComboBOx1.SelectedItem if WebBrowser.Document.All.GetElementByName("q")(0).innerText <> sSearch then   WebBrowser.Document.All.GetElementByName("q")(0).innerText = sSerarch   WebBrowser.Document.Forms(0).InvokeMember( "submit") end if といった具合です

den4545
質問者

補足

教えていただいた例では&検索はできるのですが、 やはり無限に検索をし、止まってくれません。 この場合、他のソースに問題があるのでしょうかね。 C言語で言うbreakみたいのがあればなぁとは思うのですが。

回答No.1

詳しくはわからないのですが・・・ >常にコンボボックスで選択されたものだけが検索され、 WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = ComboBox1.SelectedItem では、ComboBox1.SelectedItemだけが有効になってしまうので、 WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem とかにしないといけないんじゃないかと思います。 >しかも無限に検索をします。 Private Sub WebBrowser1_DocumentCompleted に、このコードがあれば、読み込みが終了->このコード->読み込み->読み込みが終了->このコード->・・・ という状態ではないでしょうか?

den4545
質問者

補足

>WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem まさにこれです。おかげで&検索ができました!ありがとうございます。 >Private Sub WebBrowser1_DocumentCompletedに、このコードがあれば、 なるほど!だから検索しまくっていたんですね。では、 WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem をどこにおけば読み込みの無限ループは止まるのでしょうか? よろしければご意見のほどをお願いします。

関連するQ&A

  • 最後まで読み込ませて待たせるには?

    わからないので質問させてください。 初心者なのでなかなかうまくいきません。(?_?) 教えていただけないでしょうか。 よろしくお願いいたします。 OS VISTA ブラウザ IE7 Microsoft Visual Basic 2005 WindowsFormのWebBrowserを使って表示させています。 やりたいこと WebBrowser1.Navigate(ComboBox1.Text)が読み込むまで待たせたい。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click WebBrowser1.Navigate(ComboBox1.Text) WebBrowser1.Document.All.GetElementsByName("タイトル")(0).InnerText = TextBox2.Text WebBrowser1.Document.All.GetElementsByName("内容")(0).InnerText = RichTextBox1.Text End Sub

  • VB2005のWebbrowserでSubmit

    VB初心者です。 Webbrowserで、Submitを押して自動ログインしたいと思います。 ネットで色々調べてみると、 WebBrowser1.Document.All.GetElementsByName(TextBox2.Text)(0).InnerText = TextBox4.Text WebBrowser1.Document.All.GetElementsByName(TextBox3.Text)(0).InnerText = TextBox5.Text WebBrowser1.Document.Forms(0).InvokeMember("submit") で、実行可能というのがありました。 IDとパスワードの入力はできたのですが。(フォーム上で、TextBoxで入力しての話)Submitが実行されません。 ローカルウィンドーで見ても、よく判らないのですが、何をどのように調べれば、実行可能であるか?どうか?判るのでしょうか? どなたか?詳しい方宜しくお願いします。

  • webbrowserについてボタンが見つからない

    現在 https://secure.avaonline.jp/member/ の自動ログインツールを作っているのですが、 WebBrowser1.Document.All.GetElementsByName("accountid")(0).InnerText = TextBox1.Text WebBrowser1.Document.All.GetElementsByName("passwd")(0).InnerText = TextBox2.Text によって、IDとPWの入力はできたのですが、ログインボタンと、ゲームスタートの ボタンどうしても見つかりません。 WebBrowser1.Document.All.GetElementsByName("ボタン名")(0).InvokeMember("submit") となど試してはみたのですが、 0' の値は 'index' に対して有効ではありません。'index' は 0 と -1 の間でなければなりません。 パラメータ名: index とエラーが出てしまいます。 上記のサイトはjavascriptなど使っていて見つけられなかったので、 具体的なボタンの名前やどのように記述していいの教えてください。 よろしくお願いします

  • 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)と、コチラが指定したい情報が一致しているかの判断はどのようなコードを記述すればいいのでしょうか?

  • VB2005でWebBrowserでログイン

    今まで、ExcelのVBAを手探り状態で使い、IEを操作していたものです宜しくお願い致します。今回、VB2005EEをインストールしたので、Excelで行っていた作業を移行させようと思ってネットでサンプルを手にいれ使おうかと考え行き詰りました。どなたか教えてください。 formにWebBrowserコントロールを貼り付けてネットのログイン画面を With WebBrowser1 .Navigate("http://xxxx.xxx.co.jp/xxx/mail?roginname=abcd123") .Document.All.GetElementsByName("acctname")(0).InnerText = "abcd123" .Document.All.GetElementsByName("passwd")(0).InnerText = "1234567" .Document.Forms(0).InvokeMember("submit") End With としたところ、.Documentの行で、オブジェクト参照がオブジェクト インスタンスに設定されていません。のエラーが出てしまいます。 ヒントには、オブジェクトインスタンスの作成には、newキーワードを使用します。と、メソッドを呼び出す前に、オブジェクトがnullでよいかどうか確認してくださいとあます。 私は、いったいどうすればいいのでしょうか?基本的な部分が分かっていないだけだと思いますが、教えて頂けないでしょうか?

  • 正しいWebBrowserの使い方(ループ判定)

    VB2008を使っています。WebBrowserのコンポーネントを使って ホームページにGET形式でパラメータを渡して画面のBODY部分を読み取る ものを作っているのですが、サーバーのレスポンスにもよりますが 1分間に20回で5分(100回程度)連続アクセスをするのですが、 以下のルーチンの場合何か不安を感じまして、 ネットでこれを使えばOKというものが無くて 確実に読み取る方法が知りたくて質問いたしました。 やはり、2つ目のイベントを用いる方が安心でしょうか? 正しいWebBrowserの使い方(ループ判定)をご存知の方教えてください。 '***** WebBrowser1.ReadyState ***** WebBrowser1.Navigate(URL) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete Or WebBrowser1.IsBusy = True Application.DoEvents() Loop data = WebBrowser1.DocumentText '***** DocumentCompletedイベントまでループ ***** public wait_flag as Boolean wait_flag = True WebBrowser1.Navigate(URL) Do While (WebBrowser1.IsBusy = True) Or (wait_flag = True) Application.DoEvents() Loop data = WebBrowser1.DocumentText '---- イベント ----- Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted wait_flag = False End Sub

  • WebBrowserでHtmlを取得

    WebBrowserでHtmlを取得する方法をおしえてください フォーム上に、WebBrowser1、TextBox1、Button1を配置しています。 TextBox1にHtmlを表示し、Button1は、WebBrowser1に表示している WEBページを更新します。 やりたい事  (1)フォームを開いた時に、URLで指定したWEBページを表示させ   TextBox1にHtmlを表示させる。  (2)Button1をクリックした時、表示しているWEBページを更新する。   更新後のHtmlをTextBox1に表示させる。  (3)TextBox1の表示が完了したらHtmlを処理する。(未着手) 現在、(1)は動作するのですが、(2)が動作しません(TextBox1のHtmlが更新されない) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load WebBrowser1.Navigate(オッズURL):webcompflag = False Do While (webcompflag = False) System.Windows.Forms.Application.DoEvents() System.Threading.Thread.Sleep(10) Loop TextBox1.Text = WebBrowser1.Document.Body.InnerHtml End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" If Not WebBrowser1.Url.Equals("about:blank") Then WebBrowser1.Refresh() : webcompflag = False Do While (webcompflag = False) System.Windows.Forms.Application.DoEvents() System.Threading.Thread.Sleep(10) Loop TextBox1.Text = WebBrowser1.Document.Body.InnerHtml End Sub 何がいけないのか分かりません よろしくお願いします。

  • アメブロで、スクリプトエラーを回避したい

    アメブロで、スクリプトエラーを回避する方法を教えてください。 以下のプログラムは、C#で作っています。 アメブロの検索画面にてテキストボックスに代入すると、スクリプトエラーが出ます。 この表示を出さないようにするには、どのようにしたらいいですか。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WebBrowserTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Text = "MyBrowser"; this.comboBox1.Text = "http://search.ameba.jp/"; //this.comboBox1.Text = "http://www.google.co.jp/webhp?sourceid=navclient-ff"; } /// <summary> /// DocumentCompletedイベントは、ドキュメントの読み込みが終了したときに発生します。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { HtmlElementCollection all = webBrowser1.Document.All; HtmlElementCollection forms = all.GetElementsByName("q"); forms[0].InnerText = @"c#"; // テキストボックスに「C#」を入力 }

  • WebBrowserでGmailに自動ログイン

    Excel2002VBAにて、WebBrowserでGmailに自動ログインするコードを書いたのですが 実行してGmailにログインはできるのですが、添付画像のダイアログが出てきてしまいます。 はいを押してもいいえを押しても、消した瞬間にすぐに出てきて困っています。 同じような現象の方はいませんでしょうか? またこのエラーの回避の仕方はどうしたら良いでしょうか? ログイン後の画面では何か処理をするようなコードは書いていません。 ちなみにログインするまでのコードは以下です。 Private Sub WebBrowser1_Documentcomplete(ByVal pDisp As Object, URL As Variant) 'Yahooメールなどにログインする処理 ElseIf i = 4 And URL = "https://www.google.com/accounts/Login?hl=ja&cont … Then i = i + 1 WebBrowser1.Document.getElementsByName("Email")(0).Value = "メールアドレス" WebBrowser1.Document.getElementsByName("Passwd")(0).Value = "パスワード" WebBrowser1.Document.getElementsByName("signIn")(0).Click End Sub よろしくお願いします。

  • WebBrowser 複数のsubmit

    VB初心者です ご指導の程宜しくお願い致します visual basic 2008 でWebBrowserにて webページに複数のname属性のないsubmitがある場合どうやって選択して押す動作をさせるのでしょうか??? 下記:webのソース <input type="submit" value="変更する" class="formBt01" /> <input type="submit" value="戻る" class="formBt02" /> どちらかを選択できるようにしたいです 過去にも同じような質問がありましたが回答の通り試しましたが うまくいきません 自分が試したもの WebBrowser1.Document.Forms(0).InvokeMember("submit") もちろんwebソースにsubmitが二つあるので、動作しません WebBrowser1.Document.Forms(1).InvokeMember("submit") フォームで選ぶのかなと試しましたが何も動作しません WebBrowser1.Document.Forms("ボタンのname").InvokeMember("click") ボタンの名前がわからないので、これは使えず… どなたかご教授お願いします

専門家に質問してみよう