とある三流プログラマーのデバック風景 です。笑ってやってください。
下記の質問をもらいました。
※IDとパスワードは消させてもらいました。
※※株、FX系は、質問いただいてもテストできないから
(テスト結果を出しにくいから敬遠してるんだけど。。。)
'----------------- ここから質問
ログインIDとパスワードと入力する所までは
うまく行くのですが、その後のログインボタンがどうしても押せません。
SubmitとClickを試してみたのですがそれでも駄目でした。
どうかご教授願えませんでしょうか?
以下がコードです。
試して出来なかった没はコメントにしてあります。
Sub test() Dim objIE As Object 'Webページ表示 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://sec-sso.click-sec.com/loginweb/" '画面表示待ち While objIE.readyState <> 4 'READYSTATE_COMPLETE = 4 While objIE.Busy = True DoEvents '特に何もしないで.Busyの状態が変わるまで待つ Wend Wend 'テストボックスへ入力 ''画面表示待ち 'Dim time20 As Date ' ' time10 = DateAdd("s", 16, Now) '3秒待ち、三秒後を計算、 ' While Now < time20 '現在時刻が上↑の三秒後以下の間まわる。 ' DoEvents '嫌いな人多いけど、 ' Wend objIE.document.all("j_username").Value = "test dayo" objIE.document.all("j_password").Value = "123456789" 'フォーム(0番目)を .Submit(送信・投稿) またはClickする objIE.document.forms(0).submit 'objIE.document.forms.("LoginForm").submit 'objIE.document.all(LoginForm).Click 'Dim x As Object 'For Each x In objIE.document.forms(0).all ' If TypeName(x) = "HTMLInputElement" Then ' If x.alt = "ログイン" Then ' Call x.Click ' Exit For ' End If ' End If 'Next End Sub
'------- ここまで。
デバッグ
STOP で 止めて、現物を見るのも あきてきたので、
パターン的に探す時、
外側のHTMLを含めて書きだすと わかりやすいと思います。
(※読者心の声: 「そんな方法があるなら先に、ページの頭に書いとけよ」...)
私のサンプルで、InnerTEXTやInnerHTMLが多いのが原因なんだけど、
探る時は、OuterHTML で エレメント・アイテムを探ると便利です。
Youtubeで大きく見る→ http://www.youtube.com/watch?v=QAF0MVqpOgQ
www.youtube.com
テストで使用したコード
新規のブックに Form(0)だけ書き出してみました(複数フォームに対応しないとなぁ・・・)
Option Explicit Sub test() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'Webページ表示 調査したいページを表示する objIE.Navigate "http://www.ken3.org/cgi-bin/test/test027-2.asp" '画面表示待ち While objIE.readyState <> 4 Or objIE.Busy = True 'READYSTATE_COMPLETE = 4 DoEvents '特に何もしないで.Busyの状態が変わるまで待つ Wend '※FORM(0)の下 オブジェクトを1つ1つ表示してみた Dim i As Integer 'カウンター Dim objTAG As Object 'タグのオブジェクト格納用 Workbooks.Add 'テスト用の新規ブックを追加 Range("A1") = "NO.i番目" '見出しのセット Range("B1") = "TypeName関数の結果" Range("C1") = ".TagName タグの名前" Range("D1") = ".OuterHTML 外側含むHTML" Range("E1") = ".Value 値" Range("F1") = ".Name 項目に付けた名前" Columns("A:G").ColumnWidth = 20 '列幅を20に変更 'Form(0)のオブジェクトをFor Each で書き出す i = 0 For Each objTAG In objIE.document.Forms(0) 'データをセルへセットする Cells(i + 2, "A") = i 'i番目 結局iは使うのかよ(笑) Cells(i + 2, "B") = "'" & TypeName(objTAG) 'TypeNameでオブジェクトのタイプを表示 Cells(i + 2, "C") = objTAG.TagName 'タグの名前 Cells(i + 2, "D") = "'" & Left(objTAG.OuterHTML, 256) 'HTML 頭から256文字 Cells(i + 2, "E") = objTAG.Value '値 Cells(i + 2, "F") = objTAG.Name '名前 i = i + 1 'インクリメント Next End Sub
その他、デバック確認は
http://www.ken3.org/cgi-bin/group/vba_ie_form.asp
↑を見て笑ってください。
確認後、修正
ボタンのオブジェクトが
HTMLButtonElement
だったみたいです。(※Inputのチェックが違っていたのと、)
Button は .altが無いので、
Instr関数でOuterHTML内を探してみました。
'フォーム(0番目)を .Submit(送信・投稿) またはClickする Dim x As Object For Each x In objIE.document.Forms(0) If TypeName(x) = "HTMLButtonElement" Then Debug.Print x.OuterHTML If InStr(x.OuterHTML, "alt=ログイン") > 0 Then Call x.Click Exit For End If End If Next
に変更すると、動作すると思います。
証券会社のページは、自動ログイン除けとかあるので大変だと思いますが....
終わりの挨拶
原因は、
質問者が参考にした三流プログラマーのHP
三流君VBAでIE操作 InternetExplorer.Applicationを操作する
http://www.ken3.org/cgi-bin/group/vba_ie.asp
三流君VBAでIEのフォーム操作 Document.Formsを操作する
http://www.ken3.org/cgi-bin/group/vba_ie_form.asp
が探しにくいからなぁ。
(※読者心の声で 「だったら、探しやすく・見やすくしろよ」と聞こえて所で逃げるように失礼します。)
デバック処理の参考となれば幸いです。