Selenium Tips
この記事はSelenium Advent Calendar 2013の20日目の記事です。
seleneseの変数
seleniumIDEでの変数は store系のコマンドを使用することで値をセットすることができます。
で、これをつかうのが ${hensuu}という表記です。
さてSeleniumIDEというのは別の見方をすると、
ブラウザと異なる Javascript環境があり、ここから(ブラウザ内のDOMに対して)コマンド実行(操作)しているともいえます。
では、IDEであるJavaScript環境において先の変数はどこに保管されているのか?
これは storedVars というオブジェクトになります。このオブジェクトのプロパティとして保持されています。
なので、Store系で保存した値を getEval系のコマンドで記述する Javascriptから使用することも可能ということです。
具体的なコードを載せます。
<tr> <td>storeTitle</td> <td>idevar</td> <td></td> </tr> <tr> <td>echo</td> <td>${idevar}</td> <td></td> </tr> <tr> <td>getEval</td> <td>alert(storedVars.idevar)</td> <td></td> </tr> <tr> <td>getEval</td> <td>storedVars.jsvar="selevar";</td> <td></td> </tr> <tr> <td>echo</td> <td>${jsvar}</td> <td></td> </tr>
これを実行するとわかりますが、
storeTitleコマンドで IDEの変数にページタイトルを設定
echo コマンドで それがセットされていることがわかります。
getEal コマンドで それをJavaScriptで表示しています。
次の getEval コマンドでは JavaScript側で storedVarsオブジェクトのプロパティーに設定
それを echoコマンドを使用し IDE側からアクセスしています。
これができる意味は、テスト対象ページから値を取得し、JavaScriptで処理をする
JavaScript側で処理した値をテスト対象ページに反映させる(入力値を作る場合などがこれにあたりますね)
などなど。
ちなみに storedVars['idevar'] という書き方と storedVars.idevar は同じ意味なのですが、後者の書き方をしているところを見たことがありません。
個人的には入力のしやすさから、後者を使っているのですが、まずい点があるのでしたらどなたかご指摘ください・・・・
関数
変数に収録する値が動的な場合、例えば日時ですね。この場合
<tr> <td>storeEval</td> <td>new Date().getTime();</td> <td>runtime</td> </tr> <tr> <td>echo</td> <td>${runtime}</td> <td></td> </tr>
とすれば取得できます。
これを何度も使用することになるのであれば、やはりまとめたいところ。
<tr> <td>getEval</td> <td> storedVars.getDatetime=function() { var date = new Date(); var y = date.getFullYear(); var m = date.getMonth() + 1; var d = date.getDate(); var w = date.getDay(); m = ('0' + m).slice(-2); d = ('0' + d).slice(-2); return y + '/' + m + '/' + d; } </td> <td></td> </tr> <tr> <td>storeEval</td> <td>storedVars.getDatetime();</td> <td>rundate</td> </tr> <tr> <td>echo</td> <td>${rundate}</td> <td></td> </tr> <tr> <td>storeEval</td> <td>${getDatetime}</td> <td>rundate2</td> </tr> <tr> <td>echo</td> <td>${rundate2}</td> <td></td> </tr>
この辺りSeleneseというよりもJavascriptになってしまいますね。
Sjax
Selenium IDEにはprototype.js が組み込まれています。
先ほども書きましたが、IDEはテスト対象となるブラウザと異なる環境で動作するので いわゆる「$()」系は使えないのですが、関数などは利用することができます。
例えば、Ajax関数を使う場合
<tr> <td>getEval</td> <td> storedVars.ajax= function(url){ var req = new Ajax.Request( url, { method : 'get', asynchronous:false, onSuccess : function( transport ) { }, onFailure : function( transport ) { }, onException : function( transport, ex ) { } } ) return req.transport.responseTEXT; } </td> <td></td> </tr> <tr> <td>getEval</td> <td>var resultText = storedVars.ajax("http://xxxx.xxxx.xxx/xxxx");</td> <td></td> </tr>
非同期で呼び出すのではなく、同期モードで使用していますので返り値は req.transpot でとらえています。
パラメータとして チェックリスト番号を渡すと、サーバからテスト期待値を返す と言ったテスト環境も考えられますね。
最後に
SeleniumはWD版が主流になっているので IDE版であまりに作り込みすぎると、移行で大変なことになるのでほどほどに。。。。