Appium یک فریمورک بینپلتفرمی برای خودکارسازی تست اپلیکیشنهای موبایل، وب و دسکتاپ است که بر پایه پروتکل WebDriver ساخته شده است. این امکان را فراهم میکند تا تستها را به هر زبان برنامهنویسی بنویسید و بدون تغییر کد در Android، iOS و Windows اجرا کنید. به گزارش Appium Foundation, 2025، پروتکل WebDriver یک رابط یکپارچه برای تعامل با اپلیکیشنها در پلتفرمهای مختلف فراهم میکند.
نکات اصلی
Appium یک فریمورک متنباز برای خودکارسازی تست اپلیکیشنهای موبایل است که بر معماری کلاینت-سرور ساخته شده است. سرور Appium دستورات را از کلاینت از طریق پروتکل WebDriver دریافت میکند و به درایورهای بومی واگذار میکند: XCUITest برای iOS، UiAutomator2 برای Android و WinAppDriver برای Windows.
Appium در سال ۲۰۱۳ ایجاد شد و از آن زمان به استاندارد صنعتی برای تست بینپلتفرمی تبدیل شده است. این پروژه توسط Appium Foundation مدیریت میشود و توسط شرکتهای بزرگ پشتیبانی میشود: Sauce Labs، HeadSpin، Microsoft. ماهانه بیش از ۵۰۰ هزار تستر در سراسر جهان از Appium استفاده میکنند.
Appium از سه نوع اپلیکیشن پشتیبانی میکند: بومی (iOS, Android, Windows)، مرورگرهای وب موبایل (Safari, Chrome) و اپلیکیشنهای هیبریدی (WebView درون پوسته بومی). هر نوع از کانتکست خود استفاده میکند: NATIVE_APP، WEBVIEW یا CHROMIUM.
معماری Appium از چهار لایه تشکیل شده است: کد کلاینت → Appium Client Library → Appium Server → درایور بومی. کتابخانه کلاینت پروتکل WebDriver را پیادهسازی میکند و درخواستهای HTTP را به سرور ارسال میکند. سرور آنها را به دستورات درایور بومی پلتفرم تبدیل میکند.
WebDriver استاندارد W3C برای خودکارسازی مرورگرها است که توسط Appium برای دستگاههای موبایل تطبیق داده شده است. هر اقدام — جستجوی عنصر، کلیک، وارد کردن متن — به عنوان درخواست HTTP به سرور ارسال میشود. برای مثال POST /session/{id}/element یک جلسه تست جدید ایجاد میکند.
هر تست با ایجاد یک جلسه از طریق شی Desired Capabilities شروع میشود. در آن مشخص میشود: platformName, deviceName, appPath, automationName و پارامترهای اضافی. Appium از این دادهها برای انتخاب درایور بومی مناسب و پیکربندی دستگاه استفاده میکند.
# نمونه Desired Capabilities برای 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)
نصب Appium از طریق npm انجام میشود: npm install -g appium. پس از نصب باید درایورهای بومی برای هر پلتفرم پیکربندی شوند: appium driver install xcuitest و appium driver install uiautomator2. برای کار با iOS به Xcode و برای Android به Android SDK نیاز است.
Appium Inspector یک ابزار گرافیکی برای بازرسی عناصر رابط کاربری است. این ابزار به سرور Appium در حال اجرا متصل میشود و سلسلهمراتب کامپوننتهای UI، ویژگیها و مکانیابهای آنها را نشان میدهد. Inspector امکان بررسی سلکتور را قبل از نوشتن تست فراهم میکند.
سرور Appium با دستور appium با پارامترهای اختیاری راهاندازی میشود: پورت، آدرس، لاگگیری. به طور پیشفرض سرور به پورت ۴۷۲۳ گوش میدهد. برای اجرای همزمان چندین دستگاه از پورتهای مختلف یا کلاسترهای Appium استفاده میشود.
# راهاندازی سرور Appium با لاگگیری
appium \
--port 4723 \
--log-level debug \
--use-plugins images \
--base-path /wd/hub
تستهای Appium از الگوی Page Object برای سازماندهی کد استفاده میکنند. هر صفحه از اپلیکیشن با یک کلاس جداگانه با مکانیابهای عناصر و روشهای تعامل توصیف میشود. مدل Page Object نگهداری تستها را هنگام تغییر رابط کاربری آسانتر میکند و سلکتورها را بین سناریوهای تست بازاستفاده میکند.
Appium از استراتژیهای متعدد جستجوی عناصر پشتیبانی میکند: id, xpath, accessibilityId, className, androidUIAutomator و iOSClassChain. accessibilityId و id ترجیح داده میشوند — آنها در تغییرات چیدمان پایدار هستند. XPath فقط در صورت نبودن مکانیابهای دیگر استفاده شود.
// 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 یا W3C Actions API پشتیبانی میکند: سوایپها، چندلمسی، فشار طولانی، اسکرول به عنصر. W3C Actions API جدید برای پروژههای جدید توصیه میشود زیرا استاندارد شده و در نسخههای مختلف پلتفرمها پایدارتر عمل میکند.
Appium اغلب با Detox، XCUITest و Espresso مقایسه میشود. مزیت اصلی Appium بینپلتفرمی بودن است: یک تست را میتوان بدون تغییر در iOS و Android اجرا کرد. با این حال Detox همگامسازی بهتری برای React Native فراهم میکند و XCUITest/Espresso اجرای سریعتری برای تستهای بومی دارند.
Appium برای پروژههایی مناسب است که به یک فریمورک یکپارچه برای iOS, Android و وب نیاز دارند. برای تیمهایی که تسترهای آنها به Java یا Python مینویسند ضروری است. برای پروژههای React Native با تعداد زیاد تستهای E2E بهتر است Detox را به دلیل همگامسازی خودکار در نظر بگیرید.
| فریمورک | رویکرد | سرعت | بینپلتفرمی |
|---|---|---|---|
| Appium | Black-box | متوسط | iOS, Android, Windows |
| Detox | Gray-box | بالا | iOS + Android (React Native) |
| XCUITest | White-box | بالا | فقط iOS |
Appium Grid یک افزونه برای اجرای همزمان تستها روی چندین دستگاه است. Appium Grid بر اساس Selenium Grid ساخته شده است و امکان توزیع تستها بین چندین سرور Appium را فراهم میکند که هر کدام مجموعهای از دستگاهها یا شبیهسازها را مدیریت میکند. این برای پروژههای بزرگی که اجرای رگرسیون روی یک دستگاه ساعتها طول میکشد حیاتی است — Grid زمان را به نسبت تعداد گرهها به دقایق کاهش میدهد.
برای پیکربندی Grid از یک فایل پیکربندی در قالب JSON استفاده میشود که در آن گرهها (nodes) با دستگاهها توصیف میشوند. هر گره مشخص میکند: پورت سرور، لیست دستگاهها با پلتفرم، نسخه سیستمعامل و حداکثر تعداد جلسات. Hub تستها را بین گرههای آزاد توزیع میکند و حداکثر استفاده از زیرساخت را تضمین میکند.
{
"capabilities": [
{
"browserName": "android",
"platformName": "Android",
"deviceName": "Pixel_4",
"platformVersion": "14.0",
"maxInstances": 2
}
],
"configuration": {
"port": 4724,
"registerCycle": 5000
}
}
اگر زیرساخت دستگاه خود را در دسترس ندارید، سرویسهای ابری وجود دارند: Sauce Labs, BrowserStack, LambdaTest. آنها صدها دستگاه واقعی و شبیهساز را در ابر ارائه میدهند. یکپارچهسازی با Appium حداقل است: کافی است URL هاب ابری و اعتبارنامه را در Desired Capabilities به جای localhost مشخص کنید.
Appium از اجرای همزمان تستها با TestNG (Java) یا pytest-xdist (Python) پشتیبانی میکند. همزمانی به پورتهای یکتا برای هر جلسه و دادههای تست مجزا نیاز دارد. هر رشته جلسه Appium خود را روی یک دستگاه یا شبیهساز جداگانه اجرا میکند. هنگام استفاده از سرویسهای ابری، همزمانی خودکار است — پلتفرم خودش تستها را بین دستگاههای موجود توزیع و پس از اتمام آزاد میکند.
در صورت بروز مشکل با Appium، اولین مرحله بررسی لاگ سرور است (appium --log-level debug). خطاهای معمول: پورت مشغول است (--port دیگری مشخص کنید)، نسخه ناسازگار درایور، عدم وجود Android SDK یا Xcode. برای iOS مطمئن شوید WebKitAgent در حال اجرا است و به شبیهساز دسترسی دارد.
اگر Appium عنصری را پیدا نمیکند، بررسی کنید: آیا کانتکست درست است (NATIVE_APP vs WEBVIEW)، آیا عنصر روی صفحه قابل مشاهده است، آیا نیاز به اسکرول دارد و آیا مکانیاب درست است. از Appium Inspector برای جستجوی تعاملی و بررسی عبارات XPath قبل از درج در تست استفاده کنید. همچنین فعالسازی انتظار برای ظاهر شدن عنصر از طریق WebDriverWait مفید است — این مشکل همگامسازی هنگام بارگذاری آهسته UI را حل میکند.
پایان نادرست جلسات علت رایج ناپایداری تستهای Appium است. همیشه درایور را در بلوک finally یا از طریق AutoCloseable ببندید. در صورت خطا از driver.quit() اجباری استفاده کنید. برای iOS مطمئن شوید WebKitAgent (WDA) بین جلسات راهاندازی مجدد میشود، در غیر این صورت ممکن است خطای session not created رخ دهد. برای نظارت بر وضعیت جلسات در CI، افزودن پلاگین Appium Dashboard مفید است که وضعیت همه تستهای در حال اجرا را در زمان واقعی نمایش میدهد.
برای افزایش پایداری تستها از موارد زیر استفاده کنید: shouldTerminateApp (خاتمه اپلیکیشن بین تستها)، noReset (ذخیره دادهها بین جلسات)، autoGrantPermissions (اعطای خودکار مجوزهای سیستم). همچنین توصیه میشود انیمیشنها را در دستگاه از طریق Developer Options غیرفعال کنید.
پرسشهای متداول
Appium از همه زبانهای محبوب از طریق کتابخانههای کلاینت پشتیبانی میکند: Java, Python, JavaScript, Ruby, C#, PHP و Kotlin. هر کتابخانه همان پروتکل WebDriver را پیادهسازی میکند که امکان نوشتن تستهای بینپلتفرمی به هر زبانی را فراهم میکند.
خیر، Appium هم با دستگاههای واقعی و هم با شبیهسازها کار میکند. برای Android از شبیهسازهای Android Studio و برای iOS از شبیهسازهای Xcode استفاده میشود. دستگاههای واقعی فقط برای تست عملکردهای سختافزاری لازم هستند: سنسورها، NFC، دوربین.
Appium 2 کاملاً با معماری ماژولار با پلاگینها و درایورهای جداگانه بازنویسی شده است. در Appium 1 همه درایورها در سرور تعبیه شده بودند. Appium 2 از دستورات appium driver install برای نصب درایورها و appium plugin install برای پلاگینها استفاده میکند.
Appium از استراتژیهای جستجو استفاده میکند: By.id, By.xpath, By.accessibilityId, By.className, By.androidUIAutomator و By.iOSClassChain. برای سرعت بیشتر توصیه میشود از accessibilityId استفاده کنید — پایدار است و به تغییرات چیدمان وابسته نیست.
بله، Appium از تست مرورگرهای موبایل پشتیبانی میکند — Safari در iOS و Chrome در Android. برای این کار از کانتکست WEBVIEW یا CHROMIUM استفاده میشود. تستها در مرورگر از طریق WebDriver استاندارد، مشابه Selenium، اجرا میشوند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید