Appium, WebDriver protokolüne dayalı mobil, web ve masaüstü uygulamalarının test otomasyonu için platformlar arası bir framework'tür. Herhangi bir programlama dilinde test yazmanıza ve kodu değiştirmeden Android, iOS ve Windows üzerinde çalıştırmanıza olanak tanır. Appium Foundation, 2025'e göre, WebDriver protokolü farklı platformlardaki uygulamalarla etkileşim için birleşik bir arayüz sağlar.
Anahtar Noktalar
Appium, istemci-sunucu mimarisi üzerine inşa edilmiş mobil uygulama test otomasyonu için açık kaynaklı bir framework'tür. Appium sunucusu, WebDriver protokolü aracılığıyla istemciden komutları alır ve bunları yerel sürücülere iletir: iOS için XCUITest, Android için UiAutomator2 ve Windows için WinAppDriver.
Appium 2013 yılında oluşturuldu ve o zamandan beri platformlar arası test için endüstri standardı haline geldi. Proje Appium Foundation tarafından yönetilmekte ve büyük şirketler tarafından desteklenmektedir: Sauce Labs, HeadSpin, Microsoft. Dünya çapında her ay 500 binden fazla test uzmanı Appium kullanmaktadır.
Appium üç tür uygulamayı destekler: yerel (iOS, Android, Windows), mobil web tarayıcıları (Safari, Chrome) ve hibrit uygulamalar (yerel kabuk içinde WebView). Her tür kendi bağlamını kullanır: NATIVE_APP, WEBVIEW veya CHROMIUM.
Appium mimarisi dört katmandan oluşur: istemci kodu → Appium İstemci Kütüphanesi → Appium Sunucusu → yerel sürücü. İstemci kütüphanesi WebDriver protokolünü uygular ve sunucuya HTTP istekleri gönderir. Sunucu bunları platformun yerel sürücü komutlarına dönüştürür.
WebDriver, Appium tarafından mobil cihazlar için uyarlanmış, tarayıcı otomasyonu için W3C standardıdır. Her eylem — öğe arama, dokunma, metin girişi — sunucuya bir HTTP isteği olarak gönderilir. Örneğin, POST /session/{id}/element yeni bir test oturumu oluşturur.
Her test, Desired Capabilities nesnesi aracılığıyla bir oturum oluşturarak başlar. Şunları belirtir: platformName, deviceName, appPath, automationName ve ek parametreler. Appium, uygun yerel sürücüyü ve cihaz yapılandırmasını seçmek için bu verileri kullanır.
# Android için Desired Capabilities Örneği
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)
Appium npm aracılığıyla kurulur: npm install -g appium. Kurulumdan sonra, her platform için yerel sürücüleri yapılandırmanız gerekir: appium driver install xcuitest ve appium driver install uiautomator2. iOS için Xcode ve Android için Android SDK gereklidir.
Appium Inspector, kullanıcı arayüzü öğelerini denetlemek için grafiksel bir araçtır. Çalışan bir Appium sunucusuna bağlanır ve UI bileşenlerinin hiyerarşisini, özniteliklerini ve konumlandırıcılarını gösterir. Inspector, bir test yazmadan önce seçiciyi doğrulamanıza olanak tanır.
Appium sunucusu, isteğe bağlı parametrelerle (bağlantı noktası, adres, günlük kaydı) appium komutuyla başlatılır. Varsayılan olarak sunucu, 4723 bağlantı noktasını dinler. Birden çok cihazda paralel yürütme için farklı bağlantı noktaları veya Appium kümeleri kullanılır.
# Günlük Kaydıyla Appium Sunucusunu Başlatma
appium \
--port 4723 \
--log-level debug \
--use-plugins images \
--base-path /wd/hub
Appium testleri, kod organizasyonu için Page Object desenini kullanır. Her uygulama ekranı, öğe konumlandırıcıları ve etkileşim yöntemleriyle ayrı bir sınıfla tanımlanır. Page Object Model, arayüz değiştiğinde test bakımını basitleştirir ve test senaryoları arasında seçicileri yeniden kullanır.
Appium birçok öğe arama stratejisini destekler: id, xpath, accessibilityId, className, androidUIAutomator ve iOSClassChain. En çok tercih edilenler accessibilityId ve id'dir — düzen değişikliklerine rağmen kararlıdırlar. XPath yalnızca diğer konumlandırıcılar mevcut olmadığında kullanılmalıdır.
// Giriş Ekranı için Page Object
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, TouchAction sınıfı veya W3C Actions API aracılığıyla karmaşık hareketleri destekler: kaydırma, çoklu dokunma, uzun basma, öğeye kaydırma. Yeni W3C Actions API, standartlaştırılmış olduğu ve farklı platform sürümlerinde daha kararlı çalıştığı için yeni projeler için önerilir.
Appium sıklıkla Detox, XCUITest ve Espresso ile karşılaştırılır. Appium'un ana avantajı platformlar arası yeteneğidir: bir test değişiklik yapmadan iOS ve Android'de çalıştırılabilir. Ancak Detox, React Native için daha iyi senkronizasyon sağlar ve XCUITest/Espresso, yerel testler için daha hızlı yürütme sunar.
Appium, iOS, Android ve web için tek bir framework gerektiren projeler için uygundur. Java veya Python'da test yazan test uzmanlarının olduğu ekiplerde vazgeçilmezdir. Çok sayıda E2E testi olan React Native projeleri için otomatik senkronizasyon nedeniyle Detox'u değerlendirin.
| Framework | Yaklaşım | Hız | Platformlar Arası |
|---|---|---|---|
| Appium | Kara kutu | Orta | iOS, Android, Windows |
| Detox | Gri kutu | Yüksek | iOS + Android (React Native) |
| XCUITest | Beyaz kutu | Yüksek | Yalnızca iOS |
Appium Grid, birden çok cihazda aynı anda paralel test çalıştırmak için bir uzantıdır. Appium Grid, Selenium Grid üzerine inşa edilmiştir ve her biri kendi cihaz veya öykünücü kümesini yöneten birden çok Appium sunucusu arasında testleri dağıtmaya olanak tanır. Bu, tek bir cihazda regresyon testinin saatler sürdüğü büyük projeler için kritiktir — Grid, süreyi düğüm sayısıyla orantılı olarak dakikalara indirir.
Grid yapılandırması, cihazlarla düğümleri tanımlayan bir JSON yapılandırma dosyası kullanır. Her düğüm şunları belirtir: sunucu bağlantı noktası, platformlu cihaz listesi, işletim sistemi sürümü ve maksimum oturum sayısı. Hub, testleri boş düğümlere dağıtarak maksimum altyapı kullanımını sağlar.
{
"capabilities": [
{
"browserName": "android",
"platformName": "Android",
"deviceName": "Pixel_4",
"platformVersion": "14.0",
"maxInstances": 2
}
],
"configuration": {
"port": 4724,
"registerCycle": 5000
}
}
Kendi cihaz altyapınız mevcut değilse, bulut hizmetleri vardır: Sauce Labs, BrowserStack, LambdaTest. Bulutta yüzlerce gerçek cihaz ve öykünücü sağlarlar. Appium ile entegrasyon minimumdur: localhost yerine Desired Capabilities'de bulut hub URL'sini ve kimlik bilgilerini belirtmeniz yeterlidir.
Appium, TestNG (Java) veya pytest-xdist (Python) kullanarak paralel test yürütmeyi destekler. Paralelleştirme, her oturum için benzersiz bağlantı noktaları ve yalıtılmış test verileri gerektirir. Her iş parçacığı, ayrı bir cihaz veya öykünücüde kendi Appium oturumunu başlatır. Bulut hizmetleri kullanıldığında, paralelleştirme otomatiktir — platform, testleri mevcut cihazlara dağıtır ve tamamlandıktan sonra serbest bırakır.
Appium ile sorunlarla karşılaşıldığında, ilk adım sunucu günlüğünü kontrol etmektir (appium --log-level debug). Tipik hatalar: bağlantı noktası meşgul (başka bir --port belirtin), uyumsuz sürücü sürümü, eksik Android SDK veya Xcode. iOS için WebKitAgent'ın çalıştığından ve simülatöre erişimi olduğundan emin olun.
Appium bir öğe bulamazsa, şunları kontrol edin: bağlam doğru mu (NATIVE_APP vs WEBVIEW), öğe ekranda görünüyor mu, kaydırma gerektiriyor mu ve konumlandırıcı doğru mu. Bunları teste eklemeden önce etkileşimli arama ve XPath ifadelerini kontrol etmek için Appium Inspector kullanın. WebDriverWait aracılığıyla öğe görünürlüğünü beklemeyi etkinleştirmek de yararlıdır — bu, yavaş UI yüklenmesiyle ilgili senkronizasyon sorunlarını çözer.
Uygun olmayan oturum sonlandırma, Appium test kararsızlığının yaygın bir nedenidir. Sürücüyü her zaman bir finally bloğunda veya AutoCloseable aracılığıyla kapatın. Başarısızlık durumunda, zorla driver.quit() kullanın. iOS için, WebKitAgent'ın (WDA) oturumlar arasında yeniden başladığından emin olun, aksi takdirde oturum oluşturulamadı hatası oluşabilir. CI'da oturum durumunu izlemek için, çalışan tüm testlerin durumunu gerçek zamanlı olarak görselleştiren Appium Dashboard eklentisini bağlamak uygundur.
Test kararlılığını iyileştirmek için şunları kullanın: shouldTerminateApp (testler arasında uygulamayı sonlandır), noReset (oturumlar arasında verileri koru), autoGrantPermissions (sistem diyaloglarına otomatik izin ver). Ayrıca Geliştirici Seçenekleri aracılığıyla cihazda animasyonları devre dışı bırakmanız önerilir.
Sıkça Sorulan Sorular
Appium, istemci kütüphaneleri aracılığıyla tüm popüler dilleri destekler: Java, Python, JavaScript, Ruby, C#, PHP ve Kotlin. Her kütüphane aynı WebDriver protokolünü uygular ve herhangi bir dilde platformlar arası test yazmanıza olanak tanır.
Hayır, Appium hem gerçek cihazlarla hem de öykünücüler ve simülatörlerle çalışır. Android için Android Studio öykünücüleri, iOS için Xcode simülatörleri kullanılır. Gerçek cihazlar yalnızca donanım işlevlerini test etmek için gereklidir: sensörler, NFC, kamera.
Appium 2, eklentiler ve ayrı sürücülerle modüler bir mimariyle tamamen yeniden yazılmıştır. Appium 1'de tüm sürücüler sunucuya entegre edilmişti. Appium 2, sürücüleri yüklemek için appium driver install ve eklentiler için appium plugin install komutlarını kullanır.
Appium arama stratejileri kullanır: By.id, By.xpath, By.accessibilityId, By.className, By.androidUIAutomator ve By.iOSClassChain. Hız için accessibilityId kullanılması önerilir — kararlıdır ve düzen değişikliklerine bağlı değildir.
Evet, Appium mobil tarayıcıları test etmeyi destekler — iOS'ta Safari ve Android'de Chrome. Bunun için WEBVIEW veya CHROMIUM bağlamı kullanılır. Testler, Selenium'a benzer şekilde standart WebDriver aracılığıyla tarayıcıda çalışır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun