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を設定する。

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のページが出ます。)

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

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

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