つれづれなるままに。

webテストの自動化について備忘録のつもりで書いています

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版であまりに作り込みすぎると、移行で大変なことになるのでほどほどに。。。。