管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

WSH(JScript)でIE操作

WSHでJScriptを使ってIEを操作したかったので頑張ったメモ。
タブで任意のURLを開けるようになれば、そこから先は通常のDOM操作で行けると思うので、そこまでを頑張った。
IE未起動の状態で実行すると、1タブ目がよくわからないタブ(真っ白なタブ)として開いてしまうのが微妙なところ...

スクリプト例

({
    SHELL_APPLICATION: "Shell.Application",
    IEXPLORER_EXE: "IEXPLORE.EXE",
    INTERNETEXPLORER_APPLICATION: "InternetExplorer.Application",
    openURLonIE: function (noList) {
        // 新しいタブで開くときの定数&H800
        var OPEN_NEW_TAB = 2048;
        var TARGET_URL = "<開きたいURL>";

        var ie = this.getIE();
        this.waitIE(ie);

        ie.Navigate2(TARGET_URL, OPEN_NEW_TAB);
        this.waitIE(ie);

        // 開いたタブは別オブジェクトになるため、改めてタブを取得
        ie = this.getActiveTab();
        WScript.Echo(ie.LocationURL);
    },
    getActiveTab: function () {
        var HTML_DOCUMENT = "HTMLDocument";

        var e = new Enumerator(WScript.CreateObject(this.SHELL_APPLICATION).Windows());
        e.moveFirst();

        var ie = null;
        // 一番最後のタブを見つける
        while (!e.atEnd()) {
            try {
                if (new String(e.item().document).indexOf(HTML_DOCUMENT) > -1) {
                    ie = e.item();
                }
            } catch (err) {
            }
            e.moveNext();
        }

        if (ie == null) {
            WScript.Echo("ie nothing");
        } else {
            return ie;
        }
    },
    waitIE: function (ie) {
        var SHORT_WAIT_MSEC = 500;
        var LONG_WAIT_MSEC = 3000;

        while (ie.Busy) {
            WScript.Echo("busy");
            WScript.Sleep(SHORT_WAIT_MSEC);
        }
        WScript.Echo("waiting...");
        WScript.Sleep(LONG_WAIT_MSEC);
    },
    getIE: function () {
        var e = new Enumerator(WScript.CreateObject(this.SHELL_APPLICATION).Windows());
        e.moveFirst();

        // IEを見つける
        var ie = null;
        while (!e.atEnd()) {
            try {
                if (new String(e.item().FullName).indexOf(this.IEXPLORER_EXE) > -1) {
                    ie = e.item();
                    return ie;
                }
            } catch (err) {
            }
            e.moveNext();
        }

        // IEが未起動であればウィンドウ表示ありでIE起動
        if (ie == null) {
            ie = new ActiveXObject(this.INTERNETEXPLORER_APPLICATION);
            ie.visible = true;
            return ie;
        }
    },
    isClicked: function () {
        var WSCRIPT_EXE = "wscript.exe";
        var scriptEnironment = new String(WScript.FullName);

        // 実行環境がwscript.exe だとクリック起動
        // コマンドライン起動だとcscript.exe
        if (scriptEnironment.lastIndexOf(WSCRIPT_EXE) > -1) {
            return true;
        }

        return false;
    },
    main: function () {
        if (this.isClicked()) {
            WScript.Echo("コマンドライン起動してください");
            return;
        }

        this.openURLonIE();
    }
}).main()

実行例

C:\Users\hoge\Documents\jscript\snippets>cscript //nologo .\ie_operate.js
waiting...
waiting...
https://www.google.co.jp/