スポンサーリンク

IE8で,ファイルのアップロードを自動化する方法  (WSH/JScriptでブラウザを自動操作するサンプルコード)


IE8で,ファイルのアップロードを自動化する方法を発見した。



以下はWSH/JScriptによるサンプルスクリプト。IE8(Windows XP)で動作確認済み。


upload.js

// IEを起動
var ie = WScript.CreateObject("InternetExplorer.Application");
ie.Visible = true;
ie.Navigate("http://localhost/")
ie_wait( ie );


// ファイルをアップロード
type_file_path( ie, "hoge_file_field", "C:\\fuga.txt" );


// このあとで正常にsubmit可能



// ----------- 関数 -------------



// ビジー状態の間待機する
function ie_wait( ie )
{
	while( ie.Busy || ( ie.readystate != 4 ) )
	{
		WScript.Sleep( 100 );
	}
	WScript.Sleep( 3000 );
	return;
}


// ファイル参照フィールドにファイルパスをセットする
function type_file_path( ie, dom_id, file_path )
{
	var ws = WScript.CreateObject("WScript.Shell");

	// ファイルパス入力欄にフォーカス
	ie.document.getElementById( dom_id ).focus();
	WScript.Sleep( 100 );
	
	// その右隣にある参照ボタンにフォーカス
	ws.SendKeys( "{TAB}" );
	WScript.Sleep( 100 );

	// SPACEキー押下で,ファイル参照ダイアログを開く
	ws.SendKeys( " " );
	WScript.Sleep( 1000 );

	// ファイルパスをキー入力
	ws.SendKeys( file_path );
	WScript.Sleep( 100 );
	
	// ダイアログを閉じる
	ws.SendKeys( "{ENTER}" );
	WScript.Sleep( 1000 );

	ws = null;
}

これで,IE8もブラウザの自動テストが可能になる。



ファイルパスを直接入力することはできない

IE8では,HTML上のファイルパス入力欄にSendKeysが不可能になった。
(セキュリティ強化のため)


そのため,どうしてもファイル参照ダイアログを開く必要がある。

Internet Explorer 8 開発者向け技術概要 g. ファイル アップロード コントロール
http://msdn.microsoft.com/ja-jp/ie/dd...

  • ユーザーが入力するローカル ファイルのパスをキーストロークの監視によって “盗む” 攻撃を防ぐため、ファイル パスの編集ボックスを読み取り専用にしました。
  • ファイルをアップロードする場合、ユーザーはファイルの参照ダイアログ ボックスを使用してファイルを指定する必要があります。


msdn : "value" Property (INPUT type=file)
http://msdn.microsoft.com/en-us/libra...

  • The property is read-only.
  • Internet Explorer 8 and later.

なお,「互換モード」(Quirks Mode)でWebページを表示しても事情は同じ。


ダイアログの開き方

もし「DOM要素.click()」でファイル参照ダイアログを開いてしまうと,

  • ダイアログの開いている間はWSH側のコードがフリーズしてしまい,ファイルパス自動入力不可能。
  • しかも,click()で開かれたダイアログ上にファイルパスを手動入力しても,formをsubmitするタイミングで,入力したはずのファイルパスが不正値として消去されてしまい,送信できない。

なので,click() せずに,キー操作だけでダイアログを開いている。

それが冒頭で記述したコード。


補足

IE7用のコードは以下。

IEを自動操作する時,ダイアログやポップアップをどう扱うか(ファイルアップロードやアラートのダイアログを処理する方法)
http://language-and-engineering.hatenablog.jp/entry/20100727/p1