概要
前回 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 件のコメント:
コメントを投稿