2010-07-27
IEを自動操作する時,ダイアログやポップアップをどう扱うか(ファイルアップロードやアラートのダイアログを処理する方法)
javascript, ブラウザ, テスト |
- 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の場合:
http://wiki.openqa.org/display/SEL/Command+Reference+ja
assertAlert
- 注)Selenium の元では、javascript のアラートは目に見えるアラートダイアログとしてポップアップしません。
- 注)Selenium は、ページのjavascript のonload()イベントハンドラによって発生するアラートはサポートしていません。この場合には、目に見えるダイアログが発生され、あなたが手動で OK ボタンをクリックするまでSelenium は停止してしまうでしょう。
answerOnNextPrompt
このように,Seleniumのマニュアルには「onload時のアラートはお手上げです」と書いてあるわけだが,それについて不思議に思った事はないだろうか。
この不思議の理由は,仕組みを理解すれば納得できる。
Seleniumは,alertやconfirm, promptといった関数を,load時に再定義しているのだ。
Selenium自身が処理しやすいように再定義するので,「Selenium の元では、javascript のアラートは目に見えるアラートダイアログとしてポップアップしません。」ということになる。
- 49 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGLL_ja___JP352&q=selenium+javaScript+Popup
- 30 http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&q=IE+ファイル参照 パス&btnG=検索&aq=f&aqi=&aql=&oq=&gs_rfai=
- 26 http://www.google.co.jp/search?hl=ja&q=Selenium+Wscript&aq=f&aqi=&aql=&oq=&gs_rfai=
- 19 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=web+自動テスト ポップアップ
- 18 http://www.google.co.jp/search?q=selenium+ダイアログ 開けない&btnG=検索&hl=ja&sa=2
- 16 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/language_and_engineering/20100727/p1&rct=j&q=ファイル参照ダイアログ ?%
- 15 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=selenium+javascript+ダイアログ&aq=f&aqi=&aql=&oq=&gs_rfai=
- 15 http://www.google.co.jp/search?q=selenium+ポップアップブロック+スクリプトエラー&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:officia
- 14 http://b.hatena.ne.jp/ken3memo/WebBrowser/
- 13 http://www.google.co.jp/search?q=ie+createobject+alert+&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a