- ローカルで完結
- Hub がリモートにある
- ↑ 且つ Node が仮想環境で動いている
- ↑ 且つ Port Forwarding されるポート番号が異なる
とりあえず思いついた上記シチュエーションでそれぞれ書いてみます。おかしなところや過不足な点があれば指摘おねがいします。
0. Hub の起動オプション
これは特に弄ることはないので各シチュエーション固定でいきます
$ java -jar selenium-server-standalone-2.x.y.jar -role hub
1. ローカルで完結
Hub と Node が同ホスト上で動いている場合です。
この場面で必要なオプションは、自身が Node であることを示す -role webdriver
だけです。
$ 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 がどこで動いているか、というオプションが必要となってきます。
※ 以降は「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
を実行した環境)が、VirtualBox や VMWare のゲストOS、Docker Container などのいわゆる仮想環境で動いている場合はこのパターンに該当します。
仮想環境で、とは書いてますが要は外部から直でアクセスできない環境にある場合、ということです。
Selenium Node は「おれはこのホスト名とポートで待ち受けてて、このブラウザを使うぜ!」といった接続情報を持参して Hub に接続を試みます。その情報を元に、今度は Hub から Node への接続を開始します。この時の Node のホスト名(IP アドレス)は、デフォルトだと てきとうな NIC のIPアドレス を勝手に選んで Hub に渡すので、仮想環境内から Node を実行すると Hub からは接続できない IP アドレスになる可能性があります。
こういった場合によく使われるのが Port Forwarding 機能です。説明はめんどくさいので省きますが、要するにホスト(node.example.com)のポートと仮想環境(192.168.x.1)のポートを繋げる風にすることで外部ホストからその仮想環境にアクセスできるようにする仕組みです(雑)。
Vagrant で VirtualBox を使ってる場合だと
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
みたいな感じで指定するやつのことです。
いろいろあって 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
こういう時です。
例えばさきほどのオプション
-hubHost hub.example.com -hubPort 4444 -host node.example.com -port 5555
この指定だと、Hub 側からは node.example.com:5555
にアクセスしてきます。
しかし Port Forwarding の設定では node.example.com
の 5555 が開いてるわけではないので接続に失敗します。
では逆にこうしたらどうでしょう。
-hubHost hub.example.com -hubPort 4444 -host node.example.com -port 44444
この指定だと Hub 側からは node.example.com:44444
にアクセスしてくるので、Port Forwarding されたポートにアクセスしてくれます。
しかし、Node 自体は フォワード先である 5555 ではなく -port
で指定した 44444 を待ち受けてしまうため、これも接続に失敗します。
そこで新たに -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
って指定したら上書きできたぜやった、みたいな感じです。