はじめに
WSH(Windows Script Host)を利用すると、スクリプトからIEを起動して、任意のページを表示して、ボタンをクリックする、なんてことが特別なツールをインストールすることなくできます。
これを利用すると、Webアプリケーションのテストツールが作れるんじゃないかと思って、今さらながらWHS(JavaScript)でIEを操作する方法を調べてみました。
JavaScriptからIEを起動する(LaunchIe.js)
JavaScriptからIEを起動するには、InternetExplorer.Applicationという名前のActiveXObjectオブジェクトを生成し、それに対してメソッドの呼び出しを行います。
main(); function main() { var ie = new ActiveXObject("InternetExplorer.Application"); // ウインドウを表示する ie.visible = true; // Googleを開く ie.navigate("http://www.google.co.jp/"); }
上記のスクリプトを起動するには、スクリプトをファイルに保存し、以下のようにコマンドから起動します。
cscript LaunchIe.js
ページをロードするまで待つ
IEを起動して、ページを完全に読み込んでから何らかの処理をしたい場合には、busyプロパティおよびreadyStateプロパティを参照し、ページが読み込まれるまでの間、繰り返しスリープするという手法が用いられます。
var ie = new ActiveXObject("InternetExplorer.Application"); ie.visible = true; ie.navigate("http://www.google.co.jp/"); // busyの場合、あるいは、読み込み中の場合は、100ミリ秒スリープする while( (ie.Busy) || (ie.readystate != 4) ) { WScript.Sleep(100); }
IEのプロセスが同じになる。
タスクマネージャでプロセスを監視していると分かりますが、上記の方法で起動したIEは、すべて同じプロセスとなります。これはつまり、片側で何らかのサービスにログインした場合、もう一方のブラウザもログインした状態になります。
たとえば、以下のようにActiveXObjectを2つ作ったとしても、それぞれは同じプロセスになってしまいます。
var ie1 = new ActiveXObject("InternetExplorer.Application"); var ie2 = new ActiveXObject("InternetExplorer.Application"); ie1.visible = true; ie2.visible = true; ie1.navigate("http://www.google.co.jp/"); ie2.navigate("http://www.google.co.jp/");
別プロセスでIEを起動する
別プロセスでIEを起動したい場合には、WScript.Shellオブジェクトのrunメソッドを使って、IExplore.exeを直接キックする方法があります。
function main() { var wsh = new ActiveXObject("WScript.Shell"); wsh.run("IExplore.exe"); }
色々試した果てにたどり着いた方法は
かなり強引にWScriptでかなりIEXPLORE.EXEを直接蹴っ飛ばす方法だ。
WScript.Shellオブジェクトを生成して、runメソッドでIEのexeを直接起動するようにすると、別プロセスでIEを立ち上げることができます。ただし、この方法はCOMオブジェクトを利用した起動方法ではないため、起動したIEのオブジェクトに対して操作をするということが難しくなります。※方法がないわけではないと思いますが、やり方が分からなかったです。
はてなに自動的にログインするスクリプト
はてなに自動的にログインするスクリプトを書いてみました。すでにログイン中の場合は、うまく動作しないです。
main(); function main() { var ie = new ActiveXObject("InternetExplorer.Application"); ie.visible = true; ie.navigate("https://www.hatena.ne.jp/login"); while( (ie.Busy) || (ie.readystate != 4) ) { WScript.Sleep(100); } // ユーザID ie.document.getElementById("login-name").value = "userid"; // パスワード ie.document.getElementsByName("password").item(0).value = "xxx"; ie.document.getElementById("auto_login").value = "1"; ie.document.getElementsByName("location").value = "http://d.hatena.ne.jp/"; ie.document.getElementsByTagName("form").item(0).submit(); }
参考サイト
- Launch Internet Explorer 7 in a new process without toolbars - Stack Overflow
- PowerShellを使うと、別プロセスでの起動ができると書かれているので、今度検証してみたいと思います。