はじめに
こんにちは、白川です。
Webアプリケーションは概ね、複数のブラウザに対応する必要があります。
Internet Explorer、Firefox、ChromeなどのPCブラウザだけでなく、
iPhoneやAndroidなどのモバイル/タブレットのブラウザにも対応しないといけなかったり、
同じブラウザでも複数のバージョンに対応する必要があったり、
OSのバージョンの違いにも対応する必要があったりします。
そうなってくると、テストが大変です。
検証が必要なOSとブラウザとバージョンの組合せが増えれば増えるほど、手動でテストを行なうことが大変になっていきます。
しかし、Selenium Gridを使えば、
一つのテストスクリプトで複数の実機のブラウザで自動にテストを実施することが可能となります。
Selenium Gridについて
テストスクリプトを実行するサーバからSelenium Grid Server(Hub)に対して、
このOSのこのバージョンのブラウザでテスト実施したい、という依頼を投げると、
Selenium Grid Server(Hub)が登録されているNodeの中から適切なNodeに対して処理を振り分けする、という流れになります。
今回は、Selenium Grid Server(Hub)とNodeを立てて、
ブラウザを起動させてスクリーンショットを保存するところまで試してみました。
環境
以下、実際に試してみた環境です。
■ Selenium Grid Server(Hub)
・OS:CentOS6.6 64bit
・Java:1.7.0_71
■ Node
・OS:Windows8.1 64bit
・java:1.8_40
・Internet Explorer:11.0
・Firefox:36.0
・Chrome:42.0
■ テストスクリプト実行サーバ
・OS:CentOS6.6 64bit
・ruby:2.1.1
・Rails:4.1.1
・Bundler:1.7.12
・selenium-webdriver:2.43.0
Selenium Grid Server(Hub)の立て方
まず、Hubにしたいサーバに以下のURLからselenium-server-standalone-2.45.0.jarをダウンロードします。
http://docs.seleniumhq.org/download/
ダウンロード後、下記コマンドでSelenium ServerをHubとして起動します。
下記URLにアクセスすると、Gridコンソールというものが表示されます。
http://[Selenium Grid ServerのIPアドレス]:4444/grid/console
本来であればGridに登録されたNodeが一覧表示されるはずですが、
この時点ではNodeは1台も存在していないので、何も表示されません。
Nodeの立て方
Selenium Grid Server(Hub)と同様にNodeとなる端末に
selenium-server-standalone-2.45.0.jarをダウンロードします。
jsonでNodeの設定ファイルを作成します。
設定ファイルにはブラウザの種類とGridのURLを記載して、ファイル名をnode.jsonとして上記jarと同じディレクトリに保存します。
Firefoxは別途ドライバ無しでもテスト実行できるのですが、
Chrome、Internet Explorerでテストをしたい場合は、それぞれドライバをselenium-server-standalone-2.45.0.jarと同じディレクトリにダウンロードします。
■ Chrome
http://chromedriver.storage.googleapis.com/index.html?path=2.15/
■ Internet Explorer
http://selenium-release.storage.googleapis.com/index.html?path=2.45/
私の環境は64bitなので、64bitバージョンのドライバをダウンロードします。
あと、Internet Explorerでテストする場合、
ツール>インターネットオプションの中のセキュリティタブで、
すべてのゾーンの「保護モードを有効にする」を統一する必要があります。
また、Internet Explorer11の場合のみですが、
Selenium WebDriverを動かそうとすると、「Unable to get browser」というエラーが発生します。
Issue 6511: IE11 exceptions with IEDriverServer: Unable to get browser
上記のエラーはレジストリをいじることで回避できます。
64bitのWindowsの場合、"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE"というキーで"iexplore.exe"という名前にDWORDで0の値を設定することで、動作するようになりました。
32bitの場合は、"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE"というキーでレジストリを登録すれば動くようです。
準備ができたので、下記コマンドでSelenium ServerをNodeとして起動します。
この時点で、Selenium Grid ServerにNodeが登録されました。
下記にアクセスすると、1台のNodeが登録されていて、
Internet Explorer、Firefox、Chromeの3つのDriverが使用できることが分かります。
http://[Selenium Grid ServerのIPアドレス]:4444/grid/console
Nodeを追加する場合は、
別のNodeにしたい端末で同じようなことをしてあげればOKです。
テストスクリプトの作成
テストスクリプトはJavaやJavaScript、Pythonなどでも記述することが可能ですが、
今回はRubyで作成します。
まず、railsのルートディレクトリに移動して、Gemfileに下記を追加します。
追加後、下記コマンドを実行します。
テストスクリプトを作成して、spec/features/selenium_spec.rbとして保存します。
テストスクリプトが作成できたので、テストを実行します。
下記コマンドを実行すると、Nodeのブラウザが自動で起動して操作が始まります。
ブラウザ指定のみ行っていますが、
以下のようにOSやブラウザのバージョン指定することも可能です。
下図は、テストスクリプトを実行して取得したスクリーンショットです。
残念なことにChromeだけ途中で切れてしまっています・・・
以下を見ると、ChromeDriverの不具合のようですが、現時点では修正されていないようです。
このあたりどうするかは課題だと思います。
https://code.google.com/p/chromedriver/issues/detail?id=294
終わりに
一つのテストスクリプトで複数の実機ブラウザの自動テストが繰り返し出来るので、
上手く使いこなせることができれば、実機テストが非常に楽になるのでは、という印象です。
あと、iPhoneやAndroidなどのモバイルやタブレットなどの実機もNodeとして扱えるはずなのですが、
現時点では試せていないので、またの機会にご紹介できればと思います。