
IEをVBSで自動化した話
はじめまして、アイシーティーリンクの熊井と申します。
今年の1月に入社し、約半年がたちました。
これまでは開発系の仕事がメインでしたので、
入社してからは新たな技術やツールを学びながら日々を過ごしています。
今回書かせていただく内容はWeb操作の自動化です。
お客様先に常駐して作業していた際に、Webサイトにログインして設定変更をする、という作業が10000回ほど必要となりました。
1回1,2分ほどかかり、少なく見積もっても10000*1分=約160時間・・・。
コード組んだほうが早いと考え、Web操作の自動化を実施しました。
今回は外部のソフトウェアが入れられない環境だったため、Windows10の標準機能のみを利用しています。
環境
OS:Windows10
ブラウザ:IE11
※対象サイトが古いため、ドキュメントモード5の互換モードで動作
言語:VBScript + COM
基本的なコード
取得したい要素のIDやタグ名はブラウザの開発者ツール(F12で起動)でDOMを見て指定します。
' InternetExplorerオブジェクトを作成
Dim objIE
Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Visible = True ' ウィンドウ可視化
' Webページ遷移
objIE.Navigate "http://192.168.xxx.xxx"
' Webページのロードを待つ
Do While objIE.Busy
WScript.Sleep 100
Loop
' WebページのIDやタグ名を指定して要素を取得
Dim btn, btns
Set btn = objIE.Document.getElementById("button_id")
Set btns = objIE.Document.getElementsbyTagName("input")
btn.Click
btns(0).Click
' IEを閉じる
objIE.Quit
' オブジェクトの破棄
Set objIE = Nothing
実装時に詰まったコード
・操作したい要素がFrameの子要素の場合
対象FrameのDocumentからgetElement~としないと要素を取得できません。
Dim doc, btn
Set doc = objIE.Document.Frames("menu").Document
Set btn = doc.getElementById("button_id")
・プロンプトが表示されるページ(alert、confirm)
プロンプトが表示されるとVBSの処理が止まるため、JavaScripを実行してalert関数を上書きします。
' ↓は対象のサイトではなぜか効かなかった(IE5では動作しない?)
'objIE.Navigate "JavaScript:function alert(){ return true; }"
objIE.Document.Script.execScript "window.alert=function(str){ return true; }", "javascript"
所感
IEの自動化では対象のページの構成や動作環境によって、同じコードでも動かない場合があり、想定外のところで止まることが多々ありました。
VBSではデバッグやインテリセンスの機能が使えないため、エラー時の対処に苦労しました。
そのため、標準で専用のエディタが入っており、ステップ実行などの機能が使えるPowershellで開発することをおススメします。
外部のソフトウェアを入れられる場合はRPAやSeleniumを利用することでより簡単に実装できます。
RPAにはMicrosoft社のPower AutomateやオープンソースのTagUI、OpenRPAなど無料で使えるソフトも複数あります。
個人的にWeb自動化に使うソフトの優先順位は↓です。
RPA > Python + Selenium > Powershell + COM > VBS + COM
最後に私が気になっている自動化関連のツールやサービスについてご紹介します。
・Terraform
インフラ構成や設定をコードで記述し自動化する(IaC)。
クラウドでもオンプレでも同じように記述できる。
弊社のエンジニアによる記事はこちら。
・Zapier
Web上のサービス間を連携(データやり取りやトリガー実行など)できるSaaS。
GUIが提供されており、簡単に設定できる。
サービス間連携による自動化だけでなく
ローコード/ノーコードと合わせて短期間でのサービス構築にも使われる。
以上、最後までお読みいただき、ありがとうございました。