Appium Capacités souhaitées pour Android Émulateur

⚡ Résumé intelligent

Les capacités souhaitées sont les paires clé-valeur Appium Le client envoie des instructions au serveur lors de l'ouverture d'une session, indiquant la plateforme, le périphérique, le pilote et l'application sur lesquels le test automatisé doit être exécuté.

  • 🔴 Session contract: Les capacités sont transmises dans le corps JSON de la requête de nouvelle session et ne peuvent plus être modifiées par la suite.
  • ☑️ Android essentiel: appPackage et appActivity nomment l'application et l'écran Appium devrait se lancer.
  • Variantes d'attente : appWaitPackage et appWaitActivity gèrent les écrans de démarrage qui apparaissent avant le véritable point d'entrée.
  • 🧪 Appium 2 préfixes : Toute fonctionnalité non standard nécessite désormais le préfixe appium: vendor, sous peine d'être rejetée par le serveur.
  • Moderne Java client: DesiredCapabilities a cédé la place à UiAutomator2Options et XCUITestOptions sous Selenium 4.
  • (I.e. Trouver des valeurs : Une requête adb dumpsys ou la classe PackageManager révèle les noms des packages et des activités.

Appium paires clé-valeur des capacités souhaitées pour un Android session d'émulateur

Quelles sont les capacités souhaitées

Les « capacités souhaitées » nous aident à modifier le comportement du serveur pendant l'automatisation. Appium Il s'agit d'une table de hachage, ou paire clé-valeur, utilisée pour envoyer une commande à la Appium serveur, où chaque commande client s'exécute dans le contexte d'une session.

Par exemple, un client envoie une requête POST /session contenant un objet JSON à la Appium serveur.

Pour envoyer une requête ou maintenir une session avec le serveur, on utilise un ensemble de paires clé-valeur. C'est ce qu'on appelle les « capacités requises ».

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");
}

Rôle important de la capacité souhaitée

  • Les « DesiredCapabilities » permettent à l'utilisateur de contrôler la requête de session auprès du serveur. Par exemple, pour une session iOS, nous définissons la capacité platformName = iOS, et pour une session Android, nous définissons la capacité « platformName » = iOS. Android Nom de la plateforme de session = Android.
  • Les « DesiredCapabilities » sont utilisées pour configurer l'instance WebDriver, par exemple. FirefoxPilote, ChromeDriver ou InternetExplorerDriver.
  • DesiredCapability est très utile pour Selenium Grille. Par exemple, elle sert à exécuter différents cas de test sur un navigateur et un système d'exploitation différents. En fonction de la capacité déclarée, le hub de la grille pointe vers le nœud correspondant. Les nœuds sont définis à l'aide des méthodes de propriété « set ».
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • Une fonctionnalité souhaitée est un package défini par une bibliothèque. Avant d'utiliser `DesiredCapabilities`, il convient de l'importer depuis la bibliothèque ci-dessous.
    Org.openqa.selenium.remote.DesiredCapabilities

Appium prend en charge les deux Android et iOS, il existe donc un ensemble distinct de Appium capacités serveur pour chaque plateforme.

Le tableau ci-dessous présente quelques exemples d'utilisation courante. Android capacités et valeurs à utiliser.

Description Valeurs/Utilisations
appPackage Appelez le numéro souhaité Java emballer dans Android que l'utilisateur souhaite exécuter

Valeur = com.example.myapp/

Obj.setCapability("appPackage", "com.whatsapp");

appActivité Activité de l'application que l'utilisateur souhaite lancer à partir du package.

Valeur = MainActivity, .Settings

Obj.setCapability("appActivity", "com.whatsapp.Main");

appWaitPackage Paquet que l'application doit attendre Valeur = com.example.android.myapp
appWaitActivity Toutes Android activité pour laquelle l'utilisateur doit attendre

Valeur = SplashActivity

capacités.setCapability("appWaitActivity", "com.example.game.SplashActivity")

REMARQUE : se référer à la Appium Documentation pour en voir plus Android capacités.

Le tableau ci-dessous présente certaines fonctionnalités iOS couramment utilisées et les valeurs à utiliser.

Description Nos valeurs
LaunchTimeout Temps total (en ms) d'attente pour l'instrumentation. 2000
C'EST TOI QUI L'AS FAIT Pour identifier le numéro unique d'un appareil physique connecté 166aestu4

REMARQUE : se référer à la Appium guide des capacités pour découvrir plus de fonctionnalités iOS.

Comment les compétences souhaitées ont évolué Appium 2

Les exemples ci-dessus proviennent de Appium Une ère et elle montre encore la forme d'un ensemble de capacités, mais deux règles ont changé et toutes deux empêcheront le démarrage d'une session moderne.

Premièrement, la spécification WebDriver du W3C ne définit qu'un petit ensemble de fonctionnalités standard, parmi lesquelles platformName et browserName C'est le seul point important. Toutes les autres fonctionnalités sont des extensions du fournisseur et doivent comporter un préfixe d'espace de noms se terminant par deux-points. AppiumLe préfixe de 's est appium:. Si deviceName devient appium:deviceName et platformVersion devient appium:platformVersion. Appium 2 nécessite également appium:automationName, car les pilotes sont installés séparément et non pas fournis avec le serveur.

Deuxièmement, répéter le préfixe devient fastidieux, donc Appium accepte un seul appium:options Une capacité dont la valeur est un objet. Les capacités contenues dans cet objet n'ont pas besoin de préfixe, et lorsqu'un nom apparaît à la fois à l'intérieur et à l'extérieur de l'objet, c'est la valeur interne qui prévaut.

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

⚠️ Note de version : sur le Java côté, Selenium 4 et Appium Java Le client 8 a déprécié le DesiredCapabilities classe présentée précédemment. Générateurs spécifiques au pilote hérités de BaseOptions le remplacer — UiAutomator2Options pour Android et XCUITestOptions pour iOS — avec une correspondance un à unping de chaque vieux setCapability appel. Le code original ci-dessus est conservé ici à titre d'exemple historique.

ExtracInformations sur les forfaits et les activités

Les packages sont des ensembles de fichiers ou de classes. Ils confèrent une structure organisée à la programmation modulaire. JavaDans ce système, différents modules sont regroupés dans un seul fichier JAR, que l'utilisateur peut exécuter. Un concept similaire est utilisé dans le développement d'applications mobiles.

Dans l' Android système d'exploitation, toutes les applications sont installées sous la forme de Java colis. Donc, pour extracinformations sur le chemin du paquet t, le Android La classe PackageManager est utilisée.

Il récupère les informations relatives aux paquets et à l'activité des applications préinstallées et post-installées sur l'appareil.

Vous pouvez obtenir une instance de la classe PackageManager en appelant la méthode getPackageManager(). Cette méthode permet d'accéder aux packages et aux permissions associées des applications installées, et de les manipuler.

Par exemple :

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

Comment trouver appPackage et appActivity avec adb

La méthode PackageManager décrite ci-dessus fonctionne depuis l'intérieur d'une application. En tant que testeur, vous ne disposez généralement que de la version installée ; la méthode la plus rapide consiste donc à effectuer une requête sur PackageManager. adb contre un appareil connecté ou un émulateur.

Ouvrez l'application manuellement sur l'appareil, puis exécutez l'une des commandes ci-dessous depuis un terminal situé dans le dossier platform-tools. La commande affiche la fenêtre active, et la valeur est formatée comme suit : package/activity.

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

Utilisez la première forme dans le Windows L'invite de commandes et la seconde dans un shell Unix ou Git Bash. Lisez le résultat en deux parties : tout ce qui précède la barre oblique est la valeur de appPackage, et tout ce qui suit est la valeur de appActivity.

Deux précautions s'imposent. L'activité active est celle affichée à l'écran à ce moment précis, qui ne correspond pas toujours à l'activité initiale de l'application. Si une session échoue lors de l'initialisation du pilote, relancez l'application et relisez la valeur. De plus, si un écran de démarrage apparaît en premier, l'activité d'entrée sera différente de celle que vous souhaitez finalement tester, ce qui est précisément le cas. appWaitActivity existe pour.

Une alternative visuelle est uiautomatorviewer, qui capture la hiérarchie d'écran actuelle et affiche le package et la classe de chaque nœud.

Erreurs courantes liées aux capacités souhaitées et comment les corriger

La plupart ont échoué Appium Les sessions s'interrompent avant même l'exécution d'une seule étape de test, et la cause réside presque toujours dans les capacités du système plutôt que dans le test lui-même. Le tableau ci-dessous associe chaque message à sa solution habituelle.

Message Cause probable Fixer
Fonctionnalité WebDriver non valide ou non prise en charge Une fonctionnalité non standard a été envoyée sans le préfixe du fournisseur Ajoutez appium: à cet élément, ou déplacez-le à l'intérieur de appium:options
Les fonctionnalités souhaitées doivent inclure soit un nom d'automatisation, soit un nom de plateforme. Appium 2 ne peuvent pas choisir de conducteur Définissez explicitement platformName et appium:automationName
Impossible de démarrer l'application. Erreur d'origine : l'activité utilisée pour démarrer l'application n'existe pas. appActivity ne correspond pas au manifeste Relisez la valeur avec la commande dumpsys ci-dessus.
La session n'a pas démarré : aucun périphérique détecté. Aucun émulateur ni combiné n'est connecté. Vérifiez l'appareil avec la commande adb devices avant de lancer l'application.
Impossible de créer une nouvelle session après le délai d'attente. Un écran de démarrage retarde l'activité d'entrée Définissez appWaitActivity et augmentez appWaitDuration
L'état de l'application n'est pas réinitialisé entre les exécutions. Le comportement de réinitialisation par défaut a été modifié. Revvoir appium:noReset et appium:fullReset pour l'exécution souhaitée

Lorsqu'une session refuse de démarrer, consultez les instructions suivantes : Appium journal du serveur plutôt que la pile client trace. Le serveur indique la capacité qu'il n'a pas pu satisfaire, et cette ligne nomme la solution.

FAQ

Non. platformName et browserName sont des fonctionnalités standard du W3C et ne sont pas préfixées. Toutes les autres Appium La capacité, y compris deviceName et platformVersion, est une extension du fournisseur et nécessite le préfixe appium:.

Les outils d'apprentissage automatique déployés dans les clouds de périphériques suggèrent un ensemble de capacités à partir de la configuration et du périphérique cible, et signalent les valeurs ayant échoué lors de sessions similaires. Considérez le résultat comme une ébauche et vérifiez chaque nom dans la documentation du pilote.

Copilot remplit les blocs de capacités communs, mais il a été entraîné sur un grand nombre de Appium Le code 1 omet souvent le préfixe ou suggère la classe obsolète DesiredCapabilities. Vérifiez chaque suggestion par rapport au guide actuel.

appPackage nomme le package Appium lance. appWaitPackage nomme le package Appium attend d'apparaître avant de rendre le contrôle, ce qui est important lorsqu'un lanceur ou un écran de démarrage charge d'abord un autre package.

platformName est défini sur iOS et appium:automationName sur XCUITest. Le pilote XCUITest requiert également au moins l'un des éléments suivants : appium:app, appium:bundleId ou browserName ; à défaut, une session s'ouvre sur l'écran d'accueil.

Le nombre de secondes pendant lesquelles le serveur attend que le client envoie sa prochaine commande. Si ce délai est dépassé, le serveur considère que le client est déconnecté et ferme la session, ce qui peut souvent être interprété comme une panne aléatoire.

L'option noReset ignore la réinitialisation habituelle, ce qui permet aux données de l'application de rester actives après la session. L'option fullReset ajoute des étapes supplémentaires (désinstallation et réinstallation) pour une reproductibilité maximale. Ces deux options sont désactivées par défaut et ne doivent pas être activées simultanément.

Non. Les capacités sont des paramètres de démarrage de session et sont figés une fois la session créée. Lorsqu'un pilote permet de modifier un comportement en cours de session, il expose un paramètre via l'API Settings.

Résumez cet article avec :