Docker をつかって Selenium を動かしてみる!

こちらの記事は前回からの続きになります。

baubaubau.hatenablog.com

前回はSeleniumのローカルマシン上での実行について簡単なサンプルを作ってみました。今回はDockerを使ってSeleniumを動作させてみたいなと思います。

Dockerを使ってSeleniumを動作させることで、ブラウザのバージョン差異やその他のローカル環境に依存しないコードを実装することができます。実行環境をローカルの開発環境と分離し、再現性を高く保つことはエンジニアの中で常識になってきているのでSeleniumを動作させるときも同じようにするほうが良いのではないかと思います。

リモートでブラウザを操作するには?

Docker で Selenium を動作させることは、リモートでブラウザを操作することとほとんど同じことです。

Selenium はローカルにインストールされているブラウザだけではなく、リモートのブラウザの操作を自動化することもできます。リモートのブラウザの操作を行うには Selenium Server と呼ばれるサーバーを用意し、そのサーバーへ WebDriver が接続しに行くようにすればその後は今までと変わらずに動作させることができます。以下にSeleniumを動作させるときの構成が複数載っています。

WebDriver が Selenium Server に接続するには RemoteWebDriver というものを使います。RemoteWebDriver は WebDriver の実装クラスになっています。以下にRemoteWebDriverの使い方が載っています。

例えば http://example.comSelenium Server が起動しているときに、RemoteWebDriver では以下のようにURLを指定することで接続する事ができます。

RemoteWebDriver(URL("http://example.com"), options)

Selenium を Docker で実行させるには?

Selenium を Docker で実行するイメージはこんな感じになります。ローカルで動作させるプログラムはほとんど変わらず、ただRemoteWebDriverを使って接続しに行くだけになりますね。

f:id:bau1537:20191224152606j:plain

Selenium Docker を Pull & Run する

Seleniumは公式でDockerイメージを提供していますのでこちらを使っていきたいと思います。公式のイメージはかなり充実していてPull & Run することですぐに使い始めることができました。Dockerイメージに代表的なブラウザのインストールまでされているので基本的な使い方をする上では詳しくカスタマイズする必要がないかと感じました。

以下のGitHubページに公式が用意しているイメージとその使い方が載っています。

github.com

今回はChromeで実行の様子を確認したかったので standalone-chrome-debug を使いました。

以下のコマンドでコンテナを起動します。

docker run -d -p 4444:4444 -p 5900:5900 -v /dev/shm:/dev/shm selenium/standalone-chrome-debug

4444ポートはSelenium Serverに接続するもので、5900はVNCに接続するものです。VNCを使うことでコンテナ内で動いているChromeを見ることができます。macOSの場合はFinderから移動 > サーバーへ接続で接続することができます。パスワードが要求されますがデフォルトでは「secret」に設定されています。

Selenium を Docker で実行する

上記のDockerコンテナが動いている状態で、以下のコードを実行させたところうまく動きました。

 ちなみに、VNCで接続するとこんな感じでブラウザの動作を確認できます。

 

f:id:bau1537:20191227112849p:plain