Appium Önskad kapacitet för Android emulator

⚡ Smart sammanfattning

Önskade förmågor är nyckel-värde-paren Appium klienten skickar när den öppnar en session och anger för servern vilken plattform, enhet, drivrutin och applikation det automatiserade testet ska köras mot.

  • ???? Sessionskontract: Funktioner överförs i JSON-texten i den nya sessionsbegäran och kan inte ändras i efterhand.
  • ☑️ Android väsentligheter: appPackage och appActivity namnger applikationen och skärmen Appium borde lanseras.
  • Väntevarianter: appWaitPackage och appWaitActivity täcker välkomstskärmar som visas före den verkliga startpunkten.
  • 🧪 Appium 2 prefix: Varje icke-standardiserad funktion behöver nu prefixet appium: vendor, annars avvisar servern det.
  • 🛠️ Modern Konst Java klient: DesiredCapabilities fick ge vika för UiAutomator2Options och XCUITestOptions under Selenium 4.
  • 📊 Hitta värden: En adb dumpsys-fråga eller PackageManager-klassen visar paket- och aktivitetsnamnen.

Appium nyckel-värdepar för önskade funktioner för en Android emulatorsession

Vad är önskade förmågor

'Önskade funktioner' hjälper oss att modifiera serverns beteende under automatisering. Appium Det är en hashmapp, eller ett nyckel-värde-par, som används för att skicka ett kommando till Appium server, där varje klientkommando körs i kontexten av en session.

Till exempel skickar en klient en POST /session-förfrågan som innehåller ett JSON-objekt till Appium servern.

Så, för att skicka en förfrågan eller upprätthålla en session med servern används en uppsättning nyckel- och värdepar. Detta kallas "önskade 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");
}

Viktig roll för önskad förmåga

  • 'DesiredCapabilities' hjälper användaren att kontrollera sessionsförfrågan med servern. Till exempel, för en iOS-session ställer vi in ​​kapaciteten platformName = iOS, och för en Android sessionsplattformnamn = Android.
  • 'DesiredCapabilities' används för att konfigurera WebDriver-instansen, till exempel FirefoxDrivrutin, Chrome-drivrutin eller InternetExplorer-drivrutin.
  • DesiredCapability är mycket användbart för Selenium Grid. Till exempel används det för att köra olika testfall i olika webbläsare och operativsystem. Baserat på den angivna funktionen pekar Grid-hubben på motsvarande nod. Noder definieras med hjälp av egenskapsmetoderna 'set':
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • En önskad funktion är ett biblioteksdefinierat paket. Innan 'DesiredCapabilities' används bör det importeras från biblioteket nedan.
    Org.openqa.selenium.remote.DesiredCapabilities

Appium stöder båda Android och iOS, så det finns en separat uppsättning Appium serverkapacitet för varje plattform.

Tabellen nedan visar några vanligt förekommande Android förmågor och de värden som ska användas.

Capabilities BESKRIVNING Värden/Användningar
apppaket Ring önskad Java paket i Android som användaren vill köra

Value= com.example.myapp/

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

appAktivitet Programaktivitet som användaren vill starta från paketet.

Värde= MainActivity, .Settings

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

appWaitPackage Paket som programmet behöver vänta på Value=com.example.android.myapp
appWaitActivity Vilken som helst Android aktivitet som användaren behöver vänta på

Värde= SplashActivity

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

OBS: se Appium dokumentation för att se mer Android kapacitet.

Tabellen nedan visar några vanliga iOS-funktioner och de värden som ska användas.

Capabilities BESKRIVNING Värden
LaunchTimeout Total tid (i ms) att vänta på instrumentering. 2000
DU GJORDE För att identifiera det unika enhetsnumret för en ansluten fysisk enhet 166aestu4

OBS: se Appium funktionsguide för att se fler iOS-funktioner.

Hur önskade förmågor förändrades i Appium 2

Exemplen ovan kommer från Appium 1 era och visar fortfarande formen av en förmågoruppsättning, men två regler har ändrats och båda kommer att stoppa en modern session från att starta.

För det första definierar W3C WebDriver-specifikationen endast en liten uppsättning standardfunktioner, av vilka platformName och browserName spelar roll här. Alla andra funktioner är en leverantörsutökning och måste ha ett namnrymdsprefix som slutar med ett kolon. Appiums prefix är appium:. Så deviceName blir appium:deviceName och platformVersion blir appium:platformVersion. Appium 2 kräver också appium:automationName, eftersom drivrutiner installeras separat snarare än att medfölja servern.

För det andra blir det tråkigt att upprepa prefixet, så Appium accepterar en enda appium:options Funktion vars värde är ett objekt. Funktioner inuti det objektet behöver inget prefix, och om ett namn förekommer både inuti och utanför objektet vinner det inre värdet.

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

⚠️ Versionsnotering: på Java sida, Selenium 4 och Appium Java klient 8 avfärdade DesiredCapabilities klass som visats tidigare. Drivrutinsspecifika byggare ärvda från BaseOptions ersätt den — UiAutomator2Options för Android och XCUITestOptions för iOS — med en en-till-en-kartaping från varje gammal setCapability anrop. Den ursprungliga koden ovan behålls här som ett historiskt exempel.

ExtracInformation om paket och aktiviteter

Paket är paketerade filer eller klasser. De ger en organiserad struktur till modulär programmering. Java, lagras olika paket i en enda JAR-fil, och användaren kan anropa den JAR-filen för fullständig exekvering. Ett liknande koncept följs inom utveckling av mobilapplikationer.

I Android operativsystem, alla applikationer installeras i form av Java paket. Så, till exempeltract paketets sökvägsinformation, Android PackageManager-klassen används.

Den hämtar paket- och aktivitetsinformation för förinstallerade och efterinstallerade applikationer på enheten.

Du kan hämta en instans av PackageManager-klassen genom att anropa getPackageManager(). Den här metoden kan komma åt och manipulera paketen och relaterade behörigheter för de installerade applikationerna.

Till exempel:

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

Hur man hittar appPackage och appActivity med adb

PackageManager-rutten ovan fungerar inifrån en applikation. Som testare har du vanligtvis bara den installerade versionen, så den snabbare vägen är en fråga över adb mot en ansluten enhet eller emulator.

Öppna programmet på enheten manuellt och kör sedan ett av kommandona nedan från en terminal i mappen platform-tools. Kommandot skriver ut det fönster som för närvarande har fokus och värdet formateras som package/activity.

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

Använd den första formuläret i Windows kommandotolken och den andra i ett Unix-skal eller Git Bash. Läs resultatet som två halvor: allt före snedstrecket är värdet för appPackage, och allt efter det är värdet för appActivity.

Två försiktighetsåtgärder gäller. Den fokuserade aktiviteten är det som visas på skärmen just då, vilket inte alltid är den aktivitet som applikationen startar med – om en session misslyckas under drivrutininitieringen, starta appen på nytt och läs värdet igen. Och om en välkomstskärm visas först kommer inmatningsaktiviteten att skilja sig från den du slutligen vill göra anspråk på, vilket är exakt fallet. appWaitActivity finns för.

Ett visuellt alternativ är uiautomatorviewer, som fångar den aktuella skärmhierarkin och visar paketet och klassen för varje nod.

Vanliga fel gällande önskade funktioner och hur man åtgärdar dem

De flesta misslyckades Appium sessioner avslutas innan ett enda teststeg körs, och orsaken ligger nästan alltid i funktionsuppsättningen snarare än i testet. Tabellen nedan mappar varje meddelande till dess vanliga åtgärd.

Meddelande Trolig orsak Fast
Ogiltig eller ounderstödd WebDriver-funktion En icke-standardfunktion skickades utan leverantörsprefixet Lägg till appium: till den, eller flytta den inuti appium:options
De önskade funktionerna måste innehålla antingen ett automationName eller ett platformName Appium 2 kan inte välja en förare Ange platformName och appium:automationName explicit
Kan inte starta appen. Ursprungligt fel: aktiviteten som användes för att starta appen finns inte. appActivity matchar inte manifestet Läs om värdet med dumpsys-kommandot ovan
Sessionen startade inte: inga enheter hittades Ingen emulator eller handenhet är ansluten Bekräfta enheten med adb-enheter innan du startar
En ny session kunde inte skapas efter tidsgränsen. En välkomstskärm fördröjer inmatningsaktiviteten Ställ in appWaitActivity och generera appWaitDuration
Applikationens tillstånd återställs inte mellan körningar Standardåterställningsbeteendet åsidosattes Revvisa appium:noReset och appium:fullReset för den körning du vill ha

När en session vägrar att starta, läs Appium serverloggen snarare än klientstacken trace. Servern anger vilken funktion den inte kunde uppfylla, och den raden anger lösningen.

Vanliga frågor

Nej. platformName och browserName är standardfunktioner hos W3C och förblir utan prefix. Varannan Appium funktionalitet, inklusive deviceName och platformVersion, är ett leverantörstillägg och behöver prefixet appium:.

Maskininlärningsverktyg i enhetsmoln föreslår en funktionsuppsättning från bygg- och målenheten och flaggar värden som misslyckades i liknande sessioner. Behandla utdata som ett utkast och bekräfta varje namn mot drivrutinsdokumentationen.

Copilot slutför vanliga förmågor, men den tränades på många Appium 1-kod och utelämnar ofta prefixet eller föreslår den föråldrade DesiredCapabilities-klassen. Kontrollera varje förslag mot den aktuella guiden.

appPackage namnger paketet Appium startar. appWaitPackage namnger paketet Appium väntar på att visas innan kontrollen återförs, vilket spelar roll när en startskärm eller välkomstskärm laddar ett annat paket först.

platformName inställt på iOS och appium:automationName inställt på XCUITest. XCUITest-drivrutinen behöver också minst en av appium:app, appium:bundleId eller browserName, annars öppnas en session på startskärmen.

Antalet sekunder som servern väntar på att klienten ska skicka sitt nästa kommando. Om väntetiden överskrids antar servern att klienten är borta och stänger av sessionen, vilket ofta ser ut som ett slumpmässigt fel.

noReset hoppar över den vanliga återställningen så att appdata överlever sessionen. fullReset lägger till extra steg, avinstallation och ominstallation, för maximal reproducerbarhet. Båda har standardvärdet falskt och bör inte aktiveras tillsammans.

Nej. Funktioner är parametrar för att starta sessionen och är fasta när den skapas. Om en drivrutin tillåter att ett beteende ändras mitt i sessionen exponerar den istället en inställning via inställnings-API:et.

Sammanfatta detta inlägg med: