Appium 求められる能力 Android エミュレータ

⚡ スマートサマリー

必要な機能はキーと値のペアであり、 Appium クライアントはセッションを開く際に、自動テストを実行する対象プラットフォーム、デバイス、ドライバ、アプリケーションをサーバーに通知するメッセージを送信します。

  • 🔴 セッションコンtract: 機能は新規セッションリクエストのJSONボディに含まれており、後から変更することはできません。
  • ☑️ Android 必需品: appPackageとappActivityは、アプリケーションと画面の名前を指定します。 Appium 起動するはずです。
  • 待機バリエーション: appWaitPackageとappWaitActivityは、実際のエントリポイントの前に表示されるスプラッシュスクリーンを対象としています。
  • 🧪 Appium 2 接頭辞: 非標準の機能を使用するには、すべて「appium: vendor」というプレフィックスが必要になります。そうでない場合、サーバーはそれを拒否します。
  • 🛠️ モダン Java クライアント: DesiredCapabilities は UiAutomator2Options と XCUITestOptions に置き換えられました。 Selenium 4.
  • 📊 価値の発見: adb dumpsys クエリまたは PackageManager クラスを使用すると、パッケージ名とアクティビティ名がわかります。

Appium 望ましい機能のキーと値のペア Android エミュレーターセッション

求められる能力とは何か

「希望する機能」は、自動化中にサーバーの動作を変更するのに役立ちます。 Appium これはハッシュマップ、つまりキーと値のペアで、コマンドを送信するために使用されます。 Appium サーバーでは、すべてのクライアントコマンドがセッションのコンテキスト内で実行されます。

例えば、クライアントはJSONオブジェクトを含むPOST /sessionリクエストを送信します。 Appium サーバー。

つまり、サーバーにリクエストを送信したり、サーバーとのセッションを維持したりするには、キーと値のペアのセットが使用されます。これは「要求された機能」と呼ばれます。

import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
{
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName","Android Emulator");
        capabilities.setCapability("platformVersion", "4.4");
}

望ましい能力の重要な役割

  • 「DesiredCapabilities」は、ユーザーがサーバーとのセッション要求を制御するのに役立ちます。たとえば、iOS セッションの場合は、capability platformName = iOS を設定し、 Android セッションプラットフォーム名 = Android.
  • 「DesiredCapabilities」は、例えばWebDriverインスタンスを設定するために使用されます。 Firefoxドライバー、ChromeDriver、またはInternetExplorerDriver。
  • DesiredCapability は次の場合に非常に役立ちます Selenium グリッド。例えば、異なるブラウザや異なるオペレーティングシステム上で異なるテストケースを実行するために使用されます。指定された機能に基づいて、グリッドハブは対応するノードを指します。ノードは「set」プロパティメソッドを使用して定義されます。
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • 希望する機能は、ライブラリで定義されたパッケージです。「DesiredCapabilities」を使用する前に、以下のライブラリからインポートする必要があります。
    Org.openqa.selenium.remote.DesiredCapabilities

Appium 両方をサポート Android iOS と iOS では、別のセットがあります Appium 各プラットフォームにおけるサーバー機能。

以下の表は、よく使われるいくつかの例を示しています。 Android 能力と、それを用いるべき価値観。

機能 詳細説明 価値/用途
アプリパッケージ 希望する番号に電話する Java 同梱 Android ユーザーが実行したいもの

値= com.example.myapp/

Obj.setCapability(“appPackage”, “com.whatsapp”);

アプリのアクティビティ ユーザーがパッケージから起動したいアプリケーションアクティビティ。

値= MainActivity、.Settings

Obj.setCapability(“appActivity”, “com.whatsapp.Main”);

appWaitパッケージ アプリケーションが待機する必要のあるパッケージ 値=com.example.android.myapp
appWaitアクティビティ 任意 Android ユーザーが待つ必要があるアクティビティ

値= スプラッシュアクティビティ

機能.setCapability(“appWaitActivity”, “com.example.game.SplashActivity”)

注: Appium ドキュメント もっと見るには Android 機能を提供します。

以下の表は、よく使用されるiOSの機能と、その値を示しています。

機能 詳細説明 価値観
起動タイムアウト インストルメンテーションを待機する合計時間 (ミリ秒)。 2000
UDID 接続されている物理デバイスの固有デバイス番号を識別するため 166エーストゥ4

注: Appium 機能ガイド iOSのその他の機能についてはこちらをご覧ください。

望ましい機能はどのように変化したか Appium 2

上記の例は Appium 1つの時代であり、依然として能力セットの形状を示していますが、2つのルールが変更され、どちらも現代のセッションの開始を妨げます。

まず、W3C WebDriver仕様では、標準機能のごく一部しか定義されていません。 platformName (NAIST) と browserName ここで重要なのは、その他の機能はすべてベンダー拡張機能であり、コロンで終わる名前空間プレフィックスを持つ必要があるということです。 Appiumの接頭辞は appium:。 そう deviceName になる appium:deviceName (NAIST) と platformVersion になる appium:platformVersion. Appium 2 では、 appium:automationNameなぜなら、ドライバーはサーバーにバンドルされているのではなく、別途インストールされるからです。

第二に、接頭辞を繰り返すのは面倒なので、 Appium 単一を受け入れます appium:options 値がオブジェクトである機能。そのオブジェクト内の機能には接頭辞は不要で、オブジェクトの内外両方に同じ名前がある場合は、内側の値が優先されます。

{
    "platformName": "iOS",
    "appium:options": {
        "automationName": "XCUITest",
        "platformVersion": "16.0",
        "app": "/path/to/your.app",
        "deviceName": "iPhone 12",
        "noReset": true
    }
}

⚠️ バージョンノート: Java 側、 Selenium 4本、そして Appium Java クライアント 8 は非推奨になりました DesiredCapabilities 先に示されていたクラス。ドライバー固有のビルダーは以下から継承されています。 BaseOptions 交換する — UiAutomator2Options の Android (NAIST) と XCUITestOptions iOS版 - 1対1の地図付きping それぞれの古い setCapability 呼び出し。上記の元のコードは、歴史的な例としてここに残されています。

Extracパッケージとアクティビティ情報

パッケージは、ファイルまたはクラスをまとめたものです。モジュール型プログラミングに整理された構造を与えます。 Java異なるパッケージが単一のJARファイルに格納され、ユーザーはそのJARファイルを呼び出すことで完全な実行が可能になります。同様の概念はモバイルアプリケーション開発でも採用されています。

Android オペレーティングシステムでは、すべてのアプリケーションは、 Java パッケージ。tract パッケージパス情報、 Android PackageManagerクラスを使用します。

デバイスにプリインストールされているアプリケーションと後からインストールされたアプリケーションのパッケージ情報とアクティビティ情報を取得します。

getPackageManager() を呼び出すことで、PackageManager クラスのインスタンスを取得できます。このメソッドを使用すると、インストールされているアプリケーションのパッケージおよび関連する権限にアクセスして操作できます。

具体的な例を挙げますと、以下の通りです。

PackageManager pManager = getPackageManager();
List<ApplicationInfo> list = pManager.getInstalledApplications(PackageManager.GET_META_DATA)

adbを使ってappPackageとappActivityを見つける方法

上記の PackageManager ルートはアプリケーション内部から機能します。テスターは通常、インストール済みのビルドしか持っていないため、より迅速な方法はクエリを実行することです。 ADB 接続されたデバイスまたはエミュレータに対して。

デバイス上でアプリケーションを手動で開き、次にplatform-toolsフォルダ内のターミナルから以下のコマンドのいずれかを実行します。このコマンドは現在フォーカスのあるウィンドウを表示し、値は次のようにフォーマットされます。 package/activity.

adb shell dumpsys window | find "mCurrentFocus"
adb shell dumpsys window windows | grep -i "mCurrentFocus"

最初の形式を使用してください Windows コマンドプロンプトで、2番目はUnixシェルまたはGit Bashで実行します。結果を2つの部分に分けて読みます。スラッシュより前の部分は、 appPackage、そしてそれ以降のすべては、 appActivity.

注意すべき点が2つあります。フォーカスされるアクティビティは、その時点で画面に表示されているものですが、必ずしもアプリケーション起動時に表示されるアクティビティとは限りません。ドライバの初期化中にセッションが失敗した場合は、アプリを最初から起動して値を再度読み取ってください。また、スプラッシュ画面が最初に表示される場合、エントリアクティビティは最終的に検証したいアクティビティとは異なります。まさにこれが問題なのです。 appWaitActivity 存在する理由。

視覚的な代替案は ウイオートマビューアこれは現在の画面階層をキャプチャし、各ノードのパッケージとクラスを表示します。

よくある希望機能エラーとその修正方法

最も失敗した Appium セッションがテスト手順を一つも実行する前に終了してしまう場合、その原因はテスト自体ではなく、ほとんどの場合、機能セットにあります。以下の表は、各メッセージとその一般的な解決策を示しています。

メッセージ 考えられる原因 修正する
無効またはサポートされていないWebDriver機能 ベンダープレフィックスなしで非標準機能が送信されました appium: を追加するか、appium:options の中に移動してください。
必要な機能には、automationName または platformName のいずれかを含める必要があります。 Appium 2 ドライバーを選択できません platformNameとappium:automationNameを明示的に設定してください。
アプリを起動できません。元のエラー: アプリの起動に使用されるアクティビティが存在しません appActivityがマニフェストと一致しません 上記のdumpsysコマンドで値を再読み取ります。
セッションが開始されませんでした: デバイスが見つかりませんでした エミュレーターやハンドセットは接続されていません 起動前にadb devicesコマンドでデバイスを確認してください。
タイムアウト後、新しいセッションを作成できませんでした。 スプラッシュスクリーンが表示されると、入力処理が遅延します。 appWaitActivityを設定し、appWaitDurationを増加させる
アプリケーションの状態は実行間でリセットされません デフォルトのリセット動作が上書きされました Rev実行したいappium:noResetとappium:fullResetを確認してください。

セッションが開始されない場合は、 Appium クライアントスタックではなくサーバーログ trace. サーバーは、どの機能を満たせなかったかを示し、その行に修正方法を示します。

よくあるご質問

いいえ。platformNameとbrowserNameは標準的なW3C機能であり、プレフィックスは付きません。その他すべて Appium deviceName や platformVersion などの機能はベンダー拡張機能であり、appium: プレフィックスが必要です。

デバイスクラウドの機械学習ツールは、ビルドとターゲットデバイスから機能セットを提案し、類似のセッションで失敗した値にフラグを立てます。出力はあくまでも下書きとして扱い、各名前をドライバのドキュメントと照合して確認してください。

コパイロットは共通機能ブロックを完了しますが、多くの Appium 1つのコードであり、プレフィックスを省略したり、非推奨のDesiredCapabilitiesクラスを提案したりすることがよくあります。各提案を最新のガイドと照らし合わせて確認してください。

appPackage はパッケージの名前を指定します Appium appWaitPackage が起動します。パッケージに名前を付けます。 Appium コントロールを返す前に表示されるのを待つため、ランチャーやスプラッシュスクリーンが最初に別のパッケージを読み込む場合に重要になります。

platformNameをiOSに設定し、appium:automationNameをXCUITestに設定してください。XCUITestドライバーは、appium:app、appium:bundleId、browserNameのいずれか少なくとも1つが必要です。そうでない場合、ホーム画面でセッションが開きます。

サーバーがクライアントからの次のコマンド送信を待つ秒数。この待機時間を超過すると、サーバーはクライアントが切断されたと判断し、セッションをシャットダウンします。これは多くの場合、ランダムな障害のように見えます。

noReset は通常のリセット処理をスキップするため、アプリのデータはセッション終了後も保持されます。fullReset は、再現性を最大限に高めるため、アンインストールと再インストールという追加の手順を実行します。どちらもデフォルトでは false に設定されており、同時に有効にしないでください。

いいえ。機能はセッションを開始するためのパラメータであり、セッションが作成されると固定されます。ドライバーがセッション中に動作を変更できるようにする場合は、代わりに設定APIを通じて設定を公開します。