LoginSignup
7
6

More than 5 years have passed since last update.

Ruby環境でselenium-webdriver(gem)のバージョンを指定してSeleniumを実行する方法

Last updated at Posted at 2017-07-08

概要

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>
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6