2018年2月9日金曜日

selenium-docker を使ってみた

概要

前回 Ruby で Selenium を使って firefox の自動操作をしてみました
その際にローカル上に selenium-server を立てて geckodriver で操作しました
ローカルで実行する場合いろいろとセットアップが面倒です
そこで selenium docker を使うとその辺の面倒なセットアップが不要になります

環境

  • macOS 10.13.2
  • Ruby 2.4.1p111
  • selenium-webdriver 3.9.0
  • docker 18.02.0-ce-rc2
  • docker-compose 1.19.0-rc2

selenium docker の起動

これだけで selenium server が立ちます

  • docker run -d -p 4444:4444 --shm-size 2g selenium/standalone-firefox:3.8.1-francium

4444 ポートで LISTEN していることを確認してください

  • docker ps
CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
b54c3c9b5497        selenium/standalone-firefox:3.8.1-francium   "/opt/bin/entry_poin…"   55 seconds ago      Up About a minute   0.0.0.0:4444->4444/tcp   modest_bhaskara

あとはここに対して selenium を使ったテストコードを書くだけです

テストコード

前回とほぼ同じです
:remote, url: "http://localhost:4444/wd/hub" の指定が増えています

  • vim access_google.rb
require "selenium-webdriver"

driver = Selenium::WebDriver.for :remote, url: "http://localhost:4444/wd/hub", desired_capabilities: :firefox
driver.navigate.to "http://google.com"

element = driver.find_element(name: 'q')
element.send_keys "Hello WebDriver!"
element.submit

sleep 10

puts driver.title

driver.quit

こんな感じです

  • bundle exec ruby access_google.rb

ブラウザがコンテナ内で立ち上がっているのでローカル側では立ち上がらないと思います

  • docker logs -f modest_bhaskara

で selenium server のログを確認していると流れると思います

テストも docker 内で実行する

こうなるとテストも docker 内で実行したくなります
やってみましょう

  • vim Dockerfile
FROM ruby

ADD . /home
WORKDIR /home
RUN bundle install --path vendor

CMD ["bundle", "exec", "ruby", "access_google.rb"]

テストコードも書き換えます
Selenium サーバのホスト名を環境変数で指定できるようにします

  • vim google_access.rb
require "selenium-webdriver"

host = ENV['SELENIUM_SERVER'] || 'localhost'
driver = Selenium::WebDriver.for :remote, url: "http://#{host}:4444/wd/hub", desired_capabilities: :firefox
driver.navigate.to "http://google.com"

element = driver.find_element(name: 'q')
element.send_keys "Hello WebDriver!"
element.submit

sleep 10

puts driver.title

driver.quit

Selenium サーバとテストが同時に上がるように docker-compose を作成します

  • vim docker-compose.yml
version: '3'
services:
  test:
    build: .
    links:
      - server
    environment:
      - SELENIUM_SERVER=server
  server:
    image: selenium/standalone-firefox:3.8.1-francium
    ports:
      - 4444:4444
    shm_size: '2gb'

これで実行してみましょう

  • docker-compose up -d

サーバとテストが同時に立ち上がりテストが実行されます

  • docker-compose logs test

でログを確認すると puts している内容が表示されると思います

Attaching to selenium_test_1
test_1    | Hello WebDriver! - Google 検索

初回 up 時に server 側がまだ起動していなくてエラーになる場合は再度テストだけを実行してみてください

  • docker-compose start test

おまけ: VNC を使ってブラウザの様子を確認する

selenium/standalone-firefox-debug のイメージに切り替えるだけです

  • docker run -d -p 4444:4444 -p 5900:5900 --shm-size 2g selenium/standalone-firefox-debug:3.8.1-francium

立ち上がったら適当な VNC Viewer を使って localhost:5900 に接続します
ユーザ名はなくパスワードに「secret」と入力すれば接続できます

試しにテストを実行すると firefox が問題なく起動するのが確認できました

最後に

selenium docker を使って selenium でテストする環境を docker 上に構築してみました
セットアップが不要なのもありますし、VNC でデバッグもできるのでこれを使うほうが断然良いと思います

参考サイト

0 件のコメント:

コメントを投稿