三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Set objINPUT = objIE.Document.all.tags("INPUT") で タグを集めてみたものの...使いにくかった(笑)

下記の質問をもらいました。

    • -

>現在開いている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

なかなか、うまくはいかないもんですね・・・

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)