ボタン2度押しコマンド

セキュリティ対応の一環でsubmitボタン2度押し対策ができてるか試験するためにボタン2度押しコマンドがあるとよいだろうと。
clickコマンドを元にして、clickTwiceコマンドを一応作った。

/*
 * Click Twice on the located element, and attach a callback to notify
 * when the page is reloaded.
 */
Selenium.prototype.doClickTwice = function(locator) {
    var element = this.page().findElement(locator);
    this.page().clickElement(element);
    this.page().clickElement(element);
};

元のclickコマンドにthis.page().clickElement(element);を一行加えただけ(笑)
実は、本家HPのコマンドリファレンスに「openとclickはデフォルトでページローディングを待ちます」って書いてあったから、clickコマンド+clickAndWaitコマンドでは用が足りない?と思ったのがこのコマンド作ろうと思った背景なんだけど、開発チームの人に確認してみたらopenだけだった(笑)
ので、、click+clickAndWaitで用は足りそう。

でも、click+clickAndWaitだとfindElementを余計に呼ぶことになるからclickTwiceの方が早いかも?(せっかく作ったから計測してみよう)
clickTwice内の各メソッド前後にgetTimeを埋めてみる。

/*
 * Click Twice on the located element, and attach a callback to notify
 * when the page is reloaded.
 */
Selenium.prototype.doClickTwice = function(locator) {

  LOG.debug("before findElement:" + new Date().getTime() );
    var element = this.page().findElement(locator);
  LOG.debug("after  findElement:" + new Date().getTime() );
    this.page().clickElement(element);
  LOG.debug("after clickElement:" + new Date().getTime() );
    this.page().clickElement(element);
  LOG.debug("after clickElement:" + new Date().getTime() );
};

結果。

項目 1回目 2回目 3回目 4回目 5回目
before findElement 1147156868828 1147157113031 1147157231875 1147157298609 1147157349937
after findElement 1147156868828 1147157113031 1147157231875 1147157298609 1147157349937
after clickElement 1147156868859 1147157113046 1147157231890 1147157298625 1147157349953
after clickElement 1147156868890 1147157113078 1147157231921 1147157298656 1147157349984

で、、

項目 1回目 2回目 3回目 4回目 5回目 AVG
findElement 0 0 0 0 0 0
clickElement1 31 15 15 16 16 19
clickElement2 31 32 31 31 31 31

というわけでfindElementにはほぼ時間かかってない。。

じゃあ。。clickTwiceAndWaitとclick+clickAndWaitのターンアラウンドタイムを計ってみよう。
時間出力用のコマンドを作って、、 引数のコメントも一緒に出力と。

// output timestamp for debugging 
Selenium.prototype.doOutputTime = function(text) {
  LOG.info(text + " : " + new Date().getTime() );
};

テストケースの方では計測したいコマンドの前後をこいつで挟む、と。

<tr>
	<td>outputTime</td>
	<td>before clickTwice</td>
	<td></td>
</tr>

<tr>
	<td>clickTwiceAndWait</td>
	<td>//input[@value='削除']</td>
	<td></td>
</tr>
<!-- 
<tr>
	<td>click</td>
	<td>//input[@value='削除']</td>
	<td></td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>//input[@value='削除']</td>
	<td></td>
</tr>
-->

<tr>
	<td>outputTime</td>
	<td>after clickTwice</td>
	<td></td>
</tr>

結果。

command 1回目 2回目 3回目 4回目 5回目 6回目 7回目 8回目 9回目 10回目 AVG
clickTwiceAndWait 125 172 203 171 172 141 156 156 140 188 162.4
click+clickAndWait 141 125 125 125 125 140 172 187 125 203 146.8

うーむ。clickTwiceの方が平均で15.6msec速い。。。 15.6msecかぁ。なんか微妙w
ま、一応あってもいいかな、くらい。
ミーティングで採用するかどうか決めよう。