概要
Ruby環境でseleniumGridを利用した際、プログラム実行時にエラーが発生する問題が発生したため、暫定的な回避策を記録しておきます。
実行環境
- Ruby 2.3.3
- Docker 17.06.0-ce-mac18 (18433)
Selenium
- selenium-webdriver 3.4.3 (執筆時点の最新版)
- selenium Grid 3.4.0
補足
- SeleniumGrid(Hub/Node)はDockerコンテナ上で起動
- Node内のブラウザはChromev59
- プログラムはMac上で実行
準備
1. SeleniumGridコンテナを起動する
$ docker run -d -p 4444:4444 --name selenium-hub selenium/hub:3.4.0-einsteinium
$ docker run -d --link selenium-hub:hub selenium/node-chrome:3.4.0-einsteinium
参考:https://github.com/SeleniumHQ/docker-selenium
2. SeleniumGridコンソールにアクセスできることを確認
実行
1. サンプルプログラムを作成
sample.rb
require 'selenium-webdriver'
caps = {
:platform => "",
:browserName => "chrome",
:version => ""
}
driver = Selenium::WebDriver.for(:remote,
:url => "http://localhost:4444/wd/hub",
:desired_capabilities => caps)
driver.get('https://www.google.co.jp')
puts driver.title
driver.quit
2. サンプルプログラムを実行
$ ruby sample.rb
結果
エラーが発生
/Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/response.rb:72:in `assert_ok': status code 500 (Selenium::WebDriver::Error::ServerError)
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/response.rb:32:in `initialize'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/http/common.rb:83:in `new'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/http/common.rb:83:in `create_response'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/http/default.rb:107:in `request'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/http/common.rb:61:in `call'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/bridge.rb:170:in `execute'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/bridge.rb:103:in `create_session'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/bridge.rb:54:in `handshake'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/remote/driver.rb:33:in `new'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver/common/driver.rb:58:in `for'
from /Users/xxx/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.3/lib/selenium/webdriver.rb:86:in `for'
from grid.rb:12:in `<main>'
原因
RubyバインディングとGridの間でプロトコルの不一致が発生してるようです。
参考:https://github.com/SeleniumHQ/selenium/issues/4195
暫定的な回避策
selenium-webdriverのバージョンを下げることでエラーを回避できるようになりました。
selenium-webdriver | SeleniumGrid | 実行可否 |
---|---|---|
ver 3.4.3 | ver 3.4.0 | x |
ver 3.4.2 | ver 3.4.0 | x |
ver 3.4.1 | ver 3.4.0 | x |
ver 3.4.0 | ver 3.4.0 | o |
1. 旧バージョンのgemをインストール
$ gem install selenium-webdriver -v 3.4.0
2. 指定したgemのバージョンを利用するようにサンプルプログラムを修正
sample.rb
gem "selenium-webdriver", "3.4.0" #バージョン指定
require 'selenium-webdriver'
caps = {
:platform => "LINUX",
:browserName => "chrome",
:version => ""
}
driver = Selenium::WebDriver.for(:remote,
:url => "http://localhost:4444/wd/hub",
:desired_capabilities => caps)
driver.get('https://www.google.co.jp')
puts driver.title
driver.quit
3. サンプルプログラムを実行
$ ruby sample.rb
4. 実行結果
Google
片付け
1. SeleniumGridコンテナのIDを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<NodeのCONTAINER ID> selenium/node-chrome:3.4.0-einsteinium "/opt/bin/entry_po..." 4 seconds ago Up 3 seconds xenodochial_mestorf
<GridのCONTAINER ID> Mselenium/hub:3.4.0-einsteinium "/opt/bin/entry_po..." 11 seconds ago Up 10 seconds 0.0.0.0:4444->4444/tcp selenium-hub
2. SeleniumGridコンテナの停止
$ docker stop <NodeのCONTAINER ID>
$ docker stop <GridのCONTAINER ID>
メモ
SeleniumGridコンテナの再開
$ docker start <NodeのCONTAINER ID>
$ docker start <GridのCONTAINER ID>