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 データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用

推薦する

JS で単一ファイルコンポーネントを実装する方法

目次概要単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...

マークアップ言語 - タイトル

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

MySQL Binlog ログ処理ツールの比較分析

目次運河マクスウェルデータバスAlibaba Cloud のデータ転送サービス (DTS)運河ポジシ...

初心者でもjsのtypeofとinstanceofの違いを理解できます

目次1. 型2. インスタンス3. 違い1. 型typeof 演算子は、評価されていないオペランドの...

HTML で div を非表示にする テーブルを非表示にする TABLE または DIV コンテンツの CSS スタイル

今夜、数日間悩まされていた問題を解決しました。本当に解決したかどうかはわかりませんが、解決されている...

過去の Linux イメージの問題を修正するためのサンプル分析

過去の Linux イメージに関する問題を修正従来の Linux イメージで作成された ECS クラ...

Tomcat サーバーの設定と Web プロジェクトの公開に関する IDEA グラフィック チュートリアル

1. Webプロジェクトを作成したら、Tomcatを例にサーバーを構成する必要があります。 2. 実...

高可用性 Web クラスターを実装するための Keepalived+Nginx+Tomcat サンプル コード

高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...

CSSアダプティブレイアウトは、サブ要素項目の全体的な中央揃えと内部項目の左揃えを実現します。

日常業務では、次のようなレイアウトに遭遇することがあります。親要素のフレーム (ブラウザのサイズに応...

CSS3 レーダースキャンマップのサンプルコード

CSS3 を使用して、クールなレーダースキャン画像を実現します。 コード上で直接: // インデック...

MySQL の挿入ステートメントの使用実体験

目次1. 挿入のいくつかの構文1-1. 通常の挿入文1-2. 挿入または更新1-3. 挿入または交換...

Linuxサーバーのファイアウォールを変更してポートへのリモートアクセスを許可する方法

1. 問題の説明セキュリティ上の理由から、新しく構築されたサーバー クラスターでは、指定されたポート...

Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールするとサービスが起動できない問題を解決します

今日、mysql の公式サイトから mysql-5.7.18-winx64.zip をダウンロードし...

HTML テーブルの行間および列間の操作 (rowspan、colspan)

一般的に、<td> 要素の colspan 属性はセルの列間操作を実装するために使用され...

CocosCreator MVCアーキテクチャの詳細な説明

概要この記事では、ゲームクライアントでよく使用される MVC アーキテクチャについて紹介します。ゲー...