Selenium Grid 2
このドキュメントは以前は wiki に掲載されていました
Grid 4 の詳細については、ドキュメントを参照してください。
はじめに
Grid を使用すると、次のことが可能になります。
- 複数のマシンにテストを分散させることによるスケール (並列実行)
- 一元的な場所から複数の環境を管理し、ブラウザ/OS の広範な組み合わせに対してテストを簡単に実行できるようにします。
- 例えば、仮想インフラストラクチャを活用するためのカスタムフックを実装できるようにすることで、Grid のメンテナンス時間を最小限に抑えます。
クイックスタート
この例では、Selenium 2 Hub を起動し、WebDriver ノードと Selenium 1 RC レガシーノードの両方を登録する方法を示します。また、Java から Grid を呼び出す方法も示します。ここではハブとノードは同じマシン上で実行されていますが、もちろん selenium-server-standalone を複数のマシンにコピーすることもできます。注: selenium-server-standalone パッケージには、Grid を実行するために必要な Hub、WebDriver、およびレガシー RC が含まれています。Ant はもう必要ありません。selenium-server-standalone-
*
.jar は http://selenium-release.storage.googleapis.com/index.html からダウンロードできます。このチュートリアルでは、Java がすでにインストールされていることを前提としています。
ステップ 1: ハブを起動する
ハブは、すべてのテストリクエストを受信し、適切なノードに分散する中心点です。
コマンドプロンプトを開き、selenium-server-standalone ファイルをコピーしたディレクトリに移動します。次のコマンドを入力します。
java -jar selenium-server-standalone-<version>.jar -role hub
ハブはデフォルトでポート 4444 を使用して自動的に起動します。デフォルトポートを変更するには、コマンドを実行するときにオプションパラメータ -port を追加できます。ブラウザウィンドウを開き、http://localhost:4444/grid/console にアクセスすると、ハブのステータスを確認できます。
ステップ 2: ノードを起動する
新しい WebDriver 機能を持つ Grid を実行する場合でも、Selenium 1 RC 機能を持つ Grid を実行する場合でも、または両方を同時に実行する場合でも、同じ selenium-server-standalone jar ファイルを使用してノードを起動します。
java -jar selenium-server-standalone-<version>.jar -role node -hub http://localhost:4444/grid/register
注: 「-role」オプションが指定され、ハブでない場合、ポートは指定されていない場合はデフォルトで 5555 になります。
下位互換性のため、「wd」および「rc」ロールは依然として「node」ロールの有効なサブセットです。ただし、これらのロールはリモート接続のタイプを対応する API に制限しますが、「node」は RC と WebDriver の両方のリモート接続を許可します。
Grid を使用したテストの実行
(Java を例として使用) Grid が配置されたので、テストケースから Grid にアクセスする必要があります。Selenium 1 RC ノードの場合、DefaultSelenium オブジェクトを引き続き使用し、ハブ情報を渡すことができます。
Selenium selenium = new DefaultSelenium(“localhost”, 4444, “*firefox”, “http://www.google.com”);
WebDriver ノードの場合、使用するブラウザ、バージョン、プラットフォームを定義するために、RemoteWebDriver オブジェクトと DesiredCapabilities オブジェクトを使用する必要があります。テストを実行する対象となるターゲットブラウザの Capabilities を作成します。
DesiredCapabilities capability = DesiredCapabilities.firefox();
それを RemoteWebDriver オブジェクトに渡します。
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
ハブは、テストを一致するノードに割り当てます。
ノードは、リクエストされたすべての Capabilities が満たされている場合に一致します。Grid 上の特定の Capabilities をリクエストするには、WebDriver オブジェクトに渡す前にそれらを指定します。
capability.setBrowserName();
capability.setPlatform();
capability.setVersion()
capability.setCapability(,);
例: 設定で登録されたノード
-browser browserName=firefox,version=3.6,platform=LINUX
は、次のものと一致します。
capability.setBrowserName(“firefox” );
capability.setPlatform(“LINUX”);
capability.setVersion(“3.6”);
また、次のものとも一致します。
capability.setBrowserName(“firefox” );
capability.setVersion(“3.6”);
指定されていない Capabilities は無視されます。Grid 上に存在しない Capabilities を指定した場合 (たとえば、テストで Firefox バージョン 4.0 を指定したが、Firefox 4 インスタンスがない場合)、一致するものがないため、テストは実行に失敗します。
ノードの構成
ノードは 2 つの異なる方法で構成できます。1 つはコマンドラインパラメータを指定する方法、もう 1 つは JSON ファイルを指定する方法です。
コマンドラインによるノードの構成
デフォルトでは、ノードを起動すると、11 個のブラウザ (Firefox 5 個、Chrome 5 個、Internet Explorer 1 個) を同時に使用できます。同時テストの最大数は、デフォルトで 5 に設定されています。これやその他のブラウザ設定を変更するには、各 -browser スイッチにパラメータを渡すことができます (各スイッチはパラメータに基づくノードを表します)。-browser パラメータを使用すると、デフォルトのブラウザは無視され、コマンドラインで指定したもののみが使用されます。
-browser browserName=firefox,version=3.6,maxInstances=5,platform=LINUX
この設定は、Linux マシン上で 5 つの Firefox 3.6 ノードを起動します。
リモートマシンに複数のバージョンの Firefox を使用したい場合は、各バイナリの場所を同じマシン上の特定のバージョンにマッピングできます。
-browser browserName=firefox,version=3.6,firefox_binary=/home/myhomedir/firefox36/firefox,maxInstances=3,platform=LINUX -browser browserName=firefox,version=4,firefox_binary=/home/myhomedir/firefox4/firefox,maxInstances=4,platform=LINUX
ヒント: ブラウザパラメータのどこかにスペースを提供する必要がある場合は、パラメータを引用符で囲んでください。
-browser “browserName=firefox,version=3.6,firefox_binary=c:\Program Files\firefox ,maxInstances=3, platform=WINDOWS”
オプションパラメータ
-port 4444
(4444 がデフォルト)-host <IP | ホスト名>
ホスト名または IP を指定します。通常は不要で、自動的に決定されます。特殊なネットワーク構成、VPN を使用したネットワークの場合は、ホストの指定が必要になる場合があります。-timeout 30
(300 がデフォルト) ハブが指定された秒数以上リクエストを受信しなかったノードを自動的に解放するまでのタイムアウト (秒単位)。この時間が経過すると、ノードはキュー内の別のテストのために解放されます。これは、手動介入なしにクライアントクラッシュをクリアするのに役立ちます。タイムアウトを完全に削除するには、-timeout 0 を指定すると、ハブはノードを解放しません。
注: これは、すべての「WebElement の待機」タイプのコマンドに対する WebDriver タイムアウトではありません。
-maxSession 5
(5 がデフォルト) ノード上で並行して実行できるブラウザの最大数。これは、サポートされているブラウザの maxInstance とは異なります (例: Firefox 3.6、Firefox 4.0、Internet Explorer 8 をサポートするノードの場合、maxSession=1 にすると、実行中のブラウザが 1 つ以下になります。maxSession=2 の場合、Firefox テストを同時に 2 つ実行したり、Internet Explorer テスト 1 つと Firefox テスト 1 つを実行したりできます)。-browser < params >
-browser が設定されていない場合、ノードは 5 つの Firefox、1 つの Chrome、および 1 つの Internet Explorer インスタンス (Windows ボックス上にあると仮定) で起動します。このパラメータは、同じ行に複数回設定して、複数のタイプのブラウザを定義できます。-browser で許可されるパラメータ: browserName={android, chrome, firefox, htmlunit, internet explorer, iphone, opera} version={ブラウザのバージョン} firefox_binary={実行可能バイナリへのパス} chrome_binary={実行可能バイナリへのパス} maxInstances={このタイプのブラウザの最大数} platform={WINDOWS, LINUX, MAC}-registerCycle N
= ノードが自身を再登録しようとする頻度 (ミリ秒単位)。ノードを再起動せずにハブを再起動できます。本当に大規模な (>50 ノード) ハブインストールでは、Java コマンドラインで -DPOOL_MAX=512 (またはそれ以上) を設定して jetty スレッドを増やす必要がある場合があります。
タイムアウトの構成 (バージョン 2.21 以降が必要)
Grid のタイムアウトは通常、webDriver.manage().timeouts() を介して処理する必要があります。これにより、さまざまな操作のタイムアウトを制御できます。
selenium-server を使用した Grid のランタイム整合性を維持するために、設定できるタイムアウト値が他に 2 つあります。
ハブで、-timeout コマンドラインオプションを「30」秒に設定すると、クライアントがクラッシュしてから 30 秒後にすべてのリソースが再利用されるようになります。ハブで -browserTimeout 60 を設定して、ノードがブラウザ内でハングアップする最大時間を 60 秒にすることもできます。これにより、60 秒後にすべてのリソースがわずかに再利用されるようになります。すべてのノードは、設定されている場合、ハブからこれらの 2 つの値を使用します。単一ノードにローカルに設定されたパラメータが優先されます。これらのタイムアウトをノードに設定しないことをお勧めします。
browserTimeout は 次のようになるはずです
- ソケットロックタイムアウト (45 秒) より大きい
- 一般に、webDriver.manage().timeouts() で使用される値よりも大きくする必要があります。これは、このメカニズムが「最後の防衛線」であるためです。
JSON によるノードの構成
java -jar selenium-server-standalone.jar -role node -nodeConfig nodeconfig.json
サーバーバージョン 3.x.x (>= beta4) のサンプル nodeconfig ファイルは、https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultNodeWebDriver.json で確認できます。
サーバーバージョン 2.x.x のサンプル nodeconfig ファイルは、https://github.com/SeleniumHQ/selenium/blob/selenium-2.53.0/java/server/src/org/openqa/grid/common/defaults/DefaultNode.json で確認できます。
注: バージョン 2.x.x の configuration { ... }
オブジェクトは、バージョン 3.x.x (>= beta4) でフラット化されました。
JSON によるハブの構成
java -jar selenium-server-standalone.jar -role hub -hubConfig hubconfig.json
サンプル hubconfig.json ファイルは、https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultHub.json で確認できます。
ハブの診断メッセージ
異常な使用パターンを検出すると、ハブは次のメッセージを表示する場合があります。
Client requested session XYZ that was terminated due to REASON
理由 | 原因/修正 |
---|---|
TIMEOUT | クライアントがタイムアウト時間内にセッションにアクセスしなかったため、セッションがタイムアウトしました。クライアントが何らかの理由で中断されている場合、再開時に発生する可能性があります。 |
BROWSER_TIMEOUT | ノードがブラウザをタイムアウトさせました。ブラウザが長時間ハングアップしていたためです (パラメータ browserTimeout)。 |
ORPHAN | キューで待機しているクライアントが、新しいセッションが提供された時点で諦めました。 |
CLIENT_STOPPED_SESSION | セッションは、クライアントで stop/quit を通常どおりに呼び出して停止されました。なぜまた使用しているのですか?? |
CLIENT_GONE | クライアントプロセス (あなたの コード) が終了したか、リクエストに応答しなくなったようです。断続的なネットワークの問題も原因となる可能性があります。 |
FORWARDING_TO_NODE_FAILED | ハブがノードへの転送に失敗しました。メモリ不足エラー/ノードの安定性の問題またはネットワークの問題 |
CREATIONFAILED | ノードがブラウザの作成に失敗しました。これは通常、ノードに環境/構成の問題がある場合に発生する可能性があります。ノードを直接使用して問題を追跡してみてください。 |
PROXY_REREGISTRATION | ノードが (テスト中に) Grid に再登録したため、セッションは破棄されました。 |
Grid での実行に関するヒント
テストを並行して実行している場合は、各スレッドが、他のスレッドで実行されている他のテストとは独立して、webdriver リソースを割り当て解除するようにしてください。テスト実行の開始時にスレッドごとに 1 つのブラウザを起動し、最後にすべてのブラウザを割り当て解除するのは、良い考えではありません。(1 つのテストケースが異常な時間を消費することにした場合、他のすべてのテストが遅いテストを待機しているため、タイムアウトが発生する可能性があります。これは非常に混乱を招く可能性があります。)
Selenium Grid プラットフォーム
(以前の場所: https://github.com/SeleniumHQ/selenium/wiki/Grid-Platforms)
このセクションでは、Selenium Grid ノードおよび [DesiredCapabilities] オブジェクトの構成で使用される PLATFORM オプションについて説明します。
プラットフォームの沿革
Grid から新しい WebDriver セッションをリクエストする場合、ユーザーはリモートブラウザの [DesiredCapabilities] を指定できます。ブラウザ名、バージョン、プラットフォームなどは、テストで指定できるオプションのリストに含まれています。Desired を指定します。
次のコードは、Windows XP プラットフォーム上の Internet Explorer バージョン 9 の DesiredCapability を示しています。
[[DesiredCapabilities]] capability = DesiredCapabilities.internetExplorer();
capability.setVersion("8");
capability.setPlatform(Platform.XP);
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
指定された DesiredCapability を持つ新しいセッションのリクエストは Grid ハブに送信され、Grid ハブは登録されているすべてのノードを調べて、テストで指定された仕様に一致するノードがあるかどうかを確認します。仕様に一致するノードがない場合、CapabilityNotPresentOnTheGridException が返されます。
PLATFORM によって、新しいセッションが作成されるオペレーティングシステムを選択できると誤解されがちです。この状況では、プラットフォームとオペレーティングシステムは同じではありません。したがって、プラットフォームを「Windows 2003 Server」に指定しても、Windows XP、Vista、および 2003 Server を選択することはできません。この誤解は、プラットフォームの名前がオペレーティングシステムの名前と一致する Mac OSX や Linux などのプラットフォームから生まれる可能性があります。
Selenium Grid の場合、プラットフォームは Driver Atoms と Web ブラウザ間の基盤となるインタラクションを指します。Mac OSX および Linux ベースのオペレーティングシステム (CentOS、Ubuntu、Debian など) は、Firefox や Chrome などの Web ブラウザとの通信が比較的安定しています。したがって、プラットフォーム名は、以下の例に示すように、理解しやすいものになっています。
capability.setPlatform(Platform.MAC); //Set platform to OSX
capability.setPlatform(Platform.LINUX); // Set platform to Linux based systems
Vista のリリース前は、Windows ベースのオペレーティングシステムにはプラットフォームが 1 つしかありませんでした。以下に示します。
capability.setPlatform(Platform.WINDOWS); //Set platform to Windows
ただし、Windows Vista で UAC が導入されたことにより、WebDriver と Internet Explorer 間の基盤となるインタラクションに大きな変更が加えられました。UAC の制約を回避するために、Windows ベースのオペレーティングシステムを搭載したノードに新しいプラットフォームが追加されました。
capability.setPlatform(Platform.VISTA); //Set platform to VISTA
Windows 8 のリリースにより、WebDriver が Internet Explorer と通信する方法に別の大きな見直しが行われました。そのため、Windows 8 ベースのノードに新しいプラットフォームが追加されました。
capability.setPlatform(Platform.WIN8); //Set platform to Windows 8
Windows 8.1 の導入でも同様のことが起こりました。この例では、プラットフォームは Windows 8.1 に設定されています。
capability.setPlatform(Platform.WIN8_1); //Set platform to Windows 8.1
オペレーティングシステムのプラットフォーム
次のリストは、一部のオペレーティングシステムと、それらが属するプラットフォームを示しています。
MAC****すべての OSX オペレーティングシステム LINUX CentOS Ubuntu UNIXSolarisBSD XP Windows Server 2003 Windows XP Windows NT VISTAWindows VistaWindows 2008 Server****Windows 7 WIN8 Windows 2012 Server Windows 8 WIN8_1****Windows 8.1
ファミリー
異なるプラットフォームは、プラットフォームの「ファミリー」にグループ化されます。たとえば、Win8 および XP プラットフォームは、WINDOWS ファミリーの一部です。同様に、ANDROID および LINUX は UNIX ファミリーの一部です。
プラットフォームとプラットフォームファミリーの選択
[DesiredCapabilities] オブジェクトにプラットフォームを設定する場合、個々のプラットフォームまたはプラットフォームのファミリーを設定できます。例:
capability.setPlatform(Platform.VISTA); //Will return a node with Windows Vista or 2008 Server or Windows 7 Operating System.
capability.setPlatform(Platform.XP); //Will return a node with Windows XP or 2003 Server or Windows 2000 Professional Operating System.
capability.setPlatform(Platform.WINDOWS); //Will return a node with ANY Windows Operating System
詳細情報
最新のプラットフォームの詳細については、このファイルをご覧ください。
org.openqa.selenium.Platform.java