2012年6月30日土曜日

ブラウザ上で自動操作


定期的にWindowsOSで、ブラウザを立ち上げ、
WEBのアプリケーションを開き、Windowsのあるローカルファイルの
内容を貼り付けるという単純作業をひたすらやることになった。

当然この作業を自動化する。


【作業の流れ】
(1) ブラウザを立ち上げ、アプリケーションを開く
(2) 専用のユーザ名とパスワードを入力してログインする
(3) WEBで必要項目を入力する
① 日時
② とあるチェックボックスを選択
③ ファイルの内容を貼り付け



【自動化するスクリプトに何を選ぶか】
候補は3つ。
(1) JScript
(2) VBScript
(3) PowerShell

(1)と(2)をまとめてWSH(Windows Scripting Host)というらしい。

調べたところ、WSHからPowerShellへ徐々に移行してくるようなことが書いてある。
ならばPowerShellを使うべきだろうか。しかしコードを見る限り直感的に使いたいと思わない。
VBScriptも本能的に触りたくない。
技術的判断ではなく、感覚的な意見で嫌だ嫌だと言っているのは
Windowsというプラットフォームに意欲がそがれてしまうからなのか。

それはさておき、もう少しそれぞれのスクリプトを見ていると
JScriptはJavaScriptにコードが似ていることに気がついた。
JavaScriptの実装になっており、同じランタイムを利用している様子。
言語の設計思想は大きく異なるようだが、まあいいだろう。
少しだけやる気がわく。ということで、本能を頼りに、JScriptを利用することにする。



【コード】
ファイル名は○○.jsでよい。

//  開くファイルの形式
var TRISTATE_TRUE       = -1;  // Unicode
var TRISTATE_FALSE      =  0;  // ASCII
var TRISTATE_USEDEFAULT = -2;  // システムデフォルト

//  ファイルのオープンモード
var FORREADING      = 1;  // 読み取り専用
var FORWRITING      = 2;  // 書き込み専用
var FORAPPENDING    = 8;  // 追加書き込み

// 開くファイル
file="C:/file1.txt"  // ファイル

var fs = new ActiveXObject("Scripting.FileSystemObject");
var file = fs.OpenTextFile(file, FORREADING, true, TRISTATE_FALSE);
var ip = file.ReadAll();
file.Close();

//  オブジェクトを解放
fs = null;

dd     = new Date();
year   = dd.getYear();
month  = dd.getMonth() + 1;
day    = dd.getDate();
hour   = dd.getHours();
minute = dd.getMinutes();

time = year + '/' +  month + '/' + day + '/' +  hour + '/' + minute;

// 変数内を確認したければ
// WScript.Echo(time);
// WScript.Echo(file);

use_ie();

function use_ie()
{
  // IEを起動
  var ie = WScript.CreateObject("InternetExplorer.Application")

  // 以下のリンクにアクセス
  ie.Navigate("http://example.com/hoge1.html");

  // アプリケーションを表示
  ie.Visible = true;

  wait(ie);

  // ユーザ名とパスワードを入力
  if (ie.document.getElementsByName("UserName").length !=0 ) {
    ie.document.getElementsByName("UserName")(0).value = "GS07604" ;
    ie.document.getElementsByName("Password")(0).value = "terasakiy68";
    ie.document.getElementsByName("_DominoForm")(0).submit();
    wait(ie);
  };

  ie.Navigate("http://example.com/hoge2.html");
  wait(ie);

  // <a href=~>の上から3番目のリンクへ飛ぶ(当然アプリ依存)
  ie.Navigate(ie.document.getElementsByTagName("a")(3).href);
  wait(ie);

  ie.document.getElementsByName("Restriction")(1).checked = true;
  ie.document.getElementsByName("Reason")(0).checked = true;
  ie.document.getElementsByName("SMTP_Log")(0).value = log;
  ie.document.getElementsByName("RestrictionTo")(0).value = ip;
  ie.document.getElementsByName("StartTime")(0).value = time;
}


// IEがビジー状態の間待つ
function wait( ie )
{
  while( ( ie.Busy ) || ( ie.readystate != 4 ) )
  {
    WScript.Sleep( 100 );
  }

  WScript.Sleep( 1000 )
}