dockerでローカルネットワーク専用にseleniumサーバー立てて、ブラウザ上で動作を確認できるように構築した

selenium使っていろいろ自動化とかテストとか行ってると同じタイミングで同じブラウザを立ち上げてたり、ブラウザのバージョンアップで不具合が出たり、ローカルの環境と切り離したSelenium環境が欲しくなる。

ちょうどいい家鯖（NAS用途メイン）があるので、そこにSeleniumサーバーを構築させたい。
かといって動作を確認できないとそれも不便なので何かしらの方法で動作も見たい。
とここまで考えたときにとあるところで、ブラウザからSeleniumの動作を見ることができるシステムを見た。
いろいろ調べるとguacamoleというオープンソースがVNCなどのプロトコルをHTTPにフォワードできるらしい。

ということで以下から本題。

## 使うDockerイメージ

### selenium
公式にてwebdriver+browser+vncserverをバンドルしたイメージがいくつか提供されている。
https://github.com/SeleniumHQ/docker-selenium
`selenium/standalone-chrome`
`selenium/standalone-firefox`
seleniumはこのへんから
（単体で動かしてvncクライアントから確認しても良し）

### guacamole

これも公式から
https://guacamole.apache.org/doc/gug/guacamole-docker.html
`guacamole/guacd`
`guacamole/guacamole`

と、したいところなんですが最新のイメージだとクライアント認証が必須なのでdbイメージも必要となっています。
ある程度公開されるサービスなら当然必須になると思いますが、ローカルネットワークくらいなら認証なんか別にいらない、
と思ってたら`noauth`という拡張があったらしい。（1.0以降はなくなった）
https://guacamole.apache.org/doc/0.9.9/gug/noauth.html

こちらの場合はnoauthが使えるそのままのdockerイメージはないので、
https://guacamole.apache.org/releases/
noauthが使える`0.9.14`を使う。
`guacamole/guacd:0.9.14`
`guacamole/guacamole:0.9.14`
(guacdの方もバージョン合わせる。)

## guacamoleのDockerfile
ということでnoauthの拡張を入れたguacamoleイメージを作りましょう。

### noauth-extension
拡張と設定ファイルをイメージにCOPYするので適当なフォルダを作成する。ここでは`./guacamole`という名前にしよう。

https://guacamole.apache.org/releases/0.9.14/
の`guacamole-auth-noauth-0.9.14.tar.gz`をダウンロード、解凍。
中身はjarファイルなので、上のフォルダの配下に`extensions`というフォルダを作り、そこに入れる。
`./guacamole/extensions/guacamole-auth-noauth-0.9.14.jar`
↑という配置にする。

### guacamole, noauth-config.xml
各seleniumのvncと接続する設定ファイルも必要なので、`./guacamole`に配置。
`./guacamole/noauth-config.xml`
↑という状態。
内容は

``` noauth-config.xml
<configs>
    <config name="google chrome" protocol="vnc">
        <param name="hostname" value="chrome" />
        <param name="port" value="5900" />
        <param name="password" value="secret" />
    </config>
    <config name="firefox" protocol="vnc">
        <param name="hostname" value="firefox" />
        <param name="port" value="5900" />
        <param name="password" value="secret" />
    </config>
</configs>
```

これでOK

### Dockerfile
あとはguacamoleフォルダをベースイメージ内に入れて、そこに`GUACAMOLE_HOME`を設定する。

``` Dockerfile
FROM guacamole/guacamole:0.9.14

COPY guacamole /etc/guacamole
ENV GUACAMOLE_HOME /etc/guacamole

EXPOSE 8080
```

この8080ポートはWebアクセス用のポート、もし他で使われている場合は変更したりしましょう。

## docker-compose
あとはdocker-composeで動かすだけ。

``` docker-compose.yml
version: '3'
services:
  guacd:
    image: guacamole/guacd:0.9.14
    restart: unless-stopped
  
  guacamole:
    build:
      context: .
      dockerfile: Dockerfile
    restart: unless-stopped
    ports:
      - "8080:8080"
    links:
      - guacd
    environment:
      GUACD_HOSTNAME: guacd

  chrome:
    image: selenium/standalone-chrome-debug
    restart: unless-stopped
    ports:
      - "4444:4444"

  firefox:
    image: selenium/standalone-firefox-debug
    restart: unless-stopped
    ports:
      - "4445:4444"
```

#### port
8080
　→HTTP用
4444
　→selenium-remote chrome用
4445
　→selenium-remote firefox用

`docker-compose up -d`で立ち上がったら、同じネットワーク上からのブラウザから
`http://[ip or host]:8080/guacamole`でアクセス。
(ルートはtomcatのページが出ます。)

![スクリーンショット 2020-05-15 16.51.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120789/e41e7c03-1807-d735-64ae-5cf7b30533f6.png)

こんな感じで出ますね。
あとはどちらのブラウザか選んで、seleniumをremoteでつなげばブラウザが立ち上がる。


## rubyでselenium-remote(chrome) : おまけ

``` ruby
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :remote, url: "http://[host or ip]:4444/wd/hub", desired_capabilities: :chrome
driver.get "https://www.google.com"
```

#### 参考
参考にさせていただきました。ありがとうございます。
https://qiita.com/S_SenSq/items/758bbde01e801e2d1624