スキップしてメイン コンテンツに移動

サンプルスクリプト:IEでクリックボタンを連続処理する(VBS)

VBSでIEを操作する。
選択可能なボタンを連続的にクリックし、リンク先での処理を行う。
但しボタンはクリック可能なものと不可能なものが存在し、
且つリンク先は別ウインドウで開くと遷移エラーとなるのでシングルで処理する必要がある場合の処理。



Dim IE    'IE

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True

IE.Navigate "URL"    '
'開くまで待つ。ページ遷移の際はお約束
Do While IE.Busy = True Or IE.readyState <> 4
Loop

'###################
'ここに処理を記述
'選択可能なボタンをクリックして連続的にクリック先画面に遷移する
'但し、クリック可能なものとクリックが不可能なものが存在し、
'且つクリック先を別窓で開こうとすると遷移エラーとなる場合の処理

'選択不可なボタン
'<td class="text6">
'        <div class="textAlign">
'          <img alt="選択する" src="../img/common/dummy_syoukai4.png"></div></td>
'選択可能なボタン
'<td class="text6">
'        <div class="textAlign"><a tabindex="106" href="../../yh2p/scb/PYHW0210.seam?index=2&amp;ETRFLG=1&amp;SDP=1">
'           <img class="rollover" alt="選択する" src="../img/common/dummy_syoukai2.PNG"></a></div></td>

'方針
'Class="test6"の各オブジェクトについて以下を処理する
'<a>タグを持っている→クリック
'<を持っていない>→スルー
'課題
'    一つの契約紹介をして画面を戻し、次のループに入ってくると、
'    "myTag = myTarget.outerHTML" が失敗する。
'    一度別の画面に遷移してしまっているので、
'    "ie.document.getElementsByClassName("text6")"の内容が破棄されているため。
'
'    1.For Each ~ Next でループカウンタを用い、紹介するリンクボタンのindexをとる。
'    2.indexを格納した配列について以下処理
'        ・ie.document.getElementsByClassName("text6")を添え字付きでアクセスし、
'          リンク先をクリック。
'        ・待機処理
'        ・リンク先処理
'
'    ポイントは リンク先処理でちゃんと元のページに戻ってくる事と
'    リンクへアクセスする際、つどオブジェクトに1回ごとに指定しなおす、という所。

dim myTarget
dim myTag
dim myArray()
dim iCnt
iCnt = 0
Redim Preserve myArray(iCnt)
for Each myTarget in ie.document.getElementsByClassName("text6") 'クラス名でコレクションを得る
    myTag = myTarget.outerHTML
    Redim Preserve myArray(iCnt)
    If Instr(myTag, "href=") > 0 then    'クラスのHTMLに"href="が含まれるかチェック
        myArray(iCnt) = True             '含まれる場合、フラグを立てる
    Else
        myArray(iCnt) = False
    End If
    iCnt = iCnt + 1
Next

'配列のフラグをチェックして、Trueのものについてはクリックして画面を遷移させる。
'ポイントは改めて getElementsByClassName コレクションを添え字付きで呼び出しているところ。
For iCnt = 0 To Ubound(myArray)
    If myArray(iCnt) Then
        ie.document.getElementsByClassName("text6")(iCnt).getElementsByTagName("a")(0).click
        Do While ie.Busy = True Or ie.readyState <> 4
        Loop
'###################
        'リンク先処理を記述
        'からなずリンク元に戻るように記述する事
'###################
    End If
Next

'###################
IE.Quit                   'IE終了
Set IE = Nothing     '開放

コメント

このブログの人気の投稿

対処例:Accessフォームでチェックボックスが思うように設定できない

開発プラットフォームとしてAcccessという事は多い。 そして何気に不思議な動作をする事が多いのも事実。 今回であったのは、フォームに置いたチェックボックスが、フォームを開いた際に思ったように振舞ってくれない、というもの。 このチェックボックスは規定値=FALSEで設定してあって、人の操作以外でこのチェックボックスの値は操作していない。 そしてこのチェックボックスを置いたフォームを開くと… 問題のチェックボックス、チェックがついた状態で描画される!!! こまったチャンである。 時折は意図したとおりにOFFの状態で開く場合もあるものの、まれ。 ここはしっかりユーザーの操作(チェックボックスをONにする)に基づき、関連の項目を入力してもらう、という動作をさせたいし、また他へのI/F項目でもあって、しっかりさせたい。ちなみに、TripleState プロパティは Falseに設定してある。 簡単にググッてみたものの、ちょっと同様の事例や対処は見つからず。いくつか試したが、うまく行かない。 で、結論から書くと、こういう対処をした。 Form_OPENイベントの際に、問題のチェックボックスに以下の操作を実行 ・問題のチェックボックスにフォーカス設定 ・問題のチェックボックスに対して、SendKeys でスペース(" ")一文字投げつけ ・問題のチェックボックスの Value 値を確認。True の場合、もう一回SendKey でスペース(" ")一文字投げつけ 発想としては、チェックボックスがカレントな状態のとき、スペースキーで値が操作できる事を思い出し、ぶつけてみた。 でも、実は最初はうまく行かず。 はて? で、 SendKeys のリファレンスを改めて眺めて、 Wait オプションがある事を思い出した。 解説するまでもないが、これが True の場合、そのキーが処理されるまでVBAは次の実行をまつ。デフォルトでは False で実行される。なので、Accessが、なげつけられた?(いや、自分で自分に投げているわけだから…)スペースキーを受け取る前にVBAが進んでるか?と思い、以下に書き換えてやってみた。 SendKeys " ", True ...

VBS で引数を受け取るサンプル

WScript.Arguments に引数要素が配列で格納されているので、これを取り出す。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments strPrm0 = oParam(0) Wscript.echo strPrm0 =========================================== これを引数あり、引数なしでそれぞれ実行してみる。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >cscript.exe test.vbs a a >cscript.exe test.vbs test.vbs(9, 1) Microsoft VBScript 実行時エラー: インデックスが有効範囲にありません。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strPrm0 = oParam(0) の場所で怒られている。 引数なしで起動した場合には相応の対応をしたい。 そこで、上記を書き換える。 WScript.Arguments のCount ポロパティの値をチェックして動作を切り分ける方法。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments ...

Accessで環境変数を使う

今回のお題は、ディレクトリの特定の仕方について。 Accessで処理するファイルを、ある場所、具体的にはユーザープロファイルの”ダウンロード”フォルダからアプリのディレクトリに移動したい。 ただ、”ダウンロード”フォルダはログインしているユーザーによって絶対パスが変わってくる。それをどうするか? 今回の場合、ユーザーのリテラシーがそれほど高くなく、ネットからダウンロードされたファイルを、ユーザー自身がファイル選択ダイアログから選んで指示するのは避ける、という判断となった。 一応、ネットからダウンロードされるファイルの保存先はユーザー別の”ダウンロード”フォルダ、という事は保障される前提。 ダウンロードされるファイル名は名前付けルールにそって、識別子のお尻にタイムスタンプが付く。 ただ、Access側での処理のタイミングの問題で、同時に複数のダウンロードファイルを処理するケースも想定された。 個人的には、バッチファイルを同期でアクセスから実行して…、で良いんじゃない?と思った。 それなら環境変数でユーザープロファイルのパスが取れるから。 でも他からの判断でアクセス内で完結させる方法をとる事となった。 で、結局はWSHの ExpandEnvironmentStrings メソッドを使う事にした。 このメソッドは環境変数(%XXXX%)文字列をあたえるとそれの展開結果を返してくれる。 なんで、ExpandEnvironmentStrings("%userprofile%")とすると、ログインユーザーのユーザープロファイルパスが帰ってくる。 なお、これをAccessで使うには参照設定として「Windows Script Host Object Model」 を追加しないといけない。 また、オブジェクトを使うにはアーリーバインディングで書く必要がある事に注意。 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>...