Docker で Selenium グリッド分散環境を構築する実用的な方法

Docker で Selenium グリッド分散環境を構築する実用的な方法

最近、Zoom ビデオ会議をテストし、100 人が同時に会議に参加することをシミュレートする必要がありました。調べてみると、Zoom では URL リンクを介して直接会議に参加する方法が提供されていることがわかりました (使用されるプロトコルは WebRTC であるため、Chrome ブラウザまたは FireFox ブラウザ経由のみ)。

この考え方に従うと、Selenium オートメーションを使用して、各プロセスがビデオ会議ユーザーを表す複数のブラウザ プロセスを同時に開始し、複数参加者による会議をシミュレートする効果を実現できます。ただし、2 つの難点があります。

  • 複数の Chrome ブラウザ プロセスを同時に実行する必要があります。コンピューター上で Chrome ブラウザ プロセスを開始すると、約 220 MB 消費されます。
  • ビデオ会議のオーディオおよびビデオ ソースに関する問題。

Chrome ブラウザは、ビデオ会議のオーディオおよびビデオ ソースをより適切にサポートします。Selenium スクリプトで Chrome ブラウザを初期化するパラメータに、次の構成を追加するだけです。

chrome_options.add_argument("--use-fake-ui-for-media-stream")
chrome_options.add_argument("--use-fake-device-for-media-stream")

ビデオ会議に参加すると、仮想ビデオとオーディオを使用できます。しかし、考慮すべき問題があります。この仮想ビデオと実際のビデオ会議の間にはビデオ品質にギャップがあるようです。これはテスト結果に影響しますか?今のところ、このトピックについてはここでは説明しません。

現時点で唯一の悩みは、100 個の Chrome ブラウザ プロセスを実装する方法です。これは単なるリソースの問題ではないのかと思うかもしれません。サーバーを追加すれば解決するのではないでしょうか? !しかし、サーバー リソースがある場合、タスクをどのようにスケジュールすればよいのでしょうか?幸いなことに、Selenium の 3 つの主要コンポーネントの 1 つであり、分散テストを実行するために特別に設計された Selenium Grid があります。

そこで、Selenium Grid に基づいてテスト プランが設計されました。

  • サーバーをハブ、つまりマスターとして使用する
  • 残りのマシンをハブ マシンのノードとして登録します。
  • マルチプロセスを使用して、Selenium 自動化スクリプトをローカルで実行します (Python で実装しました)。

上記の設計アイデアによれば、理論的には 100 人が同時に会議に参加することをシミュレートすることが可能です。次に、Docker を使用して Selenium Grid 分散環境を構築する方法について正式に検討を開始します。

Selenium jarパッケージはノードを直接起動します

実際、最初は jar パッケージを使用してノードを直接起動していました。ノードの数が少ない場合は問題ありませんでしたが、ノードの数が多くなりすぎると非常に面倒でした。たとえば、ノードを再起動したい場合、すべてのノードを手動で強制終了してから、1 つずつ起動する必要がありました。

あらゆる手作業の反復作業をスクリプト化できます。そこで、私は 2 つのシェル スクリプトを作成しました。1 つのスクリプトは渡されたパラメータに応じて対応する数のノードを起動し、もう 1 つのスクリプトはすべてのノード プロセスを終了します。メインスクリプトは以下のとおりです。

スクリプトを使えば簡単に実行できますが、それでも不便です。まず、ノードを起動すると、多くの Java プロセスが追加され、すべてのノードのログが同時にコンソールに出力されるため、単一のノードのログを表示することはできません。そこで、Selenium グリッド ノードを管理するために docker を使用することを検討しました。

dockerコマンドで直接起動する

github に既製のイメージがあります: https://github.com/SeleniumHQ/docker-selenium 。次に、説明ドキュメントには、使用可能なイメージ名もすべてリストされています。私は主に Chrome ブラウザを使用しているため、selenium/hub、selenium/node-chrome、selenium/node-chrome-debug の 3 つのイメージをインストールしました。selenium/node-chrome-debug イメージは VNC サーバーを起動します。スクリプトの実行中に、VNC サーバーにローカルで接続し、インターフェイスを通じてサーバーのスクリプト実行ステータスを表示できます。 コマンドを使用します:

$ docker pull セレン/ハブ
$ docker pull selenium/node-chrome
$ docker pull selenium/node-chrome-debug

ハブを起動するコマンドは次のとおりです。

$ docker run -d -p 4444:4444 -e GRID_MAX_SESSION=100 --name hub selenium/hub

ローカル ノード (ハブとノードは同じマシン上にある) を起動するコマンドは次のとおりです。

$ docker run -d -p 5555:5555 -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --link hub:hub --name node1 selenium/node-chrome

リモート ノード (ハブとノードが同じマシン上にない場合) を起動するコマンドは次のとおりです。

$ docker run -d -p port:5555 -e HUB_HOST=remote_ip -e HUB_PORT=remote_port -e REMOTE_HOST=http://ip:port -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --name node1 selenium/node-chrome

ここで注意すべき点は、多くのオンライン チュートリアルで提供されている起動コマンドは、すべてハブとノードが同じマシン上にあることを前提としている点です。オンライン チュートリアルに従ってハブとノードを別のマシン上に配置する必要がある場合、起動時にエラーは発生しませんが、ノードとハブ間のネットワークは切断されます。

docker コマンドを直接使用して単一ノードのログを表示することもできますが、jar パッケージを使用する場合と同じ問題が発生します。つまり、複数のノードを起動するのは非常に不便で、複数の手動コマンドが必要になります。もっと良い解決策はありますか?もちろん、docker-compose を使用して Docker コンテナを統合することもできます。

docker-compose の開始

Docker Compose は、複数のコンテナで構成されるアプリケーションを定義および実行するために使用される Docker のコマンドライン ツールです。これは、複数の docker コマンドを 1 つのファイルに入れて、docker-compose を使用して 1 回のクリックで実行するのと同じです。

同様に、次の 2 つの状況があります。

ハブとノードは同じマシン上にある

次の設定ファイルdocker-compose.ymlを使用できます。

バージョン: "3"
サービス:
 セレンハブ:
  画像: セレン/ハブ
  コンテナ名: selenium-hub
  ポート:
   - 「4444:4444」
  環境:
   - GRID_MAX_SESSION=50
   -GRID_TIMEOUT=900
   - START_XVFB=偽
 クロム:
  画像: selenium/node-chrome
  ボリューム:
   - /dev/shm:/dev/shm
  依存:
   - セレンハブ
  環境:
   - HUB_HOST=セレンハブ
   - ハブポート=4444
   - NODE_MAX_INSTANCES=5
   - NODE_MAX_SESSION=5

次に、コンソールでコマンドを実行します。

$ docker-compose up -d //-dはバックグラウンドで実行されることを意味します

複数のノードを同時に起動したい場合はどうすればよいでしょうか?とても簡単です:

$ docker-compose up -d --scale chrome=num //numは起動するノードの数です

ノードをシャットダウンする場合は、次のコマンドを実行します。

$ docker-compose ダウン

ハブとノードは同じマシン上にありません

次の設定ファイルdocker-compose.ymlを使用できます。

バージョン: "3"
サービス:
 # セレン-クロム-1
 セレン-クロム-ノード-1:
  画像: selenium/node-chrome
  ボリューム:
   - /dev/shm:/dev/shm
  ポート:
   - 「5556:5555」
  再起動: 常に
  stdin_open: 真
  環境:
   HUB_HOST: ハブIP
   ハブポート: 4444
   ノード最大インスタンス数: 5
   ノード最大セッション数: 5
   リモートホスト: http://nodeip:5556
   グリッドタイムアウト: 60000
  shm_size: "2GB"
 # セレン-クロム-2
 セレン-クロム-ノード-2:
  画像: selenium/node-chrome
  ボリューム:
   - /dev/shm:/dev/shm
  ポート:
   - 「5555:5555」
  再起動: 常に
  stdin_open: 真
  コンテナ名: ノード1
  環境:
   HUB_HOST: ハブIP
   ハブポート: 4444
   ノード最大インスタンス数: 5
   ノード最大セッション数: 5
   リモートホスト: http://nodeip:5555
   グリッドタイムアウト: 60000
  shm_size: "2GB"
 # セレン-クロム-3
 セレン-クロム-ノード-3:
  画像: selenium/node-chrome
  ボリューム:
   - /dev/shm:/dev/shm
  ポート:
   - 「5557:5555」
  再起動: 常に
  stdin_open: 真
  環境:
   HUB_HOST: ハブIP
   ハブポート: 4444
   ノード最大インスタンス数: 5
   ノード最大セッション数: 5
   リモートホスト: http://nodeip:5557
   グリッドタイムアウト: 60000
  shm_size: "2GB"
 # セレン-クロム-4
 セレン-クロム-ノード-4:
  画像: selenium/node-chrome
  ボリューム:
   - /dev/shm:/dev/shm
  ポート:
   - 「5558:5555」
  再起動: 常に
  stdin_open: 真
  環境:
   HUB_HOST: ハブIP
   ハブポート: 4444
   ノード最大インスタンス数: 5
   ノード最大セッション数: 5
   リモートホスト: http://nodeip:5558
   グリッドタイムアウト: 60000
  shm_size: "2GB"

 # セレン-クロム-5
 セレン-クロム-ノード-5:
  画像: selenium/node-chrome
  ボリューム:
   - /dev/shm:/dev/shm
  ポート:
   - 「5559:5555」
  再起動: 常に
  stdin_open: 真
  環境:
   HUB_HOST: ハブIP
   ハブポート: 4444
   ノード最大インスタンス数: 5
   ノード最大セッション数: 5
   リモートホスト: http://nodeip:5559
   グリッドタイムアウト: 60000
  shm_size: "2GB"

ノードを起動するコマンドは次のとおりです (前提として、ハブを事前に起動しておく必要があります)。

$ docker-compose アップ -d

ノードをシャットダウンするコマンドは次のとおりです。

$ docker-compose ダウン

遺産

このように Selenium Grid 環境を構築すると、ローカルノードは正常に実行できるものの、リモートノードがタイムアウトになることがよくあります。ただし、http://hub_ip:4444/grid/console インターフェースから見たノードネットワークはすべて接続されています。

以前、いくつかの情報を調べたところ、Docker クラスター管理ツールである Docker Swarm を使用する必要があるようです。これは、複数の Docker ホストを 1 つに抽象化し、これらの Docker ホスト上のさまざまな Docker リソースを統一された入り口から管理します。しかし、まだ勉強していません。Docker Swarm の使用について結論が出たら、記事を書いて皆さんと共有したいと思います。

要約する

Selenium Grid 分散環境を構築するには、Docker を使用すると非常に便利です。基本的に、コマンド 1 行だけでノードを起動またはシャットダウンできます。この記事が皆さんにいくつかのアイデアを提供し、日々の仕事における問題の解決に役立つことを願っています。

これで、docker を使用した Selenium グリッド分散環境の構築の実践的な方法についての記事は終了です。docker を使用した Selenium グリッド分散環境の構築に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 自動ヘルスレポートを実現するDocker+Selenium方式
  • Docker ベースの Selenium 分散環境の構築
  • Selenium+testng を使用して Docker で Web 自動化を実現する方法
  • Docker+Selenium Grid に基づく技術アプリケーションをテストするためのサンプル コード

<<:  JavaScript 配列のマージのケーススタディ

>>:  Mysql データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用

推薦する

VirtualBox Centos7 の NAT+ホストオンリーネットワークの落とし穴のまとめ

目次1. 問題の背景2. 仮想マシン ネットワーク カードの接続方法は何ですか? 2.1 NAT 2...

Vueは3階層メニューを再帰的に実装する

この記事の例では、3階層メニューを再帰的に実装するVueの具体的なコードを参考までに共有しています。...

MySQL が InnoDB テーブルが独立したテーブルスペースか共有テーブルスペースかを判断する方法の詳細な説明

序文InnoDB はデータをテーブルスペースに保存します。デフォルト設定では、初期サイズが 10 M...

Reactは複雑な検索フォームの展開と折りたたみ機能を実装します

時間に余裕を持って、過去を忘れましょう。前のセクションでは、[検索] フォームとクエリおよびリセット...

MySQLデータベースがNULLを可能な限り避ける理由

MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NU...

Dockerfile を使用して Docker でイメージを構築する方法

イメージを構築するこれまで、テストやデモンストレーションにさまざまなイメージを使用しました。多くの場...

Vue でデータコレクターを設計する

目次シナリオ中核問題ステータス監視状態監視の利点国家監視の欠点復興実行のアイデア依存関係の収集要約す...

優れた UI (ユーザー インターフェース) デザイナーになるための 20 の道標

はじめに: インターフェイス デザイナーの Joshua Porter が自身のブログでこの記事を公...

Dockerプライベート倉庫の構築と利用の詳細説明

イメージは hub.docker.com に保存できますが、ネットワーク速度が比較的遅いです。内部環...

ユニアプリとミニプログラム(画像とテキスト)を下請けする方法を教えます

目次1. ミニプログラム下請け2. Uniapp 下請けアプレット下請けの手順: 1. manife...

vue-tableは追加と削除を実装します

この記事では、vue-table の追加と削除の具体的なコードを参考までに紹介します。具体的な内容は...

Nginx http ヘルスチェック構成プロセス分析

パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...

Linuxはiptablesを使用して複数のIPからのサーバーへのアクセスを制限します

序文Linux カーネルでは、netfilter は、パケット フィルタリング、ネットワーク アドレ...

HTML2 キャンバス SVG が認識されない場合の解決策

ウェブページを画像としてキャプチャする新機能があったので、人気のhtml2canvasを使ってみまし...

JavaScriptの基本的なインタラクションの詳細な説明

目次1. 要素の入手方法文書から入手ID取得クラス名 (className) を取得します。タグ名 ...