読者です 読者をやめる 読者になる 読者になる

つれづれなるままに。

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

selenese Tips その2

この記事はSelenium Advent Calendar 2013の23日目の記事です。

はじめに

スクリーンショットという操作はそれなりにコストのかかる操作です。
が、確認方法としては 百聞は一見に如かず で、これに勝る方法もなかなかありません。
で、必要なときだけスクリーンショットを撮る方法が無いものか・・・と言うところからスタートです。

その1:スクリーンショットコマンドを必要なところにすべて入れたスクリプトと入れていないスクリプトを作成する。
長所 作るの簡単
短所 メンテナンスしていけるか?!

その2:エクステンションを使って gotoif を使う
長所 スクリプトは1つですむ
短所 判断分/キャプチャー/ラベル の3行を記述することになる

その3:getEval内で キャプチャーコマンドを実行する
長所:1行ですむ
短所:できるのか?

調査:コマンドがあるか調べてみた。→あった→試してみた→エラーがでた
結論:スクリーンショットを保存するということはローカルPCに対してファイルアクセスをするということなので、特権階級でなければだめ という旨のエラーが・・・そりゃそうか。

その4:キャプチャーコマンドをseleneseとして実行するほかの手は?

と、たどった結果が以下のコマンド

<tr>
<td>getEval</td>
<td>
 var map = new UIMap();
 map.addPageset({
     name: 'allpage',
     description: 'All pages',
     pathRegexp: '(/.+)?'
 });

 var manager = new RollupManager();
 manager.addRollupRule({
     name: 'do_PageScreenshot',
     description: 'take page screenshot.',
     args: [{
         name: 'switch',
         description: 'debugswitch',
         exampleValues: [ 'on', 'off']
     }, {
         name: 'url',
         description: 'terget Page url'
     }]
    ,commandMatchers: {
     command:'captureEntirePageScreenshot',
     target: 'ss\.png$',
    }
 ,getExpandedCommands: function (args) {
     var timestmp = new Date().getTime();
     var commands=[];
     var filename = 'c:' + timestmp + '.png';
     if (args.switch) {
         if (args.url) {
             commands.push({
                 command: 'open'
                ,terget: args.url
                ,values: ''
             });
         }
         commands.push({
             command: 'captureEntirePageScreenshot',
             terget: filename,
             values: ''
         })
     };
     return commands;
 }
 });
</td>
<td></td>
</tr>
<tr>
 <td>rollup</td>
 <td>do_PageScreenshot</td>
 <td>url=,switch=ON</td>
</tr>

ほぼ日の目を見ていないと思われる UImapを使っています。
Javascriptのロジックを入れつつ、コマンドはSeleneseとして実行できます。
(descriptionが適当すぎるところは目をつぶってください)

さらにコマンドマッチャー部分をちゃんと記述すれば、これまでの既存のキャプチャーコマンド部もコマンドパネル右端の 赤い渦巻き模様のアイコンを使うことにより rollupに置換することも可能!

最後に

目標は一応達成しました。
が、SeleniumはWD版が主流になっているので IDE版であまりに作り込みすぎると、移行で大変なことになるのでほどほどに。。。。
(天丼ネタになってしまった・・・)