下記の質問をもらいました。
-
- -
>現在開いているIEの中にあるTEXTBOXに文字列を入れたいと思っています。
>nameなどで指定せず、上(HP上)から順番に文字を入れていきたいです。
>いわゆる凡庸用というのでしょうか。(nameにとらわれない)
>ヤフーのログインとかか、ネット銀行のIDやpassの入力など、・・・
-
- -
↑、意外と、難しかったです。
初めに理由を(言い訳を)書くと
Set XXXXX = objIE.Document.all.tags("INPUT") 'インプットのタグを集める
で、タグを抜くことができるんだけど、
INPUTのタグが typeでわかれていて、特に
input type="hidden"
の隠しパラメータも取得してしまい、なかなか、うまくいかなかったり。
下記の2つがテストプログラムです。
何かの参考となれば、幸いです。
' objIE.Document.all.tags("INPUT") で INPUTのタグを集める。 Sub test_20101003() Dim objIE As Object 'AS InternetExplorer Dim objINPUT As Object '<INPUT 〜 のタグ Dim strHTML As String 'HTMLを入れて、画像を探す ワーク Dim i As Integer 'カウンター Dim n As Integer '上からn番目のカウンター Application.WindowState = xlMinimized 'Excelを最小化 'INPUTのタグを抜き出すテスト 'IEのオブジェクトを作成する Set objIE = CreateObject("InternetExplorer.application") objIE.Top = 0 objIE.Left = 0 objIE.Width = 1024 objIE.Visible = True 'ページを開く(.Navigateで表示する。) objIE.Navigate "https://login.yahoo.co.jp/config/login" 'YAHOO ログイン DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) '読み込み完了となるまで、ループする。 While objIE.ReadyState <> 4 Or objIE.Busy 'READYSTATE_COMPLETE = 4 DoEvents Wend DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) '次に INPUTのタグを抜き出す Set objINPUT = objIE.Document.all.tags("INPUT") 'インプットのタグを集める Debug.Print "数は" & objINPUT.Length '数字で上から0番目、1番目...で使う? objINPUT(0).Value = "0000" objINPUT(1).Value = "1111" objINPUT(2).Value = "2222" 'これだと、↑じっさいは、<input type="hidden" が あるので、うまくいかなかったり... 'input type="hidden" も 数えてしまうので、人が見えている 上から1番目にはならなかったり。 'それと、ループで回せって感じですよね。 For i = 0 To objINPUT.Length - 1 'まぁ、こんな感じでテストでセットかなぁ。 objINPUT(i).Value = i & "TEST" 'テストでiをセット Next i MsgBox "こんな感じ、テストで止めてみた。" '画像のボタン(ファイル名)を .outerHTMを見て探して押す。 For i = 0 To objINPUT.Length - 1 strHTML = objINPUT(i).outerHTML 'リンクのHTMLを代入 n = InStr(strHTML, "button/login.png") 'Loginの画像 を 探す 画像で判断 If n > 0 Then objINPUT(i).Click 'ボタンを押す ↑上で見つけた画像のボタンに対して、.Clickしただけ DoEvents Exit For End If Next i Set objINPUT = Nothing 'オブジェクトの解放 DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) 'ログイン、成功/失敗を判断する。 '読み込み完了となるまで、ループする。 While objIE.ReadyState <> 4 Or objIE.Busy 'READYSTATE_COMPLETE = 4 DoEvents Wend DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) End Sub
'その2 ' objIE.Document.all.tags("INPUT") で INPUTのタグを集める。 ' INPUT の タグには、タイプがあるので、type=textだけをみる? Sub test_20101003_002() Dim objIE As Object 'AS InternetExplorer Dim objINPUT As Object '<INPUT 〜 のタグ Dim strHTML As String 'HTMLを入れて、画像を探す ワーク Dim i As Integer 'カウンター Dim n As Integer '上からn番目のカウンター Application.WindowState = xlMinimized 'Excelを最小化 'INPUTのタグを抜き出すテスト 'IEのオブジェクトを作成する Set objIE = CreateObject("InternetExplorer.application") objIE.Top = 0 objIE.Left = 0 objIE.Width = 1024 objIE.Visible = True 'ページを開く(.Navigateで表示する。) objIE.Navigate "https://login.yahoo.co.jp/config/login" 'YAHOO ログイン DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) '読み込み完了となるまで、ループする。 While objIE.ReadyState <> 4 Or objIE.Busy 'READYSTATE_COMPLETE = 4 DoEvents Wend DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) '次に INPUTのタグを抜き出す Set objINPUT = objIE.Document.all.tags("INPUT") 'インプットのタグを集める Debug.Print "INPUTタグの数は" & objINPUT.Length 'これだと、↑じっさいは、<input type="hidden" が あるので、うまくいかなかったり... 'input type="hidden" も 数えてしまうので、人が見えている 上から1番目にはならなかったり。 'それと、ループで回せって感じですよね。 n = 0 'TYPE=TEXTを探す? For i = 0 To objINPUT.Length - 1 'まぁ、こんな感じでいつものループ 'デバック用 .Type .Name .Value Debug.Print i & ":" & objINPUT(i).Type & " name:" & objINPUT(i).Name & " value:" & objINPUT(i).Value If objINPUT(i).Type = "text" Then 'テキストの時カウントアップ n = n + 1 If n = 1 Then objINPUT(i).Value = "1111111" If n = 2 Then objINPUT(i).Value = "2222222" If n = 3 Then objINPUT(i).Value = "2222222" '↑なんか、バカくさいけど、こんな感じで、上からn番目のTEXTを探してみたり、 End If If objINPUT(i).Type = "password" Then 'パスワードは password なんだね、これも誤算? objINPUT(i).Value = "ppppppppppp" End If If objINPUT(i).Type = "checkbox" Then 'チェックボックスも違うし、 objINPUT(i).Checked = True '全てONにしたり、OFFにする時は便利かなぁ? End If If objINPUT(i).Type = "image" Then 'イメージ、ボタンとリンクしていたり、いろいろあるけど Debug.Print "イメージソース:" & objINPUT(i).outerHTML '外側のタグを含めテストで出力 End If Next i MsgBox "こんな感じ、テストで止めてみた。" 'まぁ、画像のボタン(ファイル名)を .outerHTMを見て探して押す。 For i = 0 To objINPUT.Length - 1 strHTML = objINPUT(i).outerHTML 'HTMLを代入 n = InStr(strHTML, "button/login.png") 'Loginの画像 を 探す 画像で判断 If n > 0 Then objINPUT(i).Click 'ボタンを押す ↑上で見つけた画像のボタンに対して、.Clickしただけ DoEvents Exit For End If Next i Set objINPUT = Nothing 'オブジェクトの解放 '↑ここまで、やるなら、name=を素直にHTMLソースから探した方がはやかったりして(笑) DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) 'ログイン、成功/失敗を判断する。 '読み込み完了となるまで、ループする。 While objIE.ReadyState <> 4 Or objIE.Busy 'READYSTATE_COMPLETE = 4 DoEvents Wend DoEvents '1秒待ち Application.Wait (Now + TimeValue("0:00:01")) End Sub
なかなか、うまくはいかないもんですね・・・