2011年12月17日土曜日

VBでIEを操作する方法に対するメモ


今まで、いくつかVB.NETでIEのオブジェクトを作成して
ページ遷移していくプログラムを作成した。
その時に、コントロールを操作する方法がいくつかあることは分かった。
正直なところ、VBS、VBA、VB.NET、JavaScript等色々
ごちゃまぜになっていてまだ整理しきれいていない。

①objIE.document.body.all("id")
対象コントロールのidが既知の場合は、
これで直接コントロールを触ることができる。一番手っ取り早い。
ことが多い。
※nameでも大丈夫だった気がする(未確認)

②objIE.Document.getElementById("id")
①とほぼ同じ。

③objIE.Document.getElementsByTagName("a")(i)
これはすべての対象タグを探して、目的となるものを探す方法。
注意すべきは、一意になるようにIf文を書くことぐらい。

例:innerhtmlが"一覧"のaタグを探す例。
For i = 1 To objIE.Document.getElementsByTagName("a").Length -1
If objIE.Document.getElementsByTagName("a")(i).innerhtml = "一覧" Then
Exit For
End If
Next

同じようなことが
getElementsByClassName
getElementsByName
でも可能なはず。

④objIE.Document.Forms(0).Item("id")
formが一つしかない場合は①とほぼ同じ。
複数ある場合は、インデックス注意。
※nameでも大丈夫だった気がする(未確認)


とまー色々な手段で対象コントロールにアクセスすることができるのだが、
適切に操作できるかは別問題。
色々試してみるのが一番。

この前submitがうまくいかないことがあった。
<input type="submit" name="submit" value="検索" type="button">
といったタグがあるとする。
普通は
objIE.Document.forms(0).submit()
で問題ない。
通常はポストパラメータにtype="submit"コントロールのnameが渡されるのだが
上のコードだと、そのnameが渡されなかったということがあった。

次に
objIE.document.body.all("submit").click()
で試してみたら、clickはメンバーにないという旨の例外が発生。

最終的に
objIE.document.getElementsByTagName("input")(i).click()
で解決できたので良かったんだが、
この手段をすっかり忘れていたので、その時は非常に焦った。

という訳で、ダメなときはいろいろな方法を試してみるに限るというのがオチ。

でも、なんでページによって違いがあるのかがよく分からん。