Selenium環境をDocker内で完結させる
はじめに
とある予約の申し込み作業が面倒になったので、ブラウザ自動操作のためSeleniumを採用しました。色々ローカルに入れるのもアレなので、Docker環境で完結させています。
構成
イメージ図は以下。
docker-compose.yml
以下のようになります。
version: "3" services: ruby: build: . volumes: - .:/var/app depends_on: - chrome chrome: image: "selenium/standalone-chrome-debug:latest ports: - "4444:4444" - "5900:5900" volumes: - /dev/shm:/dev/shm
Seleniumコンテナ
Standalone か Grid か
SeleniumHQ/docker-selenium
の公式イメージを使います。
この公式イメージは大きく、 Standalone
タイプと Grid
タイプに分かれます。テストのときに、複数のOS・ブラウザ環境が欲しいかどうかで決まります。
今回は、ただのバッチ処理(予約のための操作自動化)の用途でSeleniumを使うため、複数ブラウザ環境は必要ありません。 Standalone
タイプのイメージを使います。
debug か否か
Standalone
タイプでも更に、 debug
か否か、タイプ分けすることができます。
debug
とついているイメージは、VNCサーバーを起動することができます。VNCを使うことで、実際にブラウザが立ち上がって動作が完結するまで、処理の動きを目で追うことができます。
今回はselenium/standalone-chrome-debugを使いましたが、ここはお好みで良いと思います。
ちなみに、VNCサーバへのアクセスは
- vnc://localhost:5900 にアクセスする
- パスワード
secret
を打つ
で大丈夫です。
公式イメージの使い方メモ
docker run
や docker-compose up
といった起動コマンド時に、/dev/shm:/dev/shm
とマウントする必要があります。
docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:3.141.59-yttrium
もしくは --shm-size=2g
と、ホストのメモリ領域を使うために、フラグ立てをする必要があります。
docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome:3.141.59-yttrium
Rubyコンテナ
クライアントを実行できる環境があれば、問題ないです。
# Gemfile gem 'selenium-webdriver'
selenium-webdriver gem を使う
参考リンクは以下になります。
またSeleniumコンテナにアクセスできるよう、localhost
ではなく、 docker-compose.yml
で指定したホスト名を使います。
url = 'http://chrome:4444/wd/hub' @driver = Selenium::WebDriver.for(:remote, url: url, desired_capabilities: :chrome)
wd/hub
は、Selenium Hubコンソールへのリンクです。
疎通確認する
docker-compose run --rm ruby irb
として確認(不必要な返り値は省略しています)。
irb(main):001:0> require 'selenium-webdriver' irb(main):002:0> driver = Selenium::WebDriver.for(:remote, url: 'http://chrome:4444/wd/hub', desired_capabilities: :chrome) irb(main):003:0> driver.get('https://www.google.com/?hl=ja') irb(main):004:0> driver.title => "Google"
おわりに
Seleniumはテストで使うことが主ですが、ブラウザ操作の自動化は、結構捗る範囲が広いと思います。これで予約が楽になれば良いなぁ。