AppiumとSelenium Grid
Selenium Grid 4+ の使用¶
Grid 4のrelay機能を使用すると、AppiumリクエストをAppiumサーバインスタンスにプロキシできます。2つの異なるAppiumインスタンスをSelenium Gridに接続する方法の例を示します。
Appium設定の定義¶
各Appiumインスタンスには、簡単に更新できる設定ファイルが必要です。そこには、その特定のサーバに固有の情報(例:他のサーバが使用しないドライバが使用するポートなど)を含める必要があります。2つのAppiumサーバを使用するので、2つの設定ファイルが必要です。
# appium1.yml
server:
  port: 4723
  use-drivers:
    - xcuitest
  default-capabilities:
    wdaLocalPort: 8100
    mjpegServerPort: 9100
    mjpegScreenshotUrl: "https://:9100"
上記のYAML設定ファイルでは、Appiumサーバのポート、使用するドライバ、デフォルト機能として送信されるドライバのパラメータを指定します。目標は、このホスト上で実行されている他のドライバが、システムポートやその他の資源と競合しないようにすることです。2番目の設定ファイルは次のようになります。ここでは、競合を防ぐためにいくつかのポートを調整するだけです。
# appium2.yml
server:
  port: 4733
  use-drivers:
    - xcuitest
  default-capabilities:
    wdaLocalPort: 8110
    mjpegServerPort: 9110
    mjpegScreenshotUrl: "https://:9110"
Gridノード設定の定義¶
コマンドのリレー、容量とオンラインステータスの決定などを管理するために、Appiumサーバごとに1つのGrid「ノード」を起動します。そのため、Gridノードごとに1つの設定ファイルも必要です。各ノードの設定には、対象とするAppiumサーバのアドレスと、セッションリクエストをAppiumにリレーするために受け入れる必要がある機能「設定」のリストを含める必要があります。2つのノードの設定例を以下に示します。
# node1.toml
[server]
port = 5555
[node]
detect-drivers = false
[relay]
url = "https://:4723"
status-endpoint = "/status"
configs = [
    "1", "{\"platformName\": \"iOS\", \"appium:platformVersion\": \"15.5\", \"appium:deviceName\": \"iPhone 13\", \"appium:automationName\": \"XCUITest\"}"
]
# node2.toml
[server]
port = 5565
[node]
detect-drivers = false
[relay]
url = "https://:4733"
status-endpoint = "/status"
configs = [
    "1", "{\"platformName\": \"iOS\", \"appium:platformVersion\": \"15.5\", \"appium:deviceName\": \"iPhone 12\", \"appium:automationName\": \"XCUITest\"}"
]
各ノードの設定は、ノードが実行されるポートもそれぞれ指定していることに注意してください。
まとめ¶
Gridノードだけでは不十分です。ロードバランサとすべてのノードのマネージャとして機能するGrid「ハブ」も必要です。最終的には、2つのAppiumサーバ、2つのGridノード、1つのGridハブの合計5つのプロセスが同時に実行されます。ログの混乱を避けるために、これらをそれぞれ別のターミナルウィンドウで実行することをお勧めします。各プロセスの開始方法は次のとおりです。
- appium --config appium1.yml
- appium --config appium2.yml
- java -jar /path/to/selenium.jar node --config node1.toml
- java -jar /path/to/selenium.jar node --config node2.toml
- java -jar /path/to/selenium.jar hub
ノードがAppiumサーバを検出し、ハブに登録されるまでしばらく待つと、単一のハブエンドポイント(デフォルトではhttps://:4444)を介してすべてのAppiumトラフィックを送信できるようになります。
もちろん、ネットワーク上の異なるマシンで実行されているAppiumサーバとノードをリンクして、より大規模なグリッドを形成することもできます。
Selenium Grid 3の使用¶
--nodeconfigサーバ引数を使用して、ローカルのSelenium Grid 3(セットアップドキュメント)インスタンスにAppiumサーバを登録できます。
参照された設定ファイルでは、browserName、version、platformの機能を定義する必要があり、これらのパラメータに基づいて、グリッドはテストを適切なデバイスにリダイレクトします。ホストの詳細とSelenium Gridの詳細も設定する必要があります。すべてのパラメータとその説明の完全なリストについては、こちらを参照してください。
Appiumサーバを起動すると、グリッドに登録され、グリッドコンソールページにデバイスが表示されます。
http://**\<grid-ip-adress\>**:**\<grid-port\>**/grid/console
Gridノード設定JSONの例¶
{
  "capabilities":
      [
        {
          "browserName": "<e.g._iPhone5_or_iPad4>",
          "version":"<version_of_iOS_e.g._7.1>",
          "maxInstances": 1,
          "platform":"<platform_e.g._MAC_or_ANDROID>"
        }
      ],
  "configuration":
  {
    "cleanUpCycle":2000,
    "timeout":30000,
    "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
    "url":"http://<host_name_appium_server_or_ip-address_appium_server>:<appium_port>/wd/hub",
    "host": "<host_name_appium_server_or_ip-address_appium_server>",
    "port": <appium_port>,
    "maxSession": 1,
    "register": true,
    "registerCycle": 5000,
    "hubPort": <grid_port>,
    "hubHost": "<Grid_host_name_or_grid_ip-address>",
    "hubProtocol": "<Protocol_of_Grid_defaults_to_http>"
  }
}
url、host、portが指定されていない場合、設定はlocalhost:<appium-port>を指すように自動的に更新されます。
AppiumサーバがSelenium Gridサーバとは異なるマシンで実行されている場合は、hostとurlの設定に外部名/IPアドレスを使用してください。localhostと127.0.0.1を使用すると、Selenium Gridが正しく接続できなくなります。