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 を実行すると、路線検索結果が完全に表示されるまでプログラムは終了しません。
ページ遷移したら必ず入れましょ。
以上