[VBS] IE: オブジェクトがありません。:'document.getElementById(...)'

WSHのVBScriptでIEを操作してフォーム入力などを自動処理にしようとしていたのですが、スクリプトを実行するPCを変えるとエラーが出たりでなかったりしましたので、原因を調べました。

■エラー内容

エラー:オブジェクトがありません。: '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で書こうかな。とはいえ、これも出てだいぶ経つけれどパッとしないですね。