Docker で Selenium Grid による並列実行環境を構築

### :black_square_button: 前提
- Docker インストール&設定済み

[Docker 超入門 〜 Boot2Docker 導入から HelloWorld まで〜](http://qiita.com/akasakas/items/cf53aa6d9d4aa7086f93)

### :black_square_button: Docker Image 取得

https://registry.hub.docker.com/repos/selenium/

から selenium/hub と selenium/node-chrome-debugをとってくる

```shell-session
$ docker run -d -p 4444:4444 --name selenium-hub selenium/hub
$ docker run -d -v /dev/urandom:/dev/random -P --link selenium-hub:hub selenium/node-chrome-debug:
```

でHub と Node を起動

boot2docker ip確認

```shell-session
$ boot2docker ip
```

コンテナ確認

```shell-session

$ docker ps

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                     NAMES
e5cb8aa82960        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   25 hours ago        Up 5 seconds        0.0.0.0:49154->5900/tcp   gloomy_sinoussi
d495bfc3d1dd        selenium/hub:latest                 "/opt/bin/entry_poin   25 hours ago        Up 4 minutes        0.0.0.0:4444->4444/tcp    selenium-hub
```

ポート確認

```shell-session
$ docker port e5cb8aa82960

5900/tcp -> 0.0.0.0:49154
```

下記へアクセス

```
http://<boot2docker-ip>:4444/grid/console
```
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/R/RealFightProgrammer/20150411/20150411162837.png">


### :black_square_button: VNCへ接続する

Macでのboot2docker は VNCクライアントが既に入っているので
SafariかAlfredで下記にアクセス

``` vnc://<boot2docker-ip>:49154 ```

パスワードが聞かれるので、デフォルトは「secret」を入力すると、こんな画面がでてくる。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/R/RealFightProgrammer/20150411/20150411180914.png" width=300>

### :black_square_button: selenium grid上で selenium webdriver を動かしてみる

サンプルスクリプトはこんな感じ

```ruby
# google.rb

require 'rubygems'
require 'selenium-webdriver'
 
driver = Selenium::WebDriver.for :remote, url: 'http://<boot2docker-ip>:4444/wd/hub', desired_capabilities: :chrome

driver.navigate.to "http://google.com"
driver.save_screenshot "google.png"

driver.quit

```

ruby google.rb で実行！！

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/R/RealFightProgrammer/20150412/20150412183415.png" width=300>

スクショとれてますよ〜。感動！！


### :black_square_button: ノード数を増やして、並列実行やってみる

figを使ってみる。

```sh
brew install fig
```

yaml形式です。

```yaml
# docker-compose.yml

hub:
  image: selenium/hub
  ports:
    - "4444"

node:
  image: selenium/node-chrome-debug
  ports:
    - "5900"
  links:
    - hub

```

起動してみる

```shell-session
$ fig up -d

Creating seleniumgrid_hub_1...
Creating seleniumgrid_node_1...
``` 

ノード数を増やしてみる

```shell-session
$ fig scale node=10

Creating seleniumgrid_node_2...
Creating seleniumgrid_node_3...
Creating seleniumgrid_node_4...
Creating seleniumgrid_node_5...
Creating seleniumgrid_node_6...
Creating seleniumgrid_node_7...
Creating seleniumgrid_node_8...
Creating seleniumgrid_node_9...
Creating seleniumgrid_node_10...
Starting seleniumgrid_node_2...
Starting seleniumgrid_node_3...
Starting seleniumgrid_node_4...
Starting seleniumgrid_node_5...
Starting seleniumgrid_node_6...
Starting seleniumgrid_node_7...
Starting seleniumgrid_node_8...
Starting seleniumgrid_node_9...
Starting seleniumgrid_node_10...
```

増えてる。増えてる。
</br>
コンテナ確認

```shell-session
$ docker ps


CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                     NAMES
848cfbfea229        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   27 seconds ago      Up 21 seconds       0.0.0.0:49165->5900/tcp   seleniumgrid_node_10
aefd6e22fc38        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 22 seconds       0.0.0.0:49164->5900/tcp   seleniumgrid_node_9
31a5deab92f6        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 23 seconds       0.0.0.0:49163->5900/tcp   seleniumgrid_node_8
9a1f2b57d2fd        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 24 seconds       0.0.0.0:49162->5900/tcp   seleniumgrid_node_7
e8248a7f54f1        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 25 seconds       0.0.0.0:49161->5900/tcp   seleniumgrid_node_6
3ffe25779686        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 25 seconds       0.0.0.0:49160->5900/tcp   seleniumgrid_node_5
112ab5748233        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 26 seconds       0.0.0.0:49158->5900/tcp   seleniumgrid_node_3
1cd0614af078        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 27 seconds       0.0.0.0:49157->5900/tcp   seleniumgrid_node_2
f205fe9716a0        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   28 seconds ago      Up 26 seconds       0.0.0.0:49159->5900/tcp   seleniumgrid_node_4
04690c0dcea8        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   56 seconds ago      Up 55 seconds       0.0.0.0:49156->5900/tcp   seleniumgrid_node_1
64cecc30b7b2        selenium/hub:latest                 "/opt/bin/entry_poin   57 seconds ago      Up 56 seconds       0.0.0.0:49155->4444/tcp   seleniumgrid_hub_1
e5cb8aa82960        selenium/node-chrome-debug:latest   "/opt/bin/entry_poin   26 hours ago        Up About an hour    0.0.0.0:49154->5900/tcp   gloomy_sinoussi
d495bfc3d1dd        selenium/hub:latest                 "/opt/bin/entry_poin   26 hours ago        Up About an hour    0.0.0.0:4444->4444/tcp    selenium-hub

```

増えてる。増えてる。

```shell-session
$ docker port seleniumgrid_hub_1

4444/tcp -> 0.0.0.0:49155
```

```
http://<boot2docker-ip>:49155/grid/console
```

へアクセス。
</br>
増えてる。増えてる。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/R/RealFightProgrammer/20150412/20150412185517.png" width=300>


並列実行する際は

```ruby
driver = Selenium::WebDriver.for :remote, url: 'http://<boot2docker-ip>:49155/wd/hub', desired_capabilities: :chrome
```

にして実行すれば流れる感じっすね。


### :black_square_button: Special Thanks 

[Docker Hub の Selenium Hub/Node イメージ + fig で Selenium Grid 構築してみた - Thanks Driven Life](http://gongo.hatenablog.com/entry/2014/12/02/002148)

[Docker で Selenium Grid の環境構築をもっと楽に！ | Cybozu Inside Out | サイボウズエンジニアのブログ](http://developer.cybozu.co.jp/tech/?p=8113)

[Docker Hub Registry - Repositories of Docker Images](https://registry.hub.docker.com/repos/selenium/)