seleniumをdockerで動かす

モチベーション

sanshonoki.hatenablog.com

約1年前、ジョブカンの工数入力するツールをseleniumを使って実装しました。

自分自身で今現在も使っていてかなり役立っていますが一つだけ課題がありました。

それは、chromeブラウザのバージョンがいつの間にか上がっていてchrome driverのバージョンと不適合ということでプログラムがエラーになり、その度にchrome driverをダウンロードし直す必要があるということでした。

ということで、その煩わしさから解放されるべくdockerコンテナを使ってseleniumを動かすことにしました。

最新版のchromeブラウザをインストールする場合

Dockerfileに下記2行でok

RUN apt-get -y update
RUN apt-get install -y chromium chromium-driver

chromedriver は /usr/bin/chromedriver にインストールされます

特定バージョンのchromeブラウザをインストールする場合

特定バージョンのchromeブラウザをインストールしたい場合は先程のように簡単にはいきません。 なぜなら apt-get install -y chromium だと最新版のchromeがインストールされてしまうからです

ただし、以下の記事で紹介されている Download older versions of Google Chrome for Windows, Linux and Mac というサイトから古いchromeブラウザのパッケージを入手して、インストール可能です。

qiita.com

Dockerfileは次のようになります。

RUN apt-get -y update

# Google Chrome dependencies
RUN apt-get install -y libasound2 libatk-bridge2.0-0 libatspi2.0-0 libdrm2 libgbm1 libgtk-3-0 libnspr4 libnss3 libxkbcommon0 libxshmfence1 xdg-utils fonts-liberation

# Google Chrome (specific version)
RUN wget -O /tmp/google-chrome-stable_current_amd64.deb https://www.slimjet.com/chrome/download-chrome.php?file=files%2F90.0.4430.72%2Fgoogle-chrome-stable_current_amd64.deb
RUN dpkg -i /tmp/google-chrome-stable_current_amd64.deb && rm /tmp/google-chrome-stable_current_amd64.deb

# ChromeDriver (specific version)
ADD https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip /opt/chrome/
RUN cd /opt/chrome/ && unzip chromedriver_linux64.zip

基本的に最新のセキュリティ対策がなされている最新バージョンを使うべきですが特定バージョンのchromeブラウザを使いたい場合は参考にしてください

headlessブラウザを使ったときのジョブカン固有の問題

これはジョブカンサイト固有の問題だと思われますが、headlessブラウザを使ったときになぜか挙動が違うという問題が発生しました。

通常ブラウザでのログイン後

headlessブラウザでのログイン後

画面から分かるようにheadlessブラウザだとメニューが畳まれた状態になってしまいます..

想定しているelementが見つからず element not interactable エラーが出ちゃいます

ググると以下のような記事が見つかったのでウインドウサイズの大きさを変えてみましたが変わりませんでした。 yuki.world

仕方ないのでメニューが畳まれているかを調べて、畳まれていたらメニューを開く操作をするようにしています。

コード

とりあえず、dockerベースでseleniumが動くようになり煩わしさから解放されました

github.com

別解?

毎回、MacOSchromeブラウザのバージョンを調べて、そのバージョンに合ったchromedriverを 公式ダウンロードサイト から自動でダウンロードしてくれば Docker使わなくてもいいんじゃ? と考えましたが難しそうでした

# chromeのバージョンを調べる
$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version
Google Chrome 101.0.4951.64

ただし、すべてのchromeのバージョンに対応したdriverがあるわけではありません...

https://chromedriver.storage.googleapis.com/101.0.4951.64/chromedriver_mac64.zip

にブラウザでアクセスすると NoSuchKey のエラー画面になります

chromedriveのダウンロードページは

となっていて、パッチバージョンまでピッタリなリンクは存在しません

ダウンロードページをWebスクレイピングしてメジャーバージョンだけがマッチするリンクを取り出せば何とかやれそうですがとても面倒くさそうです