Zaleniumを使ったSelenium Gridの構築
このように公式から配布されているDockerイメージを利用したSelenium Gridの構築方法を紹介しました。次は、筆者が現在注目しているZaleniumを使ったSelenium Grid構築について紹介します。
Zaleniumは以下のような特長があります。
- Selenium nodeのオートスケール
- ブラウザ動作動画をSelenium Gridの管理コンソール上からのライブで確認できる
-
ブラウザ動作動画の録画機能
- 撮影された動画をドライバのログと合わせてWeb上で一覧できるダッシュボードという機能があります
- DockerのイメージとしてサポートされてないブラウザをSauceLabsやBrowserStackのようなクロスブラウザテスト支援ツールと連携して利用可能
では、Zaleniumを使ったSelenium Gridの構築方法を見ていきながら、Zaleniumの特長を詳しく紹介していきたいと思います。
Zaleniumの起動
Zaleniumは公式のDocker Seleniumノードではなく、elgalu/docker-seleniumを利用しています。ブラウザ動作動画の録画機能等はこのelgalu/docker-seleniumにより実現されています。
$ docker pull elgalu/selenium:3.6.0-p2
$ docker pull dosel/zalenium:3.6.0b
$ docker run --rm -d --name zalenium -p 4444:4444 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/videos:/home/seluser/videos \
--privileged dosel/zalenium:3.6.0b start --chromeContainers 1 --firefoxContainers 0
docker runに指定しているオプションを簡単に説明すると、Zaleniumはコンテナ内の/home/seluser/videosに録画したビデオを保存しますので、Dockerをホストしている環境の/tmp/videosをそこにマウントすることで、Dockerホスト側にビデオを保存するようにしています。
また、--chromeContainers 1 --firefoxContainers 0はZaleniumの起動時に立ち上げるnodeの数を指定しています。今回の例ではFirefoxは利用しないので0にしています。
Zaleniumのライブプレビューをみる
Zaleniumが立ち上がったら、http://localhost:4444/grid/admin/liveにアクセスすると、図のようにchromeのコンテナが1つ起動していることが確認できます。現在、コンテナのSeleniumノードは利用されていないためZaleniumのロゴが表示されています。
このライブプレビューの様子を確認するため、例えば以下のようなスクリプトを実行してみましょう。ライブプレビューなのでインタラクティブに動作を確認できるといいので、irbやpryのようなREPL(対話型評価環境)で実行してみるとよいでしょう。
スクリプトの(1)の行を実行した後にライブプレビュー画面にアクセスすると、パスワードが求められます(secretと入力してください)。パスワードを入力すると、図のようにブラウザの状況がライブで確認することができます。(2)の行のように好きにブラウザを動かしてみてください。
require "selenium-webdriver"
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
"name" => "hello zalenium", # (a)
"recordVideo" => true # (b)
)
driver = Selenium::WebDriver.for(:remote, # (1)
url: "http://localhost:4444/wd/hub",
desired_capabilities: caps
)
# あとはブラウザを好きに操作してください
driver.get("http://www.selenium.jp/") # (2)
また、「Interact via VNC」というリンクを開くと、ブラウザ上でVNCが実行できます。公式のSeleniumのDockerイメージとは異なり、VNCクライアントが必要なく、ブラウザ上で動作確認やデバッグができます。
ダッシュボードでビデオとログをみる
ブラウザの動作状況が即座にライブプレビューできるということを確認したらdriver.quitして、Seleniumのセッションを終了しましょう。
すると、しばらくすると(ビデオのエンコーディングの待ち時間なので多少時間はかかります)、http://localhost:4444/dashboardからブラウザを動かしているビデオと図のようにその時のSeleniumのログが確認することができます。
このとき、(a)で指定した名前によりビデオに名前がついております。
また、Dockerホストの/tmp/videosをマウントしてZaleniumを起動してあるので、/tmp/videos/zalenium_hello_zalenium_chrome_LINUX_{timestamp}.mp4というようなファイル名で保存されていることも確認できます。
当然ですが、ビデオのエンコーディングはCPUパワーを使います。Zaleniumのパフォーマンス測定結果をみると、ビデオ録画を有効にした状態で大量の並列テストを行うと動作が不安定になることが確認されています。
Zaleniumは起動時のオプションで、--videoRecordingEnabled falseとすると、デフォルトではビデオ録画しなくなります。
このとき、先程のサンプルスクリプトの(b)のようにcapabilityのrecordVideoをtrueにすると録画するようになります。
デフォルトではビデオ録画はしない設定にしておいて、例えば、重要なテストや安定しないテストのときだけcapabilityから録画を指定するようにするとよいでしょう。
ノードのライフサイクル
Zaleniumはデフォルトでは1度利用したノードは停止させ、必要になったらコンテナを起動するというような動きをします。
したがって、これまで行った動作確認によりノードが停止されたので、Selenium Gridのコンソールやライブプレビュー画面をみると、ノードがつながっていないことがわかります。
この状態で先程のスクリプトを実行しようとすると、起動しているコンテナがない場合(1)が5秒ほど(コンテナが立ち上がる時間でもちろん環境により異なります)待たされることになりますが、スクリプトは問題なく動作します。
オートスケールの使い所
このようにZaleniumはオンデマンドでノードのコンテナを追加することができるため、GKE(Google Container Engine)のようなクラウドコンテナサービスと組み合わせると特に効果を発揮します。
まだbeta状態ですが、Zaleniumはこれまでに紹介してきたDockerによるコンテナ管理をする方法以外にKubernetesを使ってコンテナ管理する方法もあります。
Kubernetesを使って簡単にGKE上でオートスケールするSelenium Gridを安価に構築することが可能となります。
まとめ
Dockerの登場により、いろいろなソフトウェアの環境構築が簡単になり、大規模なSelenium Gridの構築も非常に簡単になったので、これを利用したブラウザの並列性の高いテスト環境も簡単に構築できるようになりました。
さらにZaleniumのような並列度以外にもCIの運用上役に立つような機能が追加されたソフトウェアを利用することにより、より効果的なCIの管理ができるようになってきています。
それでは楽しいSeleniumライフを!
