SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「日本Seleniumユーザーコミュニティ」のエキスパートが教えるSelenium最新事情

DockerでSelenium Gridを構築して複数マシンのブラウザ自動テストを行う


Zaleniumを使ったSelenium Gridの構築

 このように公式から配布されているDockerイメージを利用したSelenium Gridの構築方法を紹介しました。次は、筆者が現在注目しているZaleniumを使ったSelenium Grid構築について紹介します。

 Zaleniumは以下のような特長があります。

  • Selenium nodeのオートスケール
  • ブラウザ動作動画をSelenium Gridの管理コンソール上からのライブで確認できる
  • ブラウザ動作動画の録画機能
    • 撮影された動画をドライバのログと合わせてWeb上で一覧できるダッシュボードという機能があります
  • DockerのイメージとしてサポートされてないブラウザをSauceLabsBrowserStackのようなクロスブラウザテスト支援ツールと連携して利用可能

 では、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のロゴが表示されています。

Zaleniumのコンソール
Zaleniumのコンソール

 このライブプレビューの様子を確認するため、例えば以下のようなスクリプトを実行してみましょう。ライブプレビューなのでインタラクティブに動作を確認できるといいので、irbpryのような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)
Zalenium Live Preview
Zalenium Live Preview

 また、「Interact via VNC」というリンクを開くと、ブラウザ上でVNCが実行できます。公式のSeleniumのDockerイメージとは異なり、VNCクライアントが必要なく、ブラウザ上で動作確認やデバッグができます。

ダッシュボードでビデオとログをみる

 ブラウザの動作状況が即座にライブプレビューできるということを確認したらdriver.quitして、Seleniumのセッションを終了しましょう。

 すると、しばらくすると(ビデオのエンコーディングの待ち時間なので多少時間はかかります)、http://localhost:4444/dashboardからブラウザを動かしているビデオと図のようにその時のSeleniumのログが確認することができます。

Zalenium Dashboard
Zalenium Dashboard

 このとき、(a)で指定した名前によりビデオに名前がついております。

 また、Dockerホストの/tmp/videosをマウントしてZaleniumを起動してあるので、/tmp/videos/zalenium_hello_zalenium_chrome_LINUX_{timestamp}.mp4というようなファイル名で保存されていることも確認できます。

 当然ですが、ビデオのエンコーディングはCPUパワーを使います。Zaleniumのパフォーマンス測定結果をみると、ビデオ録画を有効にした状態で大量の並列テストを行うと動作が不安定になることが確認されています。

 Zaleniumは起動時のオプションで、--videoRecordingEnabled falseとすると、デフォルトではビデオ録画しなくなります。

 このとき、先程のサンプルスクリプトの(b)のようにcapabilityのrecordVideotrueにすると録画するようになります。

 デフォルトではビデオ録画はしない設定にしておいて、例えば、重要なテストや安定しないテストのときだけ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ライフを!

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
「日本Seleniumユーザーコミュニティ」のエキスパートが教えるSelenium最新事情連載記事一覧

もっと読む

この記事の著者

沖田 邦夫(オキタ クニオ)

 精密機器メーカーにて新規事業開発のAPI・インフラ・システムアーキテクチャの設計・開発・テストを一通り経験後にDeNAに入社。 現在はテストエンジニアリングを担う部署であるSWET(Software Engineer in Test)グループのリーダー。 「Selenium実践入門」の共同執筆、雑誌「Web+DB PRESS」への寄稿も行っている。 Twitter:@okitan github:https://github.com/okitan

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10471 2017/12/19 14:57

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー