Appium är ett cross-platform-ramverk för automatisering av testning av mobila, webb- och skrivbordsapplikationer, baserat på WebDriver-protokollet. Det gör det möjligt att skriva tester i vilket programmeringsspråk som helst och köra dem på Android, iOS och Windows utan kodändringar. Enligt uppgifter från Appium Foundation, 2025 ger WebDriver-protokollet ett enhetligt gränssnitt för interaktion med applikationer på olika plattformar.
Huvudpunkter
Appium är ett ramverk med öppen källkod för automatisering av testning av mobila applikationer, byggt på en klient-server-arkitektur. Appium-servern tar emot kommandon från klienten via WebDriver-protokollet och vidarebefordrar dem till inbyggda drivrutiner: XCUITest för iOS, UiAutomator2 för Android och WinAppDriver för Windows.
Appium skapades 2013 och har sedan dess blivit industristandard för cross-platform-testning. Projektet hanteras av Appium Foundation och stöds av stora företag: Sauce Labs, HeadSpin, Microsoft. Varje månad använder över 500 000 testare världen över Appium.
Appium stöder tre typer av applikationer: inbyggda (iOS, Android, Windows), mobila webbläsare (Safari, Chrome) och hybridapplikationer (WebView i ett inbyggt skal). Varje typ använder sitt eget sammanhang: NATIVE_APP, WEBVIEW eller CHROMIUM.
Appium-arkitekturen består av fyra lager: klientkod → Appium Client Library → Appium Server → inbyggd drivrutin. Klientbiblioteket implementerar WebDriver-protokollet och skickar HTTP-förfrågningar till servern. Servern omvandlar dem till kommandon för plattformens inbyggda drivrutin.
WebDriver är W3C-standarden för webbläsarautomatisering, anpassad av Appium för mobila enheter. Varje åtgärd — att hitta ett element, klicka, skriva in text — skickas som en HTTP-förfrågan till servern. Till exempel skapar POST /session/{id}/element en ny testsession.
Varje test börjar med att skapa en session via objektet Desired Capabilities. I detta anges: platformName, deviceName, appPath, automationName och ytterligare parametrar. Appium använder denna data för att välja lämplig inbyggd drivrutin och konfigurera enheten.
# Exempel på Desired Capabilities för Android
desired_caps = {
'platformName': 'Android',
'deviceName': 'Pixel_4',
'app': '/path/to/app.apk',
'automationName': 'UiAutomator2',
'appPackage': 'com.example.app',
'appActivity': '.MainActivity'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
Installation av Appium görs via npm: npm install -g appium. Efter installation måste inbyggda drivrutiner konfigureras för varje plattform: appium driver install xcuitest och appium driver install uiautomator2. För iOS krävs Xcode och för Android — Android SDK.
Appium Inspector är ett grafiskt verktyg för inspektion av gränssnittselement. Det ansluter till den körda Appium-servern och visar hierarkin av UI-komponenter, deras attribut och lokaliserare. Inspector gör det möjligt att kontrollera väljaren innan testet skrivs.
Appium-servern startas med kommandot appium med valfria parametrar: port, adress, loggning. Som standard lyssnar servern på port 4723. För parallell körning av flera enheter används olika portar eller Appium-kluster.
# Starta Appium-servern med loggning
appium \
--port 4723 \
--log-level debug \
--use-plugins images \
--base-path /wd/hub
Appium-tester använder Page Object-mönstret för kodorganisation. Varje skärm i applikationen beskrivs av en separat klass med elementlokaliserare och interaktionsmetoder. Page Object Model förenklar underhållet av tester vid gränssnittsändringar och återanvänder väljare mellan testscenarier.
Appium stöder många strategier för att hitta element: id, xpath, accessibilityId, className, androidUIAutomator och iOSClassChain. Mest att föredra är accessibilityId och id — de är stabila vid layoutförändringar. XPath bör endast användas när andra lokaliserare saknas.
// Page Object för inloggningsskärmen
public class LoginPage {
private AppiumDriver driver;
private MobileElement emailField =
(MobileElement) driver.findElement(MobileBy.AccessibilityId("emailInput"));
private MobileElement passwordField =
(MobileElement) driver.findElement(MobileBy.AccessibilityId("passwordInput"));
private MobileElement loginButton =
(MobileElement) driver.findElement(MobileBy.AccessibilityId("loginButton"));
public void login(String email, String password) {
emailField.sendKeys(email);
passwordField.sendKeys(password);
loginButton.click();
}
}
Appium stöder komplexa gester via klassen TouchAction eller W3C Actions API: svep, multitouch, långa tryck, rullning till element. Det nya W3C Actions API rekommenderas för nya projekt eftersom det är standardiserat och fungerar stabilare på olika plattformsversioner.
Appium jämförs ofta med Detox, XCUITest och Espresso. Den främsta fördelen med Appium är cross-platform-förmågan: ett enda test kan köras på iOS och Android utan ändringar. Detox ger dock bättre synkronisering för React Native, och XCUITest/Espresso ger snabbare exekvering för inbyggda tester.
Appium passar för projekt som kräver ett enhetligt ramverk för iOS, Android och webb. Det är oumbärligt i team med testare som skriver i Java eller Python. För React Native-projekt med många E2E-tester är det bättre att överväga Detox på grund av automatisk synkronisering.
| Ramverk | Metod | Hastighet | Cross-platform |
|---|---|---|---|
| Appium | Black-box | Medel | iOS, Android, Windows |
| Detox | Gray-box | Hög | iOS + Android (React Native) |
| XCUITest | White-box | Hög | Endast iOS |
Appium Grid är ett tillägg för parallell körning av tester på flera enheter samtidigt. Appium Grid är byggt på Selenium Grid och gör det möjligt att distribuera tester mellan flera Appium-servrar, var och en med sin egen uppsättning enheter eller emulatorer. Detta är kritiskt för stora projekt där en regressionstest på en enda enhet tar timmar — Grid minskar tiden till minuter proportionellt mot antalet noder.
För att konfigurera Grid används en konfigurationsfil i JSON-format där noder (nodes) med enheter beskrivs. Varje nod specificerar: serverport, lista över enheter med plattform, OS-version och maximalt antal sessioner. Hub distribuerar tester till lediga noder och säkerställer maximal belastning av infrastrukturen.
{
"capabilities": [
{
"browserName": "android",
"platformName": "Android",
"deviceName": "Pixel_4",
"platformVersion": "14.0",
"maxInstances": 2
}
],
"configuration": {
"port": 4724,
"registerCycle": 5000
}
}
Om den egna enhetsinfrastrukturen inte är tillgänglig finns molntjänster: Sauce Labs, BrowserStack, LambdaTest. De erbjuder hundratals riktiga enheter och emulatorer i molnet. Integrationen med Appium är minimal: det räcker att ange URL till moln-hubben och inloggningsuppgifter i Desired Capabilities istället för localhost.
Appium stöder parallell körning av tester med TestNG (Java) eller pytest-xdist (Python). Parallellisering kräver unika portar för varje session och isolerade testdata. Varje tråd startar sin egen Appium-session på en separat enhet eller emulator. Vid användning av molntjänster är parallelliseringen automatisk — plattformen distribuerar själv testerna till tillgängliga enheter och frigör dem efter slutförande.
Vid problem med Appium är första steget att kontrollera serverloggen (appium --log-level debug). Typiska fel: porten är upptagen (ange annan --port), inkompatibel drivrutinsversion, saknad Android SDK eller Xcode. För iOS, se till att WebKitAgent körs och har åtkomst till simulatorn.
Om Appium inte hittar ett element, kontrollera: är sammanhanget korrekt (NATIVE_APP vs WEBVIEW), är elementet synligt på skärmen, kräver det rullning och är lokaliseraren korrekt. Använd Appium Inspector för interaktiv sökning och kontroll av XPath-uttryck innan du infogar dem i testet. Det är också användbart att aktivera väntan på elementets uppdykande via WebDriverWait — detta löser synkroniseringsproblem vid långsam UI-laddning.
Felaktig avslutning av sessioner är en vanlig orsak till instabilitet i Appium-tester. Stäng alltid drivrutinen i finally-blocket eller via AutoCloseable. Vid fel använd tvingad driver.quit(). För iOS, se till att WebKitAgent (WDA) startas om mellan sessionerna, annars kan felet session not created uppstå. För att övervaka sessionernas status i CI är det användbart att ansluta plugin-programmet Appium Dashboard som visualiserar status för alla pågående tester i realtid.
För att öka teststabiliteten, använd: shouldTerminateApp (avsluta applikationen mellan tester), noReset (behåll data mellan sessioner), autoGrantPermissions (automatisk beviljning av systemdialoger). Det rekommenderas också att inaktivera animationer på enheten via Developer Options.
Vanliga frågor
Appium stöder alla populära språk via klientbibliotek: Java, Python, JavaScript, Ruby, C#, PHP och Kotlin. Varje bibliotek implementerar samma WebDriver-protokoll, vilket möjliggör cross-platform-tester på vilket språk som helst.
Nej, Appium fungerar både med riktiga enheter och med emulatorer och simulatorer. För Android används Android Studio-emulatorer, för iOS — Xcode-simulatorer. Riktiga enheter behövs endast för testning av hårdvarufunktioner: sensorer, NFC, kamera.
Appium 2 har helt skrivits om med modulär arkitektur med plugin-program och separata drivrutiner. I Appium 1 var alla drivrutiner inbyggda i servern. Appium 2 använder kommandona appium driver install för att installera drivrutiner och appium plugin install för plugin-program.
Appium använder sökstrategier: By.id, By.xpath, By.accessibilityId, By.className, By.androidUIAutomator och By.iOSClassChain. För snabbhet rekommenderas accessibilityId — den är stabil och oberoende av layoutförändringar.
Ja, Appium stöder testning av mobila webbläsare — Safari på iOS och Chrome på Android. För detta används sammanhanget WEBVIEW eller CHROMIUM. Tester körs i webbläsaren via standard WebDriver, liknande Selenium.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också