sauceLabsをつかってブラウザテストを自動化する

SauceLabs2.jpg

Sauce Labsというサービスがあって、WindowsやMac、iOSやAndroid等の各種OS上の各種ブラウザを仮想マシン上に立ち上げて、ブラウザ上でブラウザを操作することができるサービスです。
当初これがあればWindowsマシンを持ち歩かなくてもIE6のテストが出来るね!くらいの認識だったのですけど、説明を見ていると、どうやらSelenium WebDriver経由でユニットテストを実施することが本来の用途らしいので、コードをコミットしたら各種ブラウザでテストを実施してダメだったら教えてくれる環境というのを構築してみました。
selenium webdriverが登場した頃から、理屈の上ではできると言われていたテストですけど、あれこれの環境を個人で維持するのは現実的でないので、こういうのをサービスとして提供してくれるのは嬉しいですよね。

たとえばこういう、Google.comに行って検索した結果のページを表示するテストを実施するコードを用意して…

capsのところはSauce Labs: Supported Device, OS, and Browser Platformsからコピペすることが出来て、必要な設定に書き換えればMacのChromeでもWindowsXPのIE6でも、iOS7でもAndroidでも、任意のブラウザで同じテストを実施することが出来ます。

ということで、環境変数BROWSERでブラウザの種類を指定してunittestができる仕組みを作ってみました。

#Special thanks to Ruby-ML

通常の Test::Unit::TestCaseの代わりに SaucelabsTestCasePCを継承してテストを作れば、環境変数BROWSERで指定したブラウザでテストを実施することができるようになります。

$ env BROWSER=mac_chrome ruby pc/search.rb
Loaded suite pc/search
Started
.
Finished in 23.795709 seconds.
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
Test run options: --seed 21266
$ env BROWSER=win_ie6 ruby pc/search.rb
:

テスト結果はunittestとして成功失敗を判定する以外にも、Saucelabs上ではこのようにキャプチャ画像や動画として保存されているものを見ることも出来ます。

SauceLabs7.jpg
SauceLabs6.jpg

ここまでできれば、あとはいつもどおりにunittestを書いてjenkinsさんにお願いしておけば、コードをコミットするだけで各種ブラウザの動作確認をしてくれるようになりますね。すばらしい。

ちなみにSauce Labsは月額課金のサービスで、月一時間位までは無料で使うことが出来ます。
1テスト30sくらいで実行できるので、全部のテストを一度通してみるくらいなら無料でも行けるけれど、本当にコミットするたびに全テスト走らせるのであれば、$12のManual会員か、$49のAutomated会員くらいは必要になるかもしれないですね。
今これを書きながら気づいたのですけど、githubに公開してあるコードは無料でテストできるらしいです。Sauce Labs: OSS

[selenuim] target=”_blank”のリンクを開いて処理を続行する方法

photo by Enrico Capello

[selenium][warn] Link has target ‘_blank’, which is not supported in Selenium! – もぎゃろぐ
ということで、seleniumをつかって、target=”_blank”のリンクを開くことをごまかしてきたのですが、案の定、これではごまかせない話が出てきました。target=”_blank”のリンクを開いて更にその先でテストを続行したい場合にどうするか。

いろいろ考えた末、こんな手を思いつきました。

getEval s=window.document.getElementsByTagName('A');for(i=0;i<s.length;i++){s[i].target='_self';}

問題になるクリック処理の一個手前で、こんなのを実行します。
このコマンドは、JavaScriptを走らせて、全てのリンクのtargetを”_self”に書き換えてしまいます。
結果としてリンク先は同じウィンドウで開くので、そのままテストを続行することができます。