Ruby界隈ではSeleniumを動かすネタが少ないので、最近作った環境について書いておこうと思う。
ChromiumとChromiumDriverを追加済みのDockerfileを作る
巷ではChromeとChromeDriverのバイナリーをcurl等でダウンロードしてインストールする方法が一般的だが、バージョンを合わせる必要があったり上手く動かなかったりとハマりがちだったりする。その点、DebianベースのLinuxにChromiumとChromiumDriverの組み合わせであればaptから簡単にインストールすることができる。RubyのDockerイメージも多くがDebianベースなので、以下の例のように簡潔な書き方ができる。
#
# Builder
#
FROM ruby:3.3.5-slim as builder
ENV TZ=Asia/Tokyo
WORKDIR /opt/project
COPY Gemfile Gemfile.lock ./
RUN apt-get update && \
apt-get install -y \
g++ \
gcc \
make
RUN bundle install
#
# Main
#
FROM ruby:3.3.5-slim
ENV TZ=Asia/Tokyo
ENV RAILS_ENV=production
ENV RAILS_LOG_TO_STDOUT=1
WORKDIR /opt/project
COPY --from=builder /usr/local/bundle /usr/local/bundle
COPY . .
RUN apt-get update && \
apt-get install -y \
chromium \
chromium-driver
CMD ["sleep", "infinity"]
CapybaraからSeleniumを操作する
あとはGemfileに capybara と selenium-webdriver を追加しておき、以下のようなCapybaraの設定ファイルを用意すれば良い感じにSeleniumを動かすことができる。
# frozen_string_literal: true require 'capybara' require 'selenium-webdriver' Capybara.register_driver :chromium do |app| version = Capybara::Selenium::Driver.load_selenium capabilities_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options capabilities = ::Selenium::WebDriver::Chrome::Options.new.tap do |options| options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--window-size=1280x960') options.add_argument('--disable-infobars') options.add_argument('--disable-extensions') options.add_argument('--single-process') options.add_argument('--disable-dev-shm-usage') options.add_argument('--homedir=/tmp') end Capybara::Selenium::Driver.new(app, browser: :chrome, service: Selenium::WebDriver::Service.chrome, capabilities_key => capabilities, timeout: 120) end