解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

VBScript による IE の読み込み待ち




こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次




目的


IE オブジェクトでWebページを操作している時にページ遷移が発生する場合は多いです。
ページ遷移中にクリックやテキスト入力をしても IE は操作を受け取れません。
そこで、ページ遷移の状態を監視し、ページ遷移と同期を取る関数を作成します。




関数

ソースコード

引数で渡された IE オブジェクトのビジー状態を確認して、ビジー状態なら処理を待ちます。
なお、『VBS』というフォルダの中に『myFunc』というフォルダを作成していて、自作した関数は全て『myFunc』フォルダに保存しています。

WaitForIE_objIE.vbs

Function WaitForIE(objIE)
   '------------------------------------------------------------
   ' ページが読み込まれるまで待つ
   '------------------------------------------------------------
   Do While objIE.Busy = True Or objIE.readyState <> 4
      WScript.Sleep 100
   Loop
End Function

使い方

作成した WaitForIE_objIE.vbs ファイルを呼び出して使うプログラムを書きます。
このプログラムは『VBS』フォルダの直下に保存します。

main.vbs

'------------------------------------------------------------------------------
' 自作関数のインクルード
'------------------------------------------------------------------------------
call IncludeFunction()
 
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
' IE を開く
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   '--- 変数宣言 ---
   targetURL = "https://transit.yahoo.co.jp/"
   '--- 実行 ---
   call newIE(targetURL)
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
' IE オブジェクトを取得する
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   '--- 変数宣言 ---
   targetURL = "https://transit.yahoo.co.jp/"
   '--- 実行 ---
   Set objIE = getObjectIE(targetURL)
   if objIE is nothing then
      '--- オブジェクトが無いので強制終了 ---
      WScript.Quit
   else
      '--- 続行 ---
   end if
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
' 文字列「 sfrom 」が含まれる input タグを取得する
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   '--- 変数宣言 ---
   TagName = "input"
   InString = "sfrom"
   '--- 実行 ---
   set sfrom = getTagByStr(objIE, TagName, InString)
   sfrom.value = "東京"
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
' 文字列「 sto 」が含まれる input タグを取得する
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   '--- 変数宣言 ---
   TagName = "input"
   InString = "sto"
   '--- 実行 ---
   set sto = getTagByStr(objIE, TagName, InString)
   sto.value = "品川"
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
' 文字列「 searchModuleSubmit 」が含まれる input タグを取得する
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   '--- 変数宣言 ---
   TagName = "input"
   InString = "searchModuleSubmit"
   '--- 実行 ---
   set Btn = getTagByStr(objIE, TagName, InString)
   Btn.Click
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
' 路線検索結果のため、 IE ビジー状態を待つ
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   '--- 実行 ---
   call WaitForIE(objIE)

'------------------------------------------------------------------------------
' 終了通知
'------------------------------------------------------------------------------
AutoMsg wscript.scriptname & " の処理が完了しました。", 4
'------------------------------------------------------------------------------
' 自作関数をコールするサブルーチン
'------------------------------------------------------------------------------
sub IncludeFunction()
   '----------------------------------------------------------------------------
   ' 自分(=VBSファイル)のディレクトリを取得する
   '----------------------------------------------------------------------------
   FullPath = wscript.scriptfullname
   FileName = wscript.scriptname
   pathLen= len(FullPath) - len(FileName)
   crrDir = left(FullPath, pathLen)
   chiDir = "myFunc"
   crrDir = crrDir & chiDir
   '----------------------------------------------------------------------------
   ' ファイルシステムを扱うオブジェクトを作成
   '----------------------------------------------------------------------------
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
   '----------------------------------------------------------------------------
   ' フォルダのオブジェクトを取得
   '----------------------------------------------------------------------------
   Set objFolder = objFileSys.GetFolder(crrDir)
   '----------------------------------------------------------------------------
   ' FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
   '----------------------------------------------------------------------------
   For Each objFile In objFolder.Files
      '--------------------------------------------------------------------------
      ' 自作関数のコール
      '--------------------------------------------------------------------------
      FuncFile = objFile.Name
      if instr(1, FuncFile, ".txt") = 0 then
         Set objFile = objFileSys.OpenTextFile(crrDir & "\" & FuncFile)
         ExecuteGlobal objFile.ReadAll()
         objFile.Close
      end if
   Next
   '----------------------------------------------------------------------------
   ' メモリ解放
   '----------------------------------------------------------------------------
   Set objFile = Nothing
   Set objFolder = Nothing
   Set objFileSys = Nothing
end sub




コメント

これで、 main.vbs を実行すると、路線検索結果が完全に表示されるまでプログラムは終了しません。
ページ遷移したら必ず入れましょ。




以上