DOBON.NET DOBON.NETプログラミング掲示板過去ログ

webbrowserのボタンをクリック

環境/言語:[VB2005]
分類:[.NET]

webbrowserで表示されたtype=button属性のボタンがいくつか表示されています。
そのボタンをクリックしたいので、
For Each Element As HtmlElement In Me.WebBrowser.Document.Body.GetElementsByTagName("INPUT")
If Element.GetAttribute("type") = "button" Then
Element.InvokeMember("click")
End If
Next
とすると、目的のボタンと違ったボタンが押されてしまいます。
本当に押したいボタンを押すようにするには
どのように記述したらいいでしょうか。
id 属性とか name 属性とか、あるいは「何番目の input 要素か」で判断するとかすればいいんじゃないですか。
ひろゆきさんへ

その後、問題解決はできましたでしょうか?
私も、同じ悩みでここに投稿し援助を仰ぎ、こど様よりご指導を頂いたのですが
そのときは、ログインのボタンが押せなくて立ち往生し教えていただいたコードで成功したのですが、画面が変わると同じコードでは再ログインできず困っていました。
色々探しているとき、貴殿の記事を見つけテストしたところ成功しました。
お礼申し上げます。
しかし、今度はログアウトがうまくいきません。
ひろゆきさんと同じ条件で、5つほどボタン?(項目)が並んでおり
その部分のHTMLソースも文字化けしておりハッキリしていません。
なにしろ、
Me.WebBrowser.Document.Body.GetElementsByTagName("INPUT")
If Element.GetAttribute("type") = "button" Then
Element.InvokeMember("click")
のあたりの意味が今ひとつ理解できていないので、どこに何をSETしてやればいいのか良く割りません。
どなたかお分かりの方よろしくご教授お願いします。

ひろゆきさんも解決しましたら教えていただけるとありがたいです。
こちらも進展あれば、連絡いたします。
2008/02/09(Sat) 06:05:14 編集(投稿者)

こんにちは。

Hongliangさんが書かれている通り、属性か順番でそれを指定するので、HTMLを見て調べてください。

For Each Element As HtmlElement In Me.WebBrowser.Document.Body.GetElementsByTagName("INPUT")
If Element.GetAttribute("type") = "button" Then
Element.InvokeMember("click")
End If
Next
は、単純にドキュメント全体からinputタグのみを全ループして、そのうちタイプ属性がbuttonのものだったら
手当たり次第クリックを実行する、という処理です。
(ボタンはsubmit以外全て押す、ということです。)

なお、属性か順番、と書きましたが、
idもnameも振られてない場合に、ボタン系であれば順番を調べるよりはvalue属性で調べるのが手っ取り早いです。
value属性は、ボタン系の場合ようは表面に表示されている文字列です。楽です。
(表面が同じものが複数ある場合には注意!)

なお、ふろんさんの質問の中に
>画面が変わると同じコードでは再ログインできず
とありますが、一見見た目側が同じでも内側で構造が異なる場合まったく動作しませんので、
各ページについてHTMLを見られないと何もできません。
(大きくて息の長いサービスの場合、ページごとの内部構造の統制がとれてないとこは結構あります。)
ブラウザでページを名前をつけて保存して、文字化けしないエディタ(Terapad等)で開いて地道に各ページを分析する必要があります。
(整理されてるサイトの場合、だいぶ楽なんですが。)

なお、まともな操作をしたい場合、
全部が全部ループでは苦しいので、
最低限、GetElementById、GetElementsByTagName、GetElementsByNameの3つ程度も、
役割を調べておいて使い分けられるようにしておくといいですよ。

※あとは、どうにもならないようないい加減な構造をしてるページの場合で、
かつ、押したい部分が特にスクリプトを発動させたりしないただのリンクだった場合に限っては、
最悪さっさと見切りをつけてNavigateで移動してしまった方がいい場合もあります。
(そういうページは、なんだかんだでどうせ構造もころころ変わるので。)


ところで、ふろんさんはFC2の何かのサービスの制御だったと思いますが、
『ひろゆきさんと同じ条件』(『type=button属性のボタン』)なのでしょうか。
FC2のサービス内だと、大抵、aタグだったような気もしますが。(よくわかりませんが。)
■No21436に返信(こど。さんの記事)
> 2008/02/07(Thu) 11:40:58 編集(投稿者)
>
> こんにちは。
>
> Hongliangさんが書かれている通り、属性か順番でそれを指定するので、HTMLを見て調べてください。
>
> For Each Element As HtmlElement In Me.WebBrowser.Document.Body.GetElementsByTagName("INPUT")
> If Element.GetAttribute("type") = "button" Then
> Element.InvokeMember("click")
> End If
> Next
> は、単純にドキュメント全体からinputタグのみを全ループして、そのうちタイプ属性がbuttonのものだったら
> 手当たり次第クリックを実行する、という処理です。
> (ボタンはsubmit以外全て押す、ということです。)
>
> なお、属性か順番、と書きましたが、
> idもnameも振られてない場合に、ボタン系であれば順番を調べるよりはvalue属性で調べるのが手っ取り早いです。
> value属性は、ボタン系の場合ようは表面に表示されている文字列です。楽です。
> (表面が同じものが複数ある場合には注意!)
>
> なお、ふろんさんの質問の中に
> >画面が変わると同じコードでは再ログインできず
> とありますが、一見見た目側が同じでも内側で構造が異なる場合まったく動作しませんので、
> 各ページについてHTMLを見られないと何もできません。
> (大きくて息の長いサービスの場合、ページごとの内部構造の統制がとれてないとこは結構あります。)
> ブラウザでページを名前をつけて保存して、文字化けしないエディタ(Terapad等)で開いて地道に各ページを分析する必要があります。
> (整理されてるサイトの場合、だいぶ楽なんですが。)
>
> なお、まともな操作をしたい場合、
> 全部が全部ループでは苦しいので、
> 最低限、GetElementById、GetElementsByTagName、GetElementsByNameの3つ程度も、
> 役割を調べておいて使い分けられるようにしておくといいですよ。
>
> ※あとは、どうにもならないようないい加減な構造をしてるページの場合で、
> かつ、押したい部分が特にスクリプトを発動させたりしないただのリンクだった場合に限っては、
> 最悪さっさと見切りをつけてNavigateで移動してしまった方がいい場合もあります。
> (そういうページは、なんだかんだでどうせ構造もころころ変わるので。)
>
>
> ところで、ふろんさんはFC2の何かのサービスの制御だったと思いますが、
> 『ひろゆきさんと同じ条件』(『type=button属性のボタン』)なのでしょうか。
> FC2のサービス内だと、大抵、aタグだったような気もしますが。(よくわかりませんが。)


こど 様

再度のご教示ありがとうございます!
ご返事遅れまして申し訳ありません。
今も必死でHTMLコードを調べているところです。
何しろ文字化けで解読が思うように進みませんがHTMLコードの半角は読めますので
悪戦苦闘中です。
非常に参考になりました。
ありがどうございます。
リンクで飛ぶところは理解できました、ログアウトがそれでした
でも複数のボタンかうまく制御できません。
もう少し色々やって見ます。
仔細なご教授ありがとうございました。
今後ともよろしくお願い申し上げます。

DOBON.NET | プログラミング道 | プログラミング掲示板