Selenium 2 でのテストのスケールアップの制限

Selenium2 を並列実行する際に発生する追加の制約の概要。

このドキュメントは以前は wiki 上 にありました

Selenium2 の並列実行

このページでは、Selenium2 を並列実行する際に発生する追加の制約をまとめています。

WebDriver のインスタンス化

個々の WebDriver インスタンスをスレッド間で共有することはできませんが、複数の WebDriver インスタンスを簡単に作成できます。

エフェメラルソケット

TCP/IP v4 の一般的な問題として、2 つのソケット間で接続を確立する際に、TCP/IP スタックがエフェメラルポートを使用することが挙げられます。この典型的な症状は、実行開始後しばらくすると(多くの場合 1 ~ 2 分後)、接続エラーが発生し始めることです。メッセージは多少異なりますが、常にしばらくしてから表示され、ブラウザの数を減らすと最終的には正常に動作するようになります。

エフェメラルポートに関する Wikipedia または「エフェメラルソケット」の簡単な Google 検索で、現在の OS が提供するものと、その設定方法を確認できます。

現在(2.13.0)、Firefox をフル稼働させると、Firefox 1 つあたり約 2000 個のエフェメラルポートを消費するようです。この数値は環境によって異なります。これは、Windows XP ではブラウザがわずか 2 つ、あるいは非常に速い反復処理を行う場合など、1 つでもエフェメラルポートを使い果たしてしまう可能性があることを意味します。

修正されるのか?

エフェメラルソケット問題の解決策は、接続での HTTP1.1 keep-alive です。Firefox はバージョン 2.13.0 の時点では keep-alive をサポートしていません。

修正済みのもの

  • Java クライアント。
  • Selenium Server(「rc」)。
  • Selenium Grid ハブとノード
  • Ruby バインディング(RubyBindings の注記を参照)。
  • IE ドライバ。
  • ChromeDriver

つまり、Java クライアントを使用してリモートボックスで Selenium Server を実行するようにスケールアウトでき、中央のビルドサーバーで問題が発生することはありません。ただし、リモートボックスでソケットの問題を解決する必要がある場合があります。

Microsoft Windows

古いバージョンの Windows(<=2003、XP を含む)を使用している場合、ポートの使用量がこの範囲に収まるまで待つべきではありません。一部の組み合わせでは可能かもしれませんが、決して起こらない可能性があります。調整方法については、http://support.microsoft.com/kb/196271 を参照してください。

技術的な理由で Windows マシンのポート範囲を調整できない場合は、2~3 個以上の Firefox ブラウザを実行することはできません。

ソケットロックの回避

各テストクラス/テストメソッド間で新しいブラウザを起動するのは遅く、ソケットロックもエフェメラルソケットを使用するため、上記の問題が悪化します。

スイートレスなテストセットアップ(多くの JUnit4 ユーザーなど)を使用している場合、多くの場合、@BeforeClass/@AfterClass メソッドでブラウザを起動/停止します。別のオプションとして、@BeforeClass でブラウザを起動し、JUnit/TestNG 実行リスナーのようなものを使用して、テスト実行の最後にすべてのブラウザをシャットダウンする方法があります。Maven Surefire は、JUnit と TestNG の両方の実行リスナーをサポートしています。

(TODO: ソケットロックを無効にし、ポートを自分で管理する戦略)

ネイティブイベント

ネイティブイベントロジックの共有ファイルが原因で、Firefox ドライバは同時実行時にはネイティブイベントを使用しない方がよいでしょう。(この issue を監視してください)。

最終更新日:2022年1月12日:wiki の追加記事をアーカイブ (e75f49c8af3)