Appium Gewünschte Fähigkeiten für Android Emulator

⚡ Intelligente Zusammenfassung

Die gewünschten Fähigkeiten sind die Schlüssel-Wert-Paare. Appium Der Client sendet beim Öffnen einer Sitzung eine Nachricht an den Server, in der er mitteilt, auf welcher Plattform, welchem ​​Gerät, welchem ​​Treiber und welcher Anwendung der automatisierte Test ausgeführt werden soll.

  • ???? Sitzungtract: Die Berechtigungen werden im JSON-Body der Anfrage zur neuen Sitzung übermittelt und können anschließend nicht mehr geändert werden.
  • ☑️ Android Wesentliches: appPackage und appActivity benennen die Anwendung und den Bildschirm Appium sollte starten.
  • Wartevarianten: appWaitPackage und appWaitActivity umfassen Splash-Screens, die vor dem eigentlichen Einstiegspunkt angezeigt werden.
  • 🧪 Appium 2. Präfix: Jede nicht standardmäßige Funktion benötigt nun das Präfix appium: vendor, andernfalls wird sie vom Server abgelehnt.
  • Modernes Java Klient: DesiredCapabilities wurde durch UiAutomator2Options und XCUITestOptions ersetzt. Selenium 4.
  • 📊 Werte ermitteln: Eine adb dumpsys-Abfrage oder die PackageManager-Klasse zeigt die Paket- und Aktivitätsnamen an.

Appium gewünschte Fähigkeiten-Schlüssel-Wert-Paare für ein Android Emulatorsitzung

Was sind gewünschte Fähigkeiten?

Die „gewünschten Fähigkeiten“ helfen uns, das Verhalten des Servers während der Automatisierung anzupassen. Appium Es handelt sich um eine Hashmap oder ein Schlüssel-Wert-Paar, das verwendet wird, um einen Befehl an den/die/das zu senden. Appium Server, auf dem jeder Client-Befehl im Kontext einer Sitzung ausgeführt wird.

Ein Client sendet beispielsweise eine POST-Anfrage an die /session-Schnittstelle, die ein JSON-Objekt enthält. Appium Server.

Um eine Anfrage zu senden oder eine Sitzung mit dem Server aufrechtzuerhalten, wird eine Reihe von Schlüssel-Wert-Paaren verwendet. Dies wird als „erwünschte Fähigkeiten“ bezeichnet.

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

Wichtige Rolle der gewünschten Fähigkeiten

  • „DesiredCapabilities“ helfen dem Benutzer, die Sitzungsanfrage an den Server zu steuern. Beispielsweise setzen wir für eine iOS-Sitzung die Capability platformName = iOS, und für eine andere Sitzung… Android Sitzungsplattformname = Android.
  • „DesiredCapabilities“ werden verwendet, um die WebDriver-Instanz einzurichten, zum Beispiel FirefoxDriver, ChromeDriver oder InternetExplorerDriver.
  • DesiredCapability ist sehr nützlich für Selenium Grid. Es wird beispielsweise verwendet, um verschiedene Testfälle in unterschiedlichen Browsern und auf unterschiedlichen Betriebssystemen auszuführen. Basierend auf der angegebenen Funktionalität verweist der Grid-Hub auf den entsprechenden Knoten. Knoten werden mithilfe der „set“-Eigenschaftsmethoden definiert:
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • Eine gewünschte Funktion ist ein in einer Bibliothek definiertes Paket. Bevor Sie „DesiredCapabilities“ verwenden können, müssen Sie es aus der unten stehenden Bibliothek importieren.
    Org.openqa.selenium.remote.DesiredCapabilities

Appium unterstützt beide Android und iOS, daher gibt es einen separaten Satz von Appium Serverkapazitäten für jede Plattform.

Die folgende Tabelle zeigt einige häufig verwendete Android Fähigkeiten und die zu verwendenden Werte.

Kompetenzen Beschreibung Werte/Verwendungen
AppPaket Rufen Sie den gewünschten Java Paket in Android dass der Benutzer ausführen möchte

Wert= com.example.myapp/

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

AppAktivität Die Anwendungsaktivität, die der Benutzer aus dem Paket starten möchte.

Wert= MainActivity, .Settings

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

appWaitPackage Paket, auf das die Anwendung warten muss Wert=com.example.android.myapp
appWaitActivity Jedes Android Aktivität, auf die der Benutzer warten muss

Wert = SplashActivity

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

HINWEIS: siehe Appium Dokumentation um mehr zu sehen Android Funktionen.

Die folgende Tabelle zeigt einige häufig verwendete iOS-Funktionen und die zu verwendenden Werte.

Kompetenzen Beschreibung Werte
LaunchTimeout Gesamtzeit (in ms), die auf die Instrumentierung gewartet wird. 2000
DU TATEST Um die eindeutige Gerätenummer eines angeschlossenen physischen Geräts zu ermitteln 166aestu4

HINWEIS: siehe Appium Leitfaden zu den Fähigkeiten Um weitere iOS-Funktionen anzuzeigen.

Wie sich die gewünschten Fähigkeiten verändert haben Appium 2

Die obigen Beispiele stammen aus der Appium Eine Ära und zeigt immer noch die Form eines Fähigkeitssets, aber zwei Regeln haben sich geändert und beide verhindern den Start einer modernen Sitzung.

Erstens definiert die W3C WebDriver-Spezifikation nur eine kleine Anzahl von Standardfunktionen, von denen platformName und browserName Hier kommt es auf die Funktionalität an. Alle anderen Funktionen sind herstellerspezifische Erweiterungen und müssen ein Namespace-Präfix tragen, das mit einem Doppelpunkt endet. Appium's Präfix ist appium:. So deviceName wird appium:deviceName und platformVersion wird appium:platformVersion. Appium 2 erfordert außerdem appium:automationNameweil die Treiber separat installiert werden und nicht mit dem Server gebündelt sind.

Zweitens wird die Wiederholung des Präfixes auf Dauer mühsam, daher Appium akzeptiert eine einzelne appium:options Eine Fähigkeit, deren Wert ein Objekt ist. Fähigkeiten innerhalb dieses Objekts benötigen kein Präfix, und wenn ein Name sowohl innerhalb als auch außerhalb des Objekts vorkommt, hat der innere Wert Vorrang.

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

⚠️ Versionshinweis: auf die Java Seite, Selenium 4 und Appium Java Client 8 hat die veraltete DesiredCapabilities Die zuvor gezeigte Klasse. Treiberspezifische Builder, die von dieser Klasse geerbt wurden. BaseOptions Ersetzen Sie es — UiAutomator2Options für Android und XCUITestOptions für iOS – mit einer Eins-zu-Eins-Karteping von jedem alten setCapability Aufruf. Der obige Originalcode wird hier als historisches Beispiel beibehalten.

ExtracInformationen zu Reisepaketen und Aktivitäten

Pakete sind gebündelte Dateien oder Klassen. Sie verleihen der modularen Programmierung eine organisierte Struktur. JavaVerschiedene Pakete werden in einer einzigen JAR-Datei gespeichert, und der Benutzer kann diese JAR-Datei zur vollständigen Ausführung aufrufen. Ein ähnliches Konzept wird bei der Entwicklung mobiler Anwendungen verfolgt.

Im Android Betriebssystem, alle Anwendungen werden in folgender Form installiert: Java Pakete. Also, um z.B.tract Paketpfadinformationen, die Android Die PackageManager-Klasse wird verwendet.

Es ruft Paket- und Aktivitätsinformationen für vorinstallierte und nachinstallierte Anwendungen auf dem Gerät ab.

Sie können eine Instanz der Klasse PackageManager durch Aufruf von getPackageManager() erhalten. Diese Methode ermöglicht den Zugriff auf und die Bearbeitung der Pakete und zugehörigen Berechtigungen der installierten Anwendungen.

Beispielsweise:

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

Wie man appPackage und appActivity mit adb findet

Der oben beschriebene Weg über den PackageManager funktioniert innerhalb einer Anwendung. Als Tester haben Sie normalerweise nur die installierte Version zur Verfügung, daher ist die schnellere Methode eine Abfrage über adb gegen ein angeschlossenes Gerät oder einen Emulator.

Öffnen Sie die Anwendung manuell auf dem Gerät und führen Sie anschließend einen der unten stehenden Befehle in einem Terminal im Ordner „platform-tools“ aus. Der Befehl gibt das aktuell fokussierte Fenster aus, und der Wert ist wie folgt formatiert: package/activity.

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

Verwenden Sie das erste Formular in der Windows Die Eingabeaufforderung und die zweite in einer Unix-Shell oder Git Bash. Lesen Sie das Ergebnis als zwei Hälften: Alles vor dem Schrägstrich ist der Wert für appPackageund alles danach ist der Wert für appActivity.

Zwei Dinge sind zu beachten. Die relevante Aktivität ist diejenige, die in diesem Moment auf dem Bildschirm angezeigt wird. Dies ist nicht immer die Startaktivität der Anwendung. Falls eine Sitzung während der Treiberinitialisierung fehlschlägt, starten Sie die Anwendung neu und lesen Sie den Wert erneut aus. Und falls zuerst ein Startbildschirm erscheint, unterscheidet sich die Einstiegsaktivität von derjenigen, deren Wert Sie letztendlich überprüfen möchten. Genau das ist hier der Fall. appWaitActivity existiert für.

Eine visuelle Alternative ist uiautomatorviewer, das die aktuelle Bildschirmhierarchie erfasst und das Paket und die Klasse jedes Knotens anzeigt.

Häufige Fehler bei den gewünschten Funktionen und wie man sie behebt

Die meisten scheiterten Appium Die Sitzungen enden, bevor ein einziger Testschritt ausgeführt wird, und die Ursache liegt fast immer im Funktionsumfang und nicht im Test selbst. Die folgende Tabelle ordnet jeder Meldung ihre übliche Lösung zu.

Nachricht Wahrscheinliche Ursache Fixieren
Ungültige oder nicht unterstützte WebDriver-Funktion Eine nicht standardmäßige Funktion wurde ohne Herstellerpräfix gesendet. Füge appium: hinzu oder verschiebe es in appium:options.
Die gewünschten Funktionen müssen entweder einen Automatisierungsnamen oder einen Plattformnamen enthalten. Appium 2 kann keinen Fahrer auswählen Legen Sie platformName und appium:automationName explizit fest.
Die App konnte nicht gestartet werden. Ursprünglicher Fehler: Die zum Starten der App verwendete Aktivität existiert nicht. Die appActivity stimmt nicht mit dem Manifest überein. Lesen Sie den Wert mit dem obigen Befehl dumpsys erneut ein.
Sitzung konnte nicht gestartet werden: Es wurden keine Geräte gefunden. Es ist kein Emulator oder Mobilteil angeschlossen. Überprüfen Sie das Gerät vor dem Start mit adb devices.
Nach Ablauf des Timeouts konnte keine neue Sitzung erstellt werden. Ein Begrüßungsbildschirm verzögert die Einstiegsaktivität. Setze appWaitActivity und erhöhe appWaitDuration.
Der Anwendungsstatus wird zwischen den Ausführungen nicht zurückgesetzt. Das Standardverhalten beim Zurücksetzen wurde überschrieben. RevSchauen Sie sich appium:noReset und appium:fullReset für den gewünschten Lauf an.

Wenn eine Sitzung nicht startet, lesen Sie die Appium Serverprotokoll anstatt des Client-Stacks trace. Der Server gibt an, welche Fähigkeit er nicht erfüllen konnte, und in dieser Zeile wird die Lösung genannt.

Häufig gestellte Fragen

Nein. platformName und browserName sind Standard-W3C-Funktionen und bleiben ohne Präfix. Alle anderen Appium Die Funktion, einschließlich deviceName und platformVersion, ist eine herstellerspezifische Erweiterung und benötigt das Präfix appium:.

Maschinelles Lernen in Geräte-Clouds schlägt anhand des Build- und Zielgeräts einen Funktionsumfang vor und kennzeichnet Werte, die in ähnlichen Sitzungen fehlgeschlagen sind. Behandeln Sie die Ausgabe als Entwurf und überprüfen Sie jeden Namen anhand der Treiberdokumentation.

Copilot erfüllt die gängigen Fähigkeitsbausteine, wurde aber auf einer Vielzahl von Systemen trainiert. Appium 1 Code und lässt oft das Präfix weg oder schlägt die veraltete Klasse DesiredCapabilities vor. Überprüfen Sie jeden Vorschlag anhand des aktuellen Leitfadens.

appPackage benennt das Paket Appium startet. appWaitPackage benennt das Paket. Appium wartet, bis es erscheint, bevor die Kontrolle zurückgegeben wird. Dies ist wichtig, wenn ein Launcher oder ein Startbildschirm zuerst ein anderes Paket lädt.

platformName muss auf iOS und appium:automationName auf XCUITest gesetzt sein. Der XCUITest-Treiber benötigt außerdem mindestens einen der folgenden Werte: appium:app, appium:bundleId oder browserName. Andernfalls öffnet er eine Sitzung auf dem Startbildschirm.

Die Anzahl der Sekunden, die der Server auf den nächsten Befehl des Clients wartet. Wird diese Wartezeit überschritten, geht der Server davon aus, dass die Verbindung zum Client abgebrochen wurde, und beendet die Sitzung, was oft wie ein zufälliger Fehler aussieht.

„noReset“ überspringt das übliche Zurücksetzen, sodass die App-Daten die Sitzung überdauern. „fullReset“ fügt zusätzliche Schritte hinzu – Deinstallation und Neuinstallation –, um eine maximale Reproduzierbarkeit zu gewährleisten. Beide Optionen sind standardmäßig deaktiviert und sollten nicht gleichzeitig aktiviert werden.

Nein. Die Capabilities sind Parameter für den Start der Sitzung und bleiben nach deren Erstellung unverändert. Wenn ein Treiber eine Verhaltensänderung während der Sitzung ermöglicht, stellt er stattdessen eine Einstellung über die Settings API bereit.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: