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