最近、Zoom ビデオ会議をテストし、100 人が同時に会議に参加することをシミュレートする必要がありました。調べてみると、Zoom では URL リンクを介して直接会議に参加する方法が提供されていることがわかりました (使用されるプロトコルは WebRTC であるため、Chrome ブラウザまたは FireFox ブラウザ経由のみ)。 この考え方に従うと、Selenium オートメーションを使用して、各プロセスがビデオ会議ユーザーを表す複数のブラウザ プロセスを同時に開始し、複数参加者による会議をシミュレートする効果を実現できます。ただし、2 つの難点があります。
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 に基づいてテスト プランが設計されました。
上記の設計アイデアによれば、理論的には 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Mysql データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用
目次1. 問題の背景2. 仮想マシン ネットワーク カードの接続方法は何ですか? 2.1 NAT 2...
この記事の例では、3階層メニューを再帰的に実装するVueの具体的なコードを参考までに共有しています。...
序文InnoDB はデータをテーブルスペースに保存します。デフォルト設定では、初期サイズが 10 M...
時間に余裕を持って、過去を忘れましょう。前のセクションでは、[検索] フォームとクエリおよびリセット...
MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NU...
イメージを構築するこれまで、テストやデモンストレーションにさまざまなイメージを使用しました。多くの場...
目次シナリオ中核問題ステータス監視状態監視の利点国家監視の欠点復興実行のアイデア依存関係の収集要約す...
はじめに: インターフェイス デザイナーの Joshua Porter が自身のブログでこの記事を公...
イメージは hub.docker.com に保存できますが、ネットワーク速度が比較的遅いです。内部環...
目次1. ミニプログラム下請け2. Uniapp 下請けアプレット下請けの手順: 1. manife...
この記事では、vue-table の追加と削除の具体的なコードを参考までに紹介します。具体的な内容は...
パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...
序文Linux カーネルでは、netfilter は、パケット フィルタリング、ネットワーク アドレ...
ウェブページを画像としてキャプチャする新機能があったので、人気のhtml2canvasを使ってみまし...
目次1. 要素の入手方法文書から入手ID取得クラス名 (className) を取得します。タグ名 ...