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

ブラウザのSelectBoxクリック

環境/言語:[XP VB.NET2008 Framework3.5]
分類:[.NET]

お世話になります。

webbrowserを使用してのセレクトボックスの項目を選択したいのです。
選択自体はできるのですが、選択しただけでは動かないセレクトボックスになっているようなんです。
クリックして初めて次の処理へ行くセレクトボックスの作りになっていて、
どうやってクリックすれば良いのかわかりません。
どうか宜しくお願いします。
■No27135に返信(Silveaさんの記事)
> どうやってクリックすれば良いのかわかりません。

click メソッドを InvokeMember してみては如何でしょう。

http://msdn.microsoft.com/en-us/library/aa752277.aspx
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.invokemember.aspx
魔界の仮面弁士様、レスありがとうございます。

InvokeMemberというヒントを頂きましたのでいろいろ探して弄ってみました。
ですが、クリックされません。選択もされませんでした。

選択は
WebBrowser1.Document.GetElementById("selectboxname").SetAttribute("value", "5")
これで選択されるのですが、
クリックで次のページに行くという仕様なので、頂いたヒントから以下の様にしてみました。

Dim htmlElements As HtmlElementCollection
htmlElements = WebBrowser1.Document.GetElementsByTagName("SELECT")("selectboxname").GetElementsByTagName("OPTION")

For Each htmlEle As HtmlElement In htmlElements
      'optionの中の AAAAA のテキストをクリック(希望)
If htmlEle.InnerText = "AAAAA" Then
htmlEle.InvokeMember("click")
Return
End If
Next

InvokeMemberの使いかが違うんでしょうか?
■No27137に返信(Silveaさんの記事)
> ですが、クリックされません。選択もされませんでした。
click メソッドは、onclick イベントを誘発させるためのものであり、
項目の選択とは別だと思います。
そのページのスクリプトは、どのように記述されていますか?

> WebBrowser1.Document.GetElementById("selectboxname").SetAttribute("value", "5")
value をセットするのではなく、<SELECT>.selectedIndex プロパティや
<option>.value プロパティを使ってみては如何でしょう。
http://msdn.microsoft.com/en-us/library/aa768871.aspx
http://msdn.microsoft.com/en-us/library/aa769149.aspx

それで駄目なら、IAccessible の accDoDefaultAction / accSelect とか。
ソースは以下のようになっていました。

<form target="_top" onsubmit="return _CF_checklogin_form(this)" method="POST" action="/index.cfm" name="login_form">
<select onchange="document.login_form.submit();document.login_form.set_active_site.selectedIndex.selected=false;" name="selectboxname">
<option value="1">AAAAA</option>
<option value="2">BBBBB</option>
<option value="3">CCCCC</option>
</select></form>

select、optionを使ってのselectindexもvalueプロパティのセットもできませんでした。

option使用
Dim ms As mshtml.HTMLOptionElement = Nothing
Dim htmlElements As HtmlElementCollection
htmlElements = WebBrowser1.Document.GetElementsByTagName("SELECT")("selectboxname").GetElementsByTagName("OPTION")

For Each htmlEle As HtmlElement In htmlElements
Debug.Print(htmlEle.GetAttribute("value"))

If htmlEle.GetAttribute("value") = "1" Then
ms = htmlEle.DomElement
ms.value = "AAAAA"
Return
End If

'If htmlEle.InnerText = "AAAAA" Then
' ms = htmlEle.DomElement
' ms.value = "1"
' Return
'End If
Next


select使用し、selectedIndexでセット
Dim ms As mshtml.HTMLSelectElement = Nothing
Dim htmlElements As HtmlElementCollection
htmlElements = WebBrowser1.Document.GetElementsByTagName("SELECT")

For Each htmlEle As HtmlElement In htmlElements
If htmlEle.GetAttribute("name") = "selectboxname" Then
ms = htmlEle.DomElement
ms.selectedIndex = 2
Return
End If
Next

うーん、何かが根本的に勘違いしてるんでしょうか・・・
■No27139に返信(Silveaさんの記事)
> ソースは以下のようになっていました。

以下、思いつきで。

(案1) fireEvent メソッドで onchange イベントを発呼する。
(案2) onchange プロパティから得た関数オブジェクトを呼び出してみる。
(案3) onchange 属性に付与されたスクリプト文字列を、javascript: プロトコル経由で WebBrowser.Navigate する。
魔界の仮面弁士様、どうもありがとうございます。
できました!
fireEventで??だったんで検索したら魔界の仮面弁士様が5年前に同じ質問に答えていたのが見つかりました。
そのURLを載せていいものかわかりませんので、載せないでおきますが、fireEventで検索するとすぐに出てきます。

以下がそのロジックになります。
Dim a As mshtml.HTMLSelectElement
Dim htmlElements As HtmlElementCollection
htmlElements = WebBrowser1.Document.GetElementsByTagName("SELECT")

For Each htmlEle As HtmlElement In htmlElements
If htmlEle.GetAttribute("name") = "set_active_site" Then
'If htmlEle.InnerText = "AAAAA" Then
a = htmlEle.DomElement
a.selectedIndex = "0"
a.FireEvent("onchange")
Return
End If
'End If
Next

できた簡易版です。
どうもありがとうございました。
解決済み!

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