小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


今さらながらWHS(JavaScript)でIEを操作する方法を調べてみた。

はじめに

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();
}

参考サイト