Thanks Driven Life

日々是感謝

各シチュエーションで Selenium Grid を構築するために必要な Node のオプション指定

  1. ローカルで完結
  2. Hub がリモートにある
  3. ↑ 且つ Node が仮想環境で動いている
  4. ↑ 且つ Port Forwarding されるポート番号が異なる

とりあえず思いついた上記シチュエーションでそれぞれ書いてみます。おかしなところや過不足な点があれば指摘おねがいします。

0. Hub の起動オプション

これは特に弄ることはないので各シチュエーション固定でいきます

$ java -jar selenium-server-standalone-2.x.y.jar -role hub

1. ローカルで完結

Hub と Node が同ホスト上で動いている場合です。 この場面で必要なオプションは、自身が Node であることを示す -role webdriver だけです。

f:id:gongoZ:20141029094629p:plain

$ java -jar selenium-server-standalone-2.x.y.jar -role webdriver

もし Hub がポートをデフォルト(4444)以外で起動している場合は -hubPort を指定します

$ java -jar selenium-server-standalone-2.x.y.jar -role webdriver -hubPort 8888

ただし、Node が同ホスト上の VirtualBox や Docker Container などのいわゆる仮想環境で動いている場合は 「3. Node が仮想環境で動いている」に該当しますので、そちらをご参照下さい。

2. Hub がリモートにある

Hub と Node が別ホスト上で動いている場合です。 ここでは Hub がどこで動いているか、というオプションが必要となってきます。

f:id:gongoZ:20141029094632p:plain

※ 以降は「java -jar *.jar -role webdriver」の部分は共通ですので省略します。

-hubHost hub.example.com -hubPort 4444

URL で指定する方法もあります

-hub http://hub.example.com:4444/grid/register

3. Node が仮想環境で動いている

Hub と Node が別ホストで動いている、という状況は先程と同じですが、Node を動かしている環境(つまり java -jar を実行した環境)が、VirtualBoxVMWare のゲストOS、Docker Container などのいわゆる仮想環境で動いている場合はこのパターンに該当します。

f:id:gongoZ:20141029100047p:plain

仮想環境で、とは書いてますが要は外部から直でアクセスできない環境にある場合、ということです。

Selenium Node は「おれはこのホスト名とポートで待ち受けてて、このブラウザを使うぜ!」といった接続情報を持参して Hub に接続を試みます。その情報を元に、今度は Hub から Node への接続を開始します。この時の Node のホスト名(IP アドレス)は、デフォルトだと てきとうな NICIPアドレス を勝手に選んで Hub に渡すので、仮想環境内から Node を実行すると Hub からは接続できない IP アドレスになる可能性があります。

f:id:gongoZ:20141029100046p:plain

こういった場合によく使われるのが Port Forwarding 機能です。説明はめんどくさいので省きますが、要するにホスト(node.example.com)のポートと仮想環境(192.168.x.1)のポートを繋げる風にすることで外部ホストからその仮想環境にアクセスできるようにする仕組みです(雑)。

VagrantVirtualBox を使ってる場合だと

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.network :forwarded_port, guest: 5555,  host: 5555
end

Docker Container を使ってる場合は

$ docker run -p 5555:5555 -d selenium-nde

みたいな感じで指定するやつのことです。

f:id:gongoZ:20141029100045p:plain

いろいろあって Node オプションはこのようになります。

- -hubHost hub.example.com -hubPort 4444
+ -hubHost hub.example.com -hubPort 4444 \
+     -host node.example.com -port 5555

こうすることで、Hub に「俺は node.example.com:5555 で動いてる Node だ!」と教えてあげることができます。 Hub はそれに従って node.example.com:5555 に対して接続を行います。Port Forwarding の設定がきちんと行われていれば、結果的に node.example.com 内で動いている仮想環境 の Node (192.168.x.1:5555) と Hub の接続が完了します。

4. Port Forwarding されるポート番号がホストと異なる場合

言葉で説明しづらいんですが、つまり

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.network :forwarded_port, guest: 5555, host: 44444
end

こういう時です。

f:id:gongoZ:20141029104142p:plain

例えばさきほどのオプション

-hubHost hub.example.com -hubPort 4444 -host node.example.com -port 5555

この指定だと、Hub 側からは node.example.com:5555 にアクセスしてきます。 しかし Port Forwarding の設定では node.example.com の 5555 が開いてるわけではないので接続に失敗します。

f:id:gongoZ:20141029104147p:plain

では逆にこうしたらどうでしょう。

-hubHost hub.example.com -hubPort 4444 -host node.example.com -port 44444

この指定だと Hub 側からは node.example.com:44444 にアクセスしてくるので、Port Forwarding されたポートにアクセスしてくれます。 しかし、Node 自体は フォワード先である 5555 ではなく -port で指定した 44444 を待ち受けてしまうため、これも接続に失敗します。

f:id:gongoZ:20141029104151p:plain

そこで新たに -remoteHost というオプションを使用します。

 -hubHost hub.example.com -hubPort 4444 \
-     -host node.example.com -port 5555
+     -port 5555 \
+     -remoteHost http://node.example.com:44444
  • -port
    • Node が実際に待ち受けるポート番号
  • -remoteHost
    • Hub にアクセスしてきて欲しい Node のホストの URL

もし -remoteHost が省略されている場合は {-host}:{-port}-remoteHost として Hub に送信されてしまいます。

まとめ

とりあえず selenium-server-standalone.jar -h すればわかります。

  • Node が接続する Hub を指定する時は -hubHost-hubPort を使う
  • Hub にわかる形で Node の情報を教えてあげる時は -host-port を使う
  • Node の待ち受けポート番号と、Hub がアクセスするポート番号が異なる場合は -remoteHost でがんばる

ちなみに -remoteHost-hでもオプション表示されないし困ってましたが、Node から Hub に情報を送信する時の json の中に remoteHost ってフィールドがあったので試しに -remoteHost って指定したら上書きできたぜやった、みたいな感じです。

参考