DockerでSelenium Gridを構築してクロスブラウザテストを自動化する

皆さんこんにちは、4月で入社2年目になりました。
IoTインテグレーション事業部 開発部の阿部です。

本日は業務の中で、DockerとSelenium Gridを使用して自動クロスブラウザテストの環境構築をしたのでご紹介させていただきます。

ブラウザ上でのwebページ操作をスクリプトから行うためのツールであるSeleniumとSeleniumで実行される動作を管理するツールであるSelenium Gridを利用し、一つのテストスクリプトで複数のブラウザを自動でテストできるようにします。

Selenium Grid とは

複数マシンでテストを並行して実行し、様々なブラウザのバージョンとブラウザ構成を一元管理するツールです。

流れとしては、テストを実行したいブラウザを指定して、テストスクリプトを実行すると、hubがルーティングすることで登録されているnodeの中から適切なnodeに対して処理を振り分けます。

今回はDockerで以下の構成図のように構築していきます。

  • 自動テストスクリプトを実行するコンテナ(3)
  • hubを起動するコンテナ(1)
  • nodeを起動するコンテナ(3)

開発環境

WSL2を導入してその上にUbuntuをインストールし、Docker環境を構築してあります。
※Ubuntu上に入っているdockerdocker-composeのバージョンは、公式ドキュメントに書かれている手順で更新してあります。

  • Ubuntu : 20.04
  • Docker Desktop:3.3.1
  • Docker Engine : 20.10.6
  • Docker-compose : 1.29.1
  • Python:3.8

ディレクトリ構成

テストスクリプト作成

テストスクリプト(browser_test.py)はハブに接続して、ヘッドレスモードでブラウザを操作する処理をPythonで記述します。今回はエコモットのホームページにアクセスしたいと思います。

テストするブラウザによってRemote WebDriverのオプションを変更する必要があり、コンテナに設定する環境変数を利用して変更します。また、テストのエビデンスを残すために、テスト実行後の画面をスクリーンショットをして保存するフォルダを作成します。

Dockerfile作成

Selenium実行環境を用意するためにPythonのベースイメージを使用して、Seleniumをインストールします。

reqirements.txt作成

自動テストの様子をGUIで確認する場合は、VNC接続が必要になります。Edgeには用意されていませんが、ChromeとFirefoxにはVNCサーバーがインストールされているイメージが用意されているのでGUIで動作を確認することができます。しかし、VNCサーバーがインストールされているイメージはSeleniumのバージョンが3系でないと対応していないため、デバッグを行う際はSeleniumの3系をインストールしてバージョンを合わせる必要があります。動作確認をする際のviewerは、VNCviewerUltraVNCなどを利用します。

docker-compose.yml作成

Selenium実行環境と、Seleniumのハブ、ブラウザを起動するノードのコンテナを記述していきます。ハブとノードは、Seleniumが展開している公式のDockerイメージを使うと簡単に構築できます。

https://github.com/SeleniumHQ/docker-selenium

ノードのイメージは、既にブラウザとWebDriverがインストールされているので、ローカルで構築するときにバージョンを合わせないと動作しないという手間を省けます。

今回はChromeとFirefox、Edgeでテストをするために、Selenium実行環境とノードコンテナをそれぞれ3つ用意し、ハブと合わせて合計7つのコンテナを立ち上げます。また、VNC接続をしてデバッグを行う際は、ノードコンテナでVNC接続用ポート(5900)を解放する必要があります。

イメージ作成

作成したDockerfile, requirement.txt, docker-compose.ymlをもとにイメージをビルドします。

コンテナ起動

作成したイメージをもとにコンテナを作成して起動します。

テスト実行

立ち上がったSelenium実行環境のコンテナにシェルをアタッチし、Pythonを実行します。

以下のようなスクリーンショットを取ることができました。

Chrome

Firefox

Edge

 

また、毎回シェルをアタッチしてテストを実行するのは手間がかかり、コンテナ起動時にテストを自動実行させたいという場合もあると思います。
その場合はdocker-compose.ymlでSelenium実行環境の記述にentrypointを追加します。

シェルスクリプト(enrty_point.sh)の内容は以下のようになります。ここでハマったのですが、コンテナ起動直後にテストスクリプトを実行するとハブとノードが接続完了していない状態で処理が走り、エラーが出てしまうので、接続待機時間を設けるようにします。

テストが終了していることを確認したら、コンテナを終了し、削除します。

 

さいごに

自動化や属人性を排除するシステムを構築をすることが好きなのでとても楽しかったです。さらに発展させて、AWSを利用してコードをpushしたらクロスブラウザテストを自動で実行するようなCI環境を構築したいと思います。

参考資料

seleniumgrid 公式ドキュメント
https://www.selenium.dev/docmentation/en/grid/

Web UIテスト自動化の実行環境をSelenium Gridで
https://techblog.zozo.com/entry/qa-webui-test-automation-01