- 締切済み
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の中身も前のページのままです。 解決方法お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- DOUGLAS_
- ベストアンサー率74% (397/534)
そもそものご質問の意図を理解できていなかったようです。 button.InvokeMember("click"); の後の Console.WriteLine("waiting..."); が出てこない、つまり while (wb.ReadyState != WebBrowserReadyState.Complete || wb.IsBusy) が スルー されてしまう、ということが問題だったようですね。 Excel で確認したところ、Google の場合は、最初の「検索開始」の画面を呼び出した後は、「検索結果」の画面に遷移する間、「wb.ReadyState」・「wb.IsBusy」が変わっていないので、2番目の while ループ が スルー されてしまうようです(Google の仕様ですかね)。 >ひとまずはdocumentTitleが変わるまで待ちます。 とお書きだったのは、 button.InvokeMember("click"); Application.DoEvents(); while (wb.ReadyState != WebBrowserReadyState.Complete || wb.IsBusy) を hoge = wb.DocumentTitle; button.InvokeMember("click"); Application.DoEvents(); while (wb.DocumentTitle != hoge) みたいにするということでしたか。 こうすれば、2番目の while ループ の中に入って、 waiting... Google waiting... test コマンド - Google 検索 の順に吐き出されますね。 何故か分かりませんが、「コマンド」という言葉が入ってはいますが。。。 何度もスレッド を汚してしまって申し訳ございませんでした。 私の愚答をご覧になって、有識者の方から有効な回答が付くことを祈って、敢えて書かせていただきましたので、#3・4 にはお返事は結構です。 大変、失礼いたしました。 <(_ _)>
- DOUGLAS_
- ベストアンサー率74% (397/534)
>長い返事で大変ありがとうございます。 ぃぇぃぇ、無駄に長いだけでした。 昨夜、回答を書いてからいろいろと考えておりまして、 >「wb.Document」は「<変数なし>」ですねぇ。 について、よく考えてみたら、これって、何かの タイミング でよくあることで、Document 配下の プロパティ を付けて、「Document.All」などに変えたらちゃんと要素が入ってました。 大変、失礼いたしました。 >ひとまずはdocumentTitleが変わるまで待ちます。 >正しい結果も出ます。 Excel では、 While .Busy Or .ReadyState <> 4: DoEvents: Wend Application.Wait (Now + TimeValue("0:00:10")) ← 10秒待ってみました とすれば、 wb.Document.Title : "test コマンド - Google 検索" となりました。 が、相変わらず、表示されている IE の [表示(V)] - [ソース(C)] は <title>Google</title> のままでした。何なんでしょうねぇ。。 以上、お詫び旁々、追加の情報でした。
- DOUGLAS_
- ベストアンサー率74% (397/534)
#1 追加情報 です。 >1回目と2回目の ソース を見比べて見ましたが >ソース が全く変わっていない ということで、それなら、 wb.Navigate "http://www.google.co.jp/?q=#sclient&q=test" や wb.Navigate "http://www.google.co.jp/?q=#sclient=psy-ab&hl=ja&source=hp&q=test&pbx=1&oq=test&aq=f&aqi=&aql=&gs_sm=e&gs_upl=0l0l0l16431l0l0l0l0l0l0l0l0ll0l0&bav=on.2,or.r_gc.r_pw.&fp=b8a4c9b777f5c6bf&biw=1264&bih=875" ならイケるかな? と思いましたが、どうも、URL から 当該ページを開いた場合は、常に <title>Google</title> となってますねぇ。 アドレスバー から「? test」で開いた http://www.google.co.jp/search?sourceid=ie7&q=test&rls=com.microsoft:ja:IE-Address&ie=UTF-8&oe=UTF-8&rlz=1I7MOCJ&redir_esc=&ei=BReDTq2eOPHzmAWazdQ_ の場合は、 <title>test - Google 検索</title> になりました。 でも、「wb.Document」は「<変数なし>」ですねぇ。 しかたないので、WebBrowser ではなくて、HttpRequest で アクセス してみると、ちゃんと、document を取得できました。 Excel VBA の コード ですが、ご参考までに。。。 Sub with_HttpRequest() '// [Microsoft Forms 2.0 Object Library] を参照設定 Dim strHTTP As Variant Dim i As Integer Dim objHTTP As Object Dim strURI As String Dim myDocument As String strHTTP = Array("MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", _ "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", _ "MSXML.XMLHTTPRequest", "WinHttp.WinHttpRequest.5.1") On Error Resume Next Do Set objHTTP = CreateObject(strHTTP(i)) i = i + 1 Loop Until IsObject(objHTTP) On Error GoTo 0 strURI = "http://www.google.co.jp/search?sourceid=ie7&q=test&rls=com.microsoft:ja:IE-Address&ie=UTF-8&oe=UTF-8&rlz=1I7MOCJ&redir_esc=&ei=BReDTq2eOPHzmAWazdQ_" With objHTTP .Open "GET", strURI, False .Send If .Status <> 200 Then GoTo 100 myDocument = .responseText Debug.Print myDocument End With 100: Set objHTTP = Nothing End Sub
- DOUGLAS_
- ベストアンサー率74% (397/534)
>2回目のタイトルは「test - Google 検索」がでるはず お示しの コード を Excel VBA に翻訳して実行してみたところ妙なことに気が付きました。 実は、最近(ここ2~3日)、Google 検索の URL パラメータ の書式が変わったみたいなんですよねぇ~。 以前は、 http://www.google.co.jp/?q=test でイケてたように思うのですが、最近、 http://www.google.co.jp/?q=#sclient&q=test でないと、検索結果が現われないんです。 で、本題に戻りますが、 >Documentの中身も前のページのままです。 とのことですが、Excel VBA では While .Busy Or .ReadyState <> 4: DoEvents: Wend の後には、「wb.Document」は「<変数なし>」になってしまってるんですねぇ。 ぉゃ~ん? と思って、表示された「2回目」の ページ の ソース を覗いてみると、 <title>Google</title> となってますねぇ。 だから >2回目のタイトルは「test - Google 検索」がでるはず なのに、2回目も ><----ここでもGoogleが出力される になっているんでしょうねぇ。 私も興味がありますので、1回目と2回目の ソース を見比べて見ましたが、な、な、なんと、ソース が全く変わっていないではあ~りませんか? 当然、 >Documentの中身も前のページのままです。 でしょうなぁ。。。 これって、どぅぃぅコトッ!? つまり、コード の問題ではなくて、Google サイト の大幅な仕様変更ってトコなんでしょうが、なんか釈然としません。 ●Google Japan Blog http://googlejapan.blogspot.com/2011/09/igoogle.html によると >Google 検索ページや Gmail、Google カレンダーなど Google のサービスのデザインが変更されていることにお気づきの方は多いかと思います。今回のリニューアルは先日行ったこちらの発表 (英語) に基づく変更です。 とのコトですゎ。 まぁ、「Google 検索ページ・・・のサービスのデザインが変更され」た(勝手に検索が始ったりするなど。。)のは、何ヶ月も前のコトですが、今回、第2弾を発動したんとちゃぅヵ? ってトコでしょうかぁ? 以上、見当違いな回答でしたら スル~~なさってください。
補足
長い返事で大変ありがとうございます。 HttpRequestについて、正しいページソースを取得できますが、画面の遷移制御ができないです。 人の操作と同様にWebページの遷移を制御したいので、WebBrowserでやるしかないです。 WebBrowserのバグかな? Navigateでの遷移じゃない場合、待ってくれないみたいです。 ひとまずはdocumentTitleが変わるまで待ちます。 正しい結果も出ます。