■エラー内容
エラー:オブジェクトがありません。: 'document.getElementById(...)'コード:800A01A8
ソース:Microsoft VBScript 実行時エラー
■検証用のコード(ie_test.vbs)
Dim ie Set ie = CreateObject("InternetExplorer.Application") ie.Visible = true ie.Navigate "https://www.google.co.jp/" Do While ie.Busy = True Or ie.readystate <> 4 WScript.Sleep 100 Loop Dim search_in Set search_in = ie.document.getElementById("lst-ib") Dim submit_form Set submit_form = ie.document.forms("f") search_in.Value = "debugging" submit_form.Submit始め、PCや回線状態によって、用意ができていないページのフォームにアクセスしていることがエラーになっていることを疑いました。しかし、ウェイト時間を増やしても改善させませんでした。
■結論:保護モードがスクリプトの動作を抑制していた
結局、いろいろ設定を見てみると、インターネットオプションの「保護モード」が原因のようでした。うまくいっていたPCでは、IEの保護モードがオフになっていました。保護モードのON/OFFを変更すると、両方のPCで同じ結果になりました。
ON ---> Windows Script Host: 実行時エラー。IEの表示は検索前ページで止まっています。
OFF ---> 正常終了。IEの表示はフォーム入力の「debugging」の検索結果が出ました。
■考察
私の環境(Windows8.1 IE11とWindows7 IE11)では、これでうまくいきましたが、もし同じようにしても、なおうまくいかない場合は、他にはセキュリティソフトやファイヤーウォールの設定などを検討してみてください。スクリプトでブラウザを動かす場合、たくさんの手順を踏んで結果になるので、原因の特定が難しいです。なお、保護モードを解除すると、以下の警告が表示されます。ご使用は限定的に。
ちなみにVBScriptはこのようなセキュリティ上の難点があるからか下火のようです。直接リクエストをPOSTするよりも簡単で便利なんですけれどね。次はPowerShellで書こうかな。とはいえ、これも出てだいぶ経つけれどパッとしないですね。