)でテストケースを書く場合、かゆいところに手を届かせたい時に是非とも利用したいのがJavaScriptです。その情報が気軽に手に入らないのが残念なところ。「ないなら書いてしまえ!」ということでSeleniumでJavaScriptを利用したい場合に使える方法をまとめてみることにしました。逆引き辞典にしたいのかリファレンスにしたいのかわけがわからんカテゴライズになっていますが、少しづつ増やしていくので気長にお待ちください。関数JavaScriptでページ内の関数を実行するテストケース実行中に関数を作って実行するSeleniumに外部JavaScriptファイル(.js)を読み込んで関数を実行するログJavaScriptでログウィンドウにログを出力させるサードパーティー製品との連携SeleniumでjQueryを利用するSelenium内でPrototype.jsを使うFireBugのコンソールウィンドウに変数内容を出力するJavaScript小技編Seleniumのテスト中に任意のパラメーターを使うSeleniumでテスト実行前にダイアログで警告するJavaScript基本編Selenium空間とページ空間の違いによるJavaScriptの使い分けSeleniumでJavaScript命令を利用する場合、実行されるスクリプトがどのオブジェクトを基準に実行されているかを知っておくことは重要です。実際は、以下のようにテスト開始時にはseleniumオブジェクトインスタンスの中にいます。このseleniumオブジェクトインスタンスの中(以下:selenium空間と呼びます)からは基本的にテストするページウィンドウなどは見えません。seleniumオブジェクトにはページウィンドウやテストページ内の要素を参照したりコントロールしたりする専用の関数がたくさん入っていますので、関数を利用してページをテストしていくことができます。関数の中には、seleniumオブジェクト内でJavaScriptを実行させるものから、ページ管理オブジェクトであるbrowserbotオブジェクトを参照したり、テストページ内に直接<script>タグを埋め込んでJavaScriptを実行したりできる命令もありますので、多彩な機能をもったテストケースの作成が可能になります。以下の図は、SeleniumでJavaScriptを利用する際にJavaScriptでアクセス可能な領域とアクセス方法を簡単なイメージにまとめたものです。実体験からイメージしたものなので、正確さは保証できかねますが、理解しやすくするための基本図として見ておいていただけたらと思います。Locator)では、ID指定、XPath指定、DOM指定など、さまざまな方法が使えます。JavaScript式は以下のようにdocumentやdom=で書き始めることでDOM指定になります。//最初のリンクをクリック各種コマンドの入力欄にJavaScriptを使う「javascript:{式}」ドキュメントマニュアルにもあるように「全てのSeleniumコマンドのパラメータには完全なJavaScriptの記述も使えるし、代わりに簡単な方法でも指定することができます」。要素を指定するところは重要な部分なので、例えば’click’コマンドでは要素指定をJavaScriptでどうやるんだろう?と悩んでいらっしゃると思います。簡単な方法として、入力欄に’javascript{式}‘を使って、正式なSeleniumの要素指定文字列を生成することができます。これには要素のID指定、CSS指定、XPath指定を対象にすることができます。コマンドの対象欄に要素をIDで指定するための「id=myButton」をJavaScriptを使って行いたい場合は、JavaScriptでどんな方法を使ってもいいから「id=myButton」という文字列を生成すれば良いということになります。極端に書くと「javascript{[“id=”,”my”,”Button”].join(”)}」という書き方でもOKです。以下の4つはどれも同じ動作(ID属性にmyButtonが指定してある要素をクリック)をします。b;}ワンポイント講座JavaScriptの記述が複数の処理記述を含む場合は、最後に実行された処理の値が使われます(上の4番目がそれです)。JavaScript記述のデバッグを行いたい場合は「getEval」コマンドを使ってください。Selenium内JavaScript実行用コマンド「getEval」getEvalコマンドはテスト中のブラウザウィンドウやページとは異なる、seleniumオブジェクト内でJavaScriptを実行させるコマンドです。100;」とした場合、seleniumオブジェクト内にhoge変数が定義されたことになります。以下のように複数の処理を一度に書くこともできます。200;(肝心の「テスト中のwindowオブジェクト」や「テスト中のdocumentオブジェクト」を参照して利用したい場合は、getCurrentWindow()やgetDocument()を使って取得する必要があります。storeEvalなど)で格納された変数を再利用したりと、多彩な使い方ができます。‘鈴木太郎’;ページ内JavaScript実行用コマンド「runScript」runScriptコマンドは、現在テスト中のウィンドウのbody内に新しく<script>タグを生成します。このコマンドを利用することでgetEvalコマンドを使ったスクリプト実行よりも簡単にテストページ内の状態をデバッグすることができます。注意点として、runScriptによって生成された<script>タグ内の例外処理はSeleniumで管理することができないので、スクリプトが例外を投げる可能性がある場合は、そのスクリプトをtry/catchブロックで囲って独自に処理してください。runScriptコマンドは使うたびにページ内に<script>タグが追加されていくので、ご利用は計画的に。elem.focus();変数・情報の取得JavaScriptでSelenium内に変数を保存する何はなくとも変数の保存!ということで、JavaScriptでselenium空間内に変数を保存する場合は基本的にgetEvalコマンドが利用できます。varなしvarをつけずに保存すると永続的な変数保存になり、コマンドをまたいで利用できるのはもちろん、テストスイートにおいてもテストケースをまたいで利用することもできます。100;varありvarを使うと一時的な変数保存になり、実行しているコマンド内では有効ですが、次のコマンドに移ると消えてしまうので注意してください。以下のテストケースでは、1つめのコマンドは正常に実行されますが、2つめのコマンドはaがすでに消えているためエラーになります。storeValueなど)で取得した情報を格納しておくことができます。このstoredVarsにJavaScriptを使って情報を格納することができるコマンドがstoreEvalコマンドです。storeEvalコマンドでは、最後に実行された処理結果が情報として格納されます。以下の例は名前の文字列を「myname」というキーでstoredVarsオブジェクトに格納するテストケースです。myname以下の処理と同等に考えてもらうと良いかと思います。mei;store系のコマンドはJavaScriptを活用しないぶんには便利な命令ですが、varあり、varなし変数定義の例のようにJavaScriptを使って直接変数に格納できる方法を知ってしまうと、あまり使わなくなってくるコマンドかもしれません。保存した変数を参照するgetEvalコマンドやstoreEval、その他store系のコマンドで保存された変数を利用する場合もgetEvalコマンドが有効です。以下の例は、事前にあいさつ文を用意しておいて(1)、ページ内のOKボタンをクリック後(2)、姓名入力欄の情報を取得して一時保存し(3)(4)、入力された姓名文字列とあいさつ文を組み合わせて再度変数に格納(5)するテストケースです。storeValueコマンドを強引に使っているように見えますが、説明を分かりやすく表現してみた結果です。