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

# 概要
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コンソールにアクセスできることを確認
http://localhost:4444/grid/console


# 実行
## 1. サンプルプログラムを作成

```ruby: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のバージョンを利用するようにサンプルプログラムを修正

```ruby: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>
```