Appium Ønskede evner til Android emulator

⚡ Smart opsummering

Ønskede egenskaber er nøgle-værdi-parrene Appium klienten sender en meddelelse, når den åbner en session, og fortæller serveren, hvilken platform, enhed, driver og applikation den automatiserede test skal køre mod.

  • ???? Session contract: Funktioner overføres i JSON-brødteksten i den nye sessionsanmodning og kan ikke ændres bagefter.
  • ☑️ Android det væsentlige: appPackage og appActivity navngiver applikationen og skærmen Appium bør lanceres.
  • Ventevarianter: appWaitPackage og appWaitActivity dækker over velkomstskærme, der vises før det rigtige indgangspunkt.
  • 🧪 Appium 2 præfikser: Enhver ikke-standardfunktion kræver nu appium: vendor-præfikset, ellers afviser serveren det.
  • 🛠️ Moderne Java klient: DesiredCapabilities gav plads til UiAutomator2Options og XCUITestOptions under Selenium 4.
  • 📊 Find værdier: En adb dumpsys-forespørgsel eller PackageManager-klassen afslører pakke- og aktivitetsnavnene.

Appium ønskede funktioner nøgle-værdipar for en Android emulatorsession

Hvad er ønskede egenskaber

'Ønskede funktioner' hjælper os med at ændre serverens adfærd under automatisering. Appium Det er en hashmap, eller et nøgle-værdi-par, der bruges til at sende en kommando til Appium server, hvor hver klientkommando kører i konteksten af ​​en session.

For eksempel sender en klient en POST /session-anmodning, der indeholder et JSON-objekt, til Appium serveren.

Så for at sende en anmodning eller opretholde en session med serveren bruges et sæt nøgle- og værdipar. Dette kaldes 'ønskede funktioner'.

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

Vigtig rolle for ønsket evne

  • 'DesiredCapabilities' hjælper brugeren med at kontrollere sessionsanmodningen med serveren. For eksempel, for en iOS-session sætter vi kapaciteten platformName = iOS, og for en Android sessionsplatformnavn = Android.
  • 'DesiredCapabilities' bruges til at konfigurere WebDriver-instansen, for eksempel FirefoxDriver, ChromeDriver eller InternetExplorerDriver.
  • DesiredCapability er meget nyttig til Selenium Grid. For eksempel bruges det til at køre forskellige testcases på en anden browser og et andet operativsystem. Baseret på den angivne funktion peger Grid-hubben på den tilsvarende node. Noder defineres ved hjælp af 'set'-egenskabsmetoderne:
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • En ønsket funktion er en biblioteksdefineret pakke. Før 'DesiredCapabilities' kan bruges, skal den importeres fra biblioteket nedenfor.
    Org.openqa.selenium.remote.DesiredCapabilities

Appium understøtter begge dele Android og iOS, så der er et separat sæt af Appium serverfunktioner for hver platform.

Tabellen nedenfor viser nogle almindeligt anvendte Android evner og værdier, der skal anvendes.

Capabilities Beskrivelse Værdier/anvendelser
appPakke Ring til den ønskede Java pakke i Android som brugeren ønsker at køre

Værdi= com.example.myapp/

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

appAktivitet Programaktivitet, som brugeren ønsker at starte fra pakken.

Værdi= MainActivity, .Settings

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

appWaitPackage Pakke som applikationen skal vente på Value=com.example.android.myapp
appWaitActivity Enhver Android aktivitet som brugeren skal vente på

Værdi= SplashActivity

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

BEMÆRK: se Appium dokumentation for at se mere Android kapaciteter.

Tabellen nedenfor viser nogle almindeligt anvendte iOS-funktioner og de værdier, der skal bruges.

Capabilities Beskrivelse Værdier
StartTimeout Samlet tid (i ms) til at vente på instrumentering. 2000
UDID Sådan identificerer du det unikke enhedsnummer på en tilsluttet fysisk enhed 166aestu4

BEMÆRK: se Appium vejledning til kapaciteter for at se flere iOS-funktioner.

Hvordan ønskede evner ændrede sig i Appium 2

Eksemplerne ovenfor stammer fra Appium 1 æra og viser stadig formen af ​​et evnesæt, men to regler er ændret, og begge vil forhindre en moderne session i at starte.

For det første definerer W3C WebDriver-specifikationen kun et lille sæt standardfunktioner, hvoraf platformName og browserName betyder noget her. Enhver anden funktion er en leverandørudvidelse og skal have et navnerumspræfiks, der ender på et kolon. Appium's præfiks er appium:. Så deviceName bliver appium:deviceName og platformVersion bliver appium:platformVersion. Appium 2 kræver også appium:automationName, fordi drivere installeres separat i stedet for at være bundtet med serveren.

For det andet bliver det kedeligt at gentage præfikset, så Appium accepterer en enkelt appium:options Funktion, hvis værdi er et objekt. Funktioner inden for det pågældende objekt behøver intet præfiks, og hvor et navn forekommer både inden for og uden for objektet, vinder den indre værdi.

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

⚠️ Versionsnotat: på den Java side, Selenium 4 og Appium Java klient 8 udfasede DesiredCapabilities klasse vist tidligere. Driverspecifikke builders arvet fra BaseOptions udskift den – UiAutomator2Options forum Android og XCUITestOptions til iOS — med et en-til-en-kortping fra hver gammel setCapability opkald. Den originale kode ovenfor er bevaret her som et historisk eksempel.

ExtracInformation om pakker og aktiviteter

Pakker er bundtede filer eller klasser. De giver en organiseret struktur til modulær programmering. Java, forskellige pakker gemmes i en enkelt JAR-fil, og brugeren kan kalde den JAR-fil for fuld udførelse. Et lignende koncept følges i udvikling af mobilapplikationer.

I Android operativsystem, alle applikationer installeres i form af Java pakker. Så, for eksempeltract pakkestioplysninger, den Android PackageManager-klassen bruges.

Den henter pakke- og aktivitetsoplysninger for forudinstallerede og efterinstallerede applikationer på enheden.

Du kan få en instans af PackageManager-klassen ved at kalde getPackageManager(). Denne metode kan tilgå og manipulere pakkerne og relaterede tilladelser for de installerede applikationer.

For eksempel:

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

Sådan finder du appPackage og appActivity med adb

PackageManager-ruten ovenfor fungerer indefra en applikation. Som tester har du normalt kun den installerede build, så den hurtigste vej er en forespørgsel over adb mod en tilsluttet enhed eller emulator.

Åbn applikationen på enheden manuelt, og kør derefter en af ​​kommandoerne nedenfor fra en terminal i mappen platform-tools. Kommandoen udskriver det vindue, der aktuelt har fokus, og værdien formateres som package/activity.

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

Brug den første formular i Windows kommandoprompten og den anden i en Unix-shell eller Git Bash. Læs resultatet som to halvdele: alt før skråstregen er værdien for appPackage, og alt efter det er værdien for appActivity.

To forholdsregler gælder. Den fokuserede aktivitet er det, der er på skærmen i det øjeblik, hvilket ikke altid er den aktivitet, applikationen starter med – hvis en session mislykkes under driverinitialisering, skal du starte appen på ny og aflæse værdien igen. Og hvis der vises et velkomstskærmbillede først, vil indtastningsaktiviteten afvige fra den, du til sidst vil gøre krav på, hvilket netop er tilfældet. appWaitActivity findes for.

Et visuelt alternativ er uiautomatorviewer, som indfanger det aktuelle skærmhierarki og viser pakken og klassen for hver node.

Almindelige fejl vedrørende ønskede funktioner og hvordan man retter dem

De fleste mislykkedes Appium sessioner slutter, før et enkelt testtrin kører, og årsagen ligger næsten altid i funktionssættet snarere end i testen. Tabellen nedenfor knytter hver meddelelse til dens sædvanlige løsning.

Besked Sandsynlig årsag Fix
Ugyldig eller ikke-understøttet WebDriver-funktion En ikke-standardfunktion blev sendt uden leverandørpræfikset Tilføj appium: til den, eller flyt den inden for appium:options
De ønskede funktioner skal indeholde enten et automationName eller et platformName Appium 2 kan ikke vælge en chauffør Angiv platformName og appium:automationName eksplicit
Appen kan ikke startes. Oprindelig fejl: Aktiviteten, der blev brugt til at starte appen, findes ikke. appActivity matcher ikke manifestet Genlæs værdien med dumpsys-kommandoen ovenfor
Sessionen startede ikke: ingen enheder fundet Der er ikke tilsluttet nogen emulator eller håndsæt Bekræft enheden med adb-enheder før lancering
En ny session kunne ikke oprettes efter timeout En velkomstskærm forsinker indtastningsaktiviteten Indstil appWaitActivity og opret appWaitDuration
Applikationstilstand nulstilles ikke mellem kørsler Standard nulstillingsadfærd blev tilsidesat Revse appium:noReset og appium:fullReset for den ønskede kørsel

Når en session nægter at starte, skal du læse Appium serverlog i stedet for klientstakken trace. Serveren angiver, hvilken funktion den ikke kunne opfylde, og den linje navngiver rettelsen.

Ofte Stillede Spørgsmål

Nej. platformName og browserName er standard W3C-funktioner og forbliver uden præfiks. Hver anden Appium funktionaliteten, inklusive deviceName og platformVersion, er en leverandørudvidelse og kræver præfikset appium:.

Maskinlæringsværktøjer i enhedsskyer foreslår et funktionssæt fra build- og målenheden og markerer værdier, der mislykkedes i lignende sessioner. Behandl outputtet som et udkast, og bekræft hvert navn i forhold til driverdokumentationen.

Copilot fuldfører almindelige kapacitetsblokke, men den blev trænet på mange Appium 1-kode og udelader ofte præfikset eller foreslår den forældede DesiredCapabilities-klasse. Sammenlign hvert forslag med den aktuelle vejledning.

appPackage navngiver pakken Appium starter. appWaitPackage navngiver pakken Appium venter på at blive vist, før kontrollen returneres, hvilket er vigtigt, når en launcher eller et velkomstskærmbillede indlæser en anden pakke først.

platformName indstillet til iOS og appium:automationName indstillet til XCUITest. XCUITest-driveren skal også bruge mindst én af følgende: appium:app, appium:bundleId eller browserName, ellers åbner den en session på startskærmen.

Det antal sekunder, serveren venter på, at klienten sender sin næste kommando. Hvis ventetiden overskrides, antager serveren, at klienten er væk, og lukker sessionen ned, hvilket ofte ligner en tilfældig fejl.

noReset springer den sædvanlige nulstilling over, så appdata overlever sessionen. fullReset tilføjer ekstra trin, afinstallation og geninstallation, for maksimal reproducerbarhed. Begge er som standard indstillet til falsk og bør ikke aktiveres sammen.

Nej. Funktioner er parametre for at starte sessionen og er faste, når den er oprettet. Hvor en driver tillader en adfærd at ændre sig midt i sessionen, eksponeres en indstilling via Settings API'en i stedet.

Opsummer dette indlæg med: