ls /asapon/blog

基本tech、時々多趣味

Selenium環境をDocker内で完結させる

はじめに

とある予約の申し込み作業が面倒になったので、ブラウザ自動操作のためSeleniumを採用しました。色々ローカルに入れるのもアレなので、Docker環境で完結させています。

構成

イメージ図は以下。

f:id:asaponseiten:20200113101912p:plain

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サーバへのアクセスは

  1. vnc://localhost:5900 にアクセスする
  2. パスワード secret を打つ

で大丈夫です。

公式イメージの使い方メモ

docker rundocker-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はテストで使うことが主ですが、ブラウザ操作の自動化は、結構捗る範囲が広いと思います。これで予約が楽になれば良いなぁ。