IEを自動操作する時,ダイアログやポップアップをどう扱うか(ファイルアップロードやアラートのダイアログを処理する方法)
WSH JScriptでIE(IE7)を自動操作して
- ファイルをアップロードする(ファイル参照フィールドに入力する)。
- ただし,ファイル参照ダイアログを避けて通る。
- promptとかalertなどの厄介なダイアログに応答する。
方法。
おまけとして,Seleniumの仕組みがよくわかる。
サンプルコード
ファイルアップロードのフォームにファイルパスを入力し,プロンプトに応答するサンプルコード。
// 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" ); // プロンプトに応答 answer_on_next_prompt( ie, "プロンプトにこの文章で応答します。" ); // このあとでprompt関数が呼ばれると自動的に答えておいてくれる // ビジー状態の間待機する 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 ) { // 要素にフォーカス ie.document.getElementById( dom_id ).focus(); WScript.Sleep( 1000 ); // ファイルパスをキー入力 var ws = WScript.CreateObject("WScript.Shell"); ws.SendKeys( file_path ); ws = null; WScript.Sleep( 1000 ); // なお,要素をクリックしてダイアログを開いてしまうと, // ダイアログの開いている間はWSH側のコードが // フリーズしてしまう。 // なので,ダイアログを開かずにキー入力する。 } // JavaScriptの関数をブラウザ上でブックマークレットとして実行 function execute_bookmarklet( ie, func ) { var str_address_bar = "javascript:(" + func.toString() + ")();void(0)" ; ie.Navigate( str_address_bar ); WScript.Sleep( 1000 ); } // 次のpromptに対して,特定の文字列で応答します。 function answer_on_next_prompt( ie, str ) { // prompt関数を上書きする execute_bookmarklet( ie, new Function( "window.prompt = function(){ return '" + str + "'; };" ) ); // なお,直接書き換えるのは不可能 // ie.document.parentWindow.prompt = // new Function( "return '" + str + "';" ); }
コードの解説
仕組みについて。
ファイルアップロードのほうは,コメントを参照。
プロンプト応答のほうは,トリッキー。
Webページをロードした瞬間に,JavaScriptのprompt()関数の定義そのものを書き換えてしまう。
これと同じ原理で,alert()とかconfirm()とか,ブラウザの自動操作の邪魔になりそうなダイアログ系の処理を,処理しやすいものにあらかじめ書き換えておくことができる。
(WSHの場合,promptの再定義は,ブックマークレット経由で回りくどい仕方で行なう事になる。)
Seleniumでも同じ事をしている
このテクニックは,Seleniumでも使われている。
seleniumの場合:
http://wiki.openqa.org/display/SEL/Co...
assertAlert
- 注)Selenium の元では、javascript のアラートは目に見えるアラートダイアログとしてポップアップしません。
- 注)Selenium は、ページのjavascript のonload()イベントハンドラによって発生するアラートはサポートしていません。この場合には、目に見えるダイアログが発生され、あなたが手動で OK ボタンをクリックするまでSelenium は停止してしまうでしょう。
answerOnNextPrompt
- 次のプロンプトに対するレスポンスとして指定した文字列を返却するようSelenium に指示します。
このように,Seleniumのマニュアルには「onload時のアラートはお手上げです」と書いてあるわけだが,それについて不思議に思った事はないだろうか。
この不思議の理由は,仕組みを理解すれば納得できる。
Seleniumは,alertやconfirm, promptといった関数を,load時に再定義しているのだ。
Selenium自身が処理しやすいように再定義するので,「Selenium の元では、javascript のアラートは目に見えるアラートダイアログとしてポップアップしません。」ということになる。