Docker+Selenium Grid に基づく技術アプリケーションをテストするためのサンプル コード

Docker+Selenium Grid に基づく技術アプリケーションをテストするためのサンプル コード

Selenium Grid の紹介

Selenium Grid のいくつかの新しい機能は、今後リリースされる Selenium 4.0 バージョンで説明される予定ですが、現時点では参照できる公式の詳細なドキュメントがあまりないため、本書では現在広く使用されている Selenium Grid バージョンを組み合わせて説明します。

公式 Web サイトで説明されているように、Selenium Grid は、Selenium テストがコマンドをリモート Web ブラウザー インスタンスにルーティングできるようにするインテリジェントなプロキシ サーバーです。その目的は、複数のマシンでテストを並行して実行する簡単な方法を提供することです。 Selenium Grid では、サーバーはハブとして機能し、JSON 形式のテスト コマンドを 1 つ以上の登録済みグリッド ノードにルーティングして、リモート ブラウザー インスタンスにアクセスできるようにします。ハブには、アクセス可能な登録済みサーバーのリストがあり、それらのインスタンスを制御できます。 Selenium Grid を使用すると、複数のマシンで並行してテストを実行し、さまざまなブラウザ バージョンとブラウザ構成を一元的に管理できます。

図 1 Selenium Grid コンポーネント構造図

図 1 に示すように、Selenium Grid は主にハブとノードの 2 つの部分で構成されていることがわかります。 Python、Java、C# などの言語を使用して、テスト Selenium スクリプトを作成できます。各 Selenium Grid にはハブが 1 つだけあります。クライアント スクリプトは、ハブ (マスター ノードまたはハブ) への接続を指定できます。ハブは、クライアント スクリプトのテスト実行要求を受け取り、これらのテスト要求を 1 つ以上の登録済みノードに配布して実行し、実行結果を収集します。 Selenium Grid には 1 つ以上のノードが存在できます。ノードとして機能するマシンは、ハブや他のノードと同じオペレーティング システムや同じブラウザーを搭載する必要はありません。つまり、Node ノードは Windows オペレーティング システムを実行しており、Internet Explorer がシステムにインストールされている可能性があります。別の Node ノードは Linux または Mac オペレーティング システムを実行しており、そこにインストールされているブラウザーは Firefox、Safari、Chrome などです。これらの Node ノードの構成とテストは、実行するオペレーティング システムとブラウザー バージョンの互換性テストによって異なります。実際の作業では、テスト実行計画と戦略に基づいて選択してください。

Docker ベースの Selenium Grid 構成

Selenium Grid の関連イメージ ファイルは、図 2 に示すように、Docker Hub で入手できます。

図2 Selenium Grid関連の画像リソース

ここでは、「docker pull」コマンドを使用して、これら 3 つのイメージをそれぞれプルダウンします。対応するプル コマンドは次のとおりです。

docker pull selenium/hub
docker pull selenium/node-chrome
docker pull selenium/node-firefox

イメージ ファイルをローカルにプルした後、図 3 に示すように、「docker images」コマンドを使用して関連イメージの情報を表示できます。

図3 Selenium Grid関連の画像情報

ここで、ハブとノード間の接続をテストしてみましょう。

図 4 に示すように、ハブを起動します。

図4 ハブコンテナの作成と起動

図 5 に示すように、chromenode コンテナ ノードを作成して起動します。

図5 chromenodeコンテナノードの作成と起動

図 6 に示すように、firefoxnode コンテナ ノードを作成して起動します。

図6 firefoxnodeコンテナノードの作成と起動

次に、ローカル ブラウザーのアドレス バーに「http://localhost:4444/grid/console」と入力し、Selenium Grid コンソールを開くと、図 7 に示すページが表示されます。

図7 グリッドコンソール情報

図 7 に示すように、Selenium Grid の現在のバージョンは 3.141.59 です。ハブに接続されている 2 つのノードは、Firefox 75.0 ブラウザーを使用する IP 172.17.0.4 の Linux オペレーティング システムと、Chrome 81.0.4044.92 ブラウザーを使用する IP 172.17.0.3 の Linux オペレーティング システムです。デフォルトでは、ハブ ノードはポート 4444 を使用し、この例のノード ノードはポート 5555 を使用します。同じコンテナー内でポートの競合が発生した場合は、ポートの競合を回避するために、実際の状況に応じて他のポートを調整して設定する必要があります。

Docker+Selenium Grid に基づく事例デモ

次に、Bing 検索ケースを使用して、Chrome および Firefox ブラウザーでの互換性テストを実装します。 Selenium、Docker、Selenium Grid について学んだ後、どう思いますか? Docker + Selenium Grid を使用して、さまざまなブラウザに基づく互換性テストを完了することは可能ですか?はい、それは確かに良い考えです。

しかし、Selenium テスト スクリプトをさまざまなブラウザーで実行するには、何をする必要がありますか?

スクリプトの設計にいくつか変更を加える必要があります。通常、スクリプトを実行するときにホストとポートを指定する必要があります。スクリプトは次のようになります。

インポート時間
セレンからWebDriverをインポート
selenium.webdriver.common.desired_capabilities から DesiredCapabilities をインポートします
 
ドライバー = webdriver.Remote(
    コマンド実行者 = 'http://192.168.1.102:4444/wd/hub',
    望ましい機能 = DesiredCapabilities.CHROME)
 
ベースURL = 'https://cn.bing.com'
ドライバー.get(ベースURL)
ドライバー.save_screenshot('chrome.png')
ドライバー.close()

通常、実行時には、ハブのアドレス (例: http://192.168.1.102:4444/wd/hub) のみを指定する必要があります。ホスト マシンの IP アドレスは図 8 に示されています。ハブはスクリプトをノード ノードに自動的に割り当てて実行します。

図8 ホストマシンのIPアドレス情報

- command_executor パラメータ: このパラメータはオプションであり、リモート サーバーの URL 文字列またはカスタム リモート接続を指定できます。デフォルト値は「http://127.0.0.1:4444/wd/hub」です。

- desired_capabilities パラメーター: このパラメーターは必須であり、ブラウザー セッションを開始するときに要求される機能の辞書を構成するために使用できます。ここでは「DesiredCapabilities.CHROME」を適用します。以下に示すように、対応するソース コードを表示できます。

クラスDesiredCapabilities(オブジェクト):
    「」
    デフォルトでサポートされている必要な機能のセット。
    これを出発点として、必要な機能オブジェクトを作成します。
    Selenium サーバーまたは Selenium グリッドに接続するためのリモート Web ドライバーを要求します。
    使用例:
        セレンからWebDriverをインポート
        selenium_grid_url = "http://198.0.0.1:4444/wd/hub"
        # 開始点として、必要な機能オブジェクトを作成します。
        機能 = DesiredCapabilities.FIREFOX.copy()
        機能['プラットフォーム'] = "WINDOWS"
        機能['バージョン'] = "10"
        # 必要な機能を備えた Remote WebDriver のインスタンスをインスタンス化します。
        ドライバー = webdriver.Remote(望ましい機能 = 機能、
                                  コマンドエグゼキューター = selenium_grid_url)
    注意: 副作用を避けるために、DesiredCapabilitiesオブジェクトでは常に「.copy()」を使用してください。
    Global クラス インスタンスを変更した場合の影響。
    「」
 
    ファイアフォックス = {
        "ブラウザ名": "firefox",
        "acceptInsecureCerts": True、
    }
 
    インターネットエクスプローラー = {
        "ブラウザ名": "インターネットエクスプローラー",
        "バージョン": "",
        「プラットフォーム」: 「WINDOWS」、
    }
 
    エッジ = {
        "ブラウザ名": "MicrosoftEdge",
        "バージョン": "",
        「プラットフォーム」: 「任意」
    }
 
    クローム = {
        "ブラウザ名": "chrome",
        "バージョン": "",
        「プラットフォーム」: 「任意」
    }
 
    オペラ = {
        "ブラウザ名": "オペラ",
        "バージョン": "",
        「プラットフォーム」: 「任意」
    }
 
    サファリ = {
        "ブラウザ名": "サファリ",
        "バージョン": "",
        「プラットフォーム」:「MAC」、
    }
 
    HTMLユニット = {
        "ブラウザ名": "htmlunit",
        "バージョン": "",
        「プラットフォーム」: 「任意」
    }
 
    HTMLUNITWITHJS = {
        "ブラウザ名": "htmlunit",
        "バージョン": "Firefox",
        「プラットフォーム」: 「任意」
        "javascriptEnabled": True、
    }
 
    iPhone = {
        "ブラウザ名": "iPhone",
        "バージョン": "",
        「プラットフォーム」:「MAC」、
    }
 
    IPAD = {
        "ブラウザ名": "iPad",
        "バージョン": "",
        「プラットフォーム」:「MAC」、
    }
 
    アンドロイド = {
        "ブラウザ名": "android",
        "バージョン": "",
        「プラットフォーム」: 「ANDROID」、
    }
 
    ファントムJS = {
        "ブラウザ名": "ファントムjs",
        "バージョン": "",
        「プラットフォーム」: 「任意」
        "javascriptEnabled": True、
    }
 
    WEBKITGTK = {
        "ブラウザ名": "ミニブラウザ",
        "バージョン": "",
        「プラットフォーム」: 「任意」
    }
 
    WPEWEBKIT = {
        "ブラウザ名": "ミニブラウザ",
        "バージョン": "",
        「プラットフォーム」: 「任意」
    }

DesiredCapabilities クラスのソース コードから、「DesiredCapabilities.CHROME」がこのクラスによって定義された辞書オブジェクトであることがわかります。

ここで、著者はマルチスレッド アプローチを使用して、それぞれ Chrome ブラウザーと Firefox ブラウザーに Bing 検索サービスを実装します。対応するスクリプトは次のとおりです。

Grid_Test.py ファイルの内容:

スレッドインポートからスレッド
セレンからWebDriverをインポート
時間インポート sleep,ctime から
selenium.webdriver.common.by からインポート
 
def Test_Bing(ホスト、ブラウザー):
    caps = {'browserName': ブラウザ}  
    ドライバー = webdriver.Remote(コマンド実行者 = ホスト、必要な機能 = キャップ)
    ドライバー.get('http://www.bing.com')
    driver.find_element(By.ID,'sb_form_q').send_keys('非同期コミュニティ')
    driver.find_element(By.ID,'sb_form_go').click()
    PicName=ブラウザ+'_result'+'.png'
    driver.save_screenshot(画像名)
    assert (「これに関連する結果はありません」は driver.page_source にありません)
    眠る(2)
    ドライバー.close()
 
__name__ == '__main__' の場合:
    pcs = {'http://192.168.1.102:4444/wd/hub': 'chrome',
             'http://localhost:4444/wd/hub': 'firefox'
             }
    スレッド = []
    tds=範囲(len(個))
 
    # pcs.items() でホスト、ブラウザのスレッドを作成します:
        t = スレッド(ターゲット=Test_Bing、引数=(ホスト、ブラウザー))
        スレッドを追加します。
 
    # tds 内の i のスレッドを開始します:
        スレッド[i].start()
    i が tds の場合:
        スレッド[i].join()

上記のスクリプトから、ホストとブラウザーという 2 つのパラメーターを含む Test_Bing() という名前の関数が作成されていることがわかります。関数の実行意図は、リモート サーバーの URL 文字列と渡されたブラウザー名文字列に基づいて対応するブラウザーで検索を実行し、検索語が「非同期コミュニティ」であり、実行結果のスクリーンショットを撮り、スクリーンショットの名前が対応するブラウザー名 + 「_result.jpg」ファイルであり、検索結果をアサートすることです。ここで結果のスクリーンショットを撮る目的は、結果を確認するためだけではなく、Selenium Grid を使用する場合、テスト実行中にブラウザが表示されないため、実行プロセスを確認できないためであることに注意してください。結果の正確性を証明するために、実際に動作していて実行が正しいことを証明するためのスクリーンショットも撮る必要があります。実行中にさまざまなコンテナーのインターフェイスを表示する場合は、VNC ビューアーを使用して対応するコンテナーに接続することもできます (ただし、対応する selenium/node-firefox-debug および selenium/node-chrome-debug イメージ ファイルをダウンロードする必要があります。debug で終わるイメージにはすべて VNC サーバーがあります。ローカル コンピューターに VNC クライアントをインストールして、リモートで接続できます。ポート 5900 は VNC ビューアーのリスニング ポートであるため、ポート マッピングが行われます)。図 9 および 10 を参照してください。

図9 ノードコンテナのデバッグバージョンの作成と起動

図10 ノードコンテナのスクリプト実行を観察するためのVNCビューア

実際、これはテスト作業にはあまり意味がないので、あまり詳しく説明しません。

main関数では、2つの要素を含む辞書が定義されています。作者は同じアドレス(ホストマシンのIPアドレスは192.168.1.102)を2つの異なる表現で使用しており、「localhost」もローカルマシン、つまりホストマシンを意味していることがわかります。では、なぜ「192.168.1.102」または「localhost」を使用しないのでしょうか?これは、辞書キーの繰り返しが許可されていないためです。次に、スレッドリストを作成し、pcs辞書のキーと値をTest_Bing()関数のパラメータとして使用してスレッドリストに追加します。次に、スレッド リスト内の各スレッドを開始します。

スクリプトを実行する前に、図 11 に示すように、ハブ コンテナーとノード コンテナーが作成され、起動されていることを確認する必要があります (注: ここでは、作成者はノード イメージの非デバッグ バージョンを使用しています)。

図11 ハブコンテナとノードコンテナの作成と起動

スクリプトを実行すると、図 12 に示すように、「chrome_result.jpg」と「firefox_result.jpg」という 2 つの画像ファイルが生成されます。

図12 スクリプト実行後に生成された画像ファイル情報

図 13 と図 14 に示すように、この互換性テストでは、両方のブラウザーが同じ Bing 検索サービスを実行したことがわかります。ページの表示、レイアウト、コンテンツは基本的に同じですが、小さな問題が 2 つあります。Chrome ブラウザーでの検索結果は「855,000 件の結果」であるのに対し、Firefox ブラウザーでの検索結果は「859,000 件の結果」であり、一貫性がありません。もう 1 つの小さな問題は、Firefox では「サインイン」とログイン アイコンが表示されるのに、Chrome では表示されないことです。理論的には、これらは重大度レベルの低い 2 つの小さなバグですが、著者は、これら 2 つの小さな違いを製品および R&D の同僚と確認することをお勧めします。製品、テスト、および R&D は、要件を統一して明確にし、要件またはコードを変更して一貫性を保つ必要があります。

図13 chrome_result.jpg 画像ファイル情報

図14 firefox_result.jpg 画像ファイル情報

Docker+Selenium Grid に基づくテスト技術アプリケーションのサンプルコードに関するこの記事はこれで終わりです。関連する Docker Selenium Grid テスト技術コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker で Selenium グリッド分散環境を構築する実用的な方法
  • 自動ヘルスレポートを実現するDocker+Selenium方式
  • Docker ベースの Selenium 分散環境の構築
  • Selenium+testng を使用して Docker で Web 自動化を実現する方法

<<:  HTML の title 属性を正しく使用するためのヒント

>>:  h1、h2、h3タグを適切に使用する

推薦する

Eclipse と IDEA 用に Tomcat サーバーを構成する方法

tomcat サーバーの構成誰もが Web について学習するときに、自分のツール用に Tomcat ...

Linux での Makefile の書き方と使い方の詳細な説明

目次メイクファイルMakefile の命名とルールMakefile の仕組みMakefile変数Ma...

nginxの基礎を学ぶ

目次1. nginx とは何ですか? 2. nginx で何ができるのか? 2.1 フォワードプロキ...

MYSQLストアドプロシージャコメントの詳細な説明

目次1. 使用方法2. 準備3. 文法3.1 変数と代入3.2 入力および出力パラメータ3.3 プロ...

Nginx でアンチホットリンクを設定するための手順を完了する

必要:通常、サイト側は、ウェブサイト上の動画や写真が盗まれるのを防ぎたいと考えています。結局のところ...

HTMLでvueとel​​ement-uiを直接参照する方法

コードは次のようになります。 <!DOCTYPE html> <html> ...

2つのシンプルなメニューナビゲーションバーの例

メニューバーの例 1: コードをコピーコードは次のとおりです。 <!DOCTYPE html ...

JavaScript ベースのパスワード ボックス検証情報の実装

この記事では、パスワードボックスの検証情報を実装するためのJavaScriptの具体的なコードを例と...

js におけるイベントバブリングとイベントキャプチャの簡単な分析

目次01-イベントバブリング1.1- イベントバブリングの概要1.2-イベントバブリングの利用(イベ...

JSはビデオの再生速度を制御するための簡単なサンプルコードを実装します

導入以前、ある問題に気づきました。学習ビデオを視聴しているとき、動きが遅すぎる、先生が黒板に書くのに...

ウェブページのカスタム選択ボックス選択

選択ドロップダウン リスト フォームは誰もがよく知っているかもしれませんが、デフォルトのドロップダウ...

Vue 3.0 カスタムディレクティブの使い方

目次1. カスタム指示1. グローバルカスタム指示を登録する2. グローバルカスタム指示を使用する3...

Webデザイナーの成長体験

<br />まず最初に、私はこのグループの中では完全な新人だということを述べなければなり...

Vue3.0 手書き拡大鏡効果

達成される効果は、固定ズームが 2 倍になり、マウスが左側の画像領域に入るとマスク レイヤーが表示さ...

Dockerのデフォルトネットワークセグメントを変更する実装方法の分析

背景同社のサーバーはすべて Alibaba Cloud ECS ホストを購入しています。デフォルトの...