QA Academy Logo
← Back to Blog
🇦🇿 AZ🇬🇧 EN
Mobile QA July 28, 2026 12 min read

Mobile Application Testing Guide: Appium 2.0, Real Devices & Best Practices

Mobile application stability directly impacts brand reputation and user retention. Mobile QA introduces challenges distinct from web testing—device fragmentation, battery consumption, network throttling, and hardware interrupts.

1. Core Mobile Testing Vectors and Challenges

  • Network Switching & Offline Mode: Transitioning between 5G, 4G, flaky Wi-Fi, and offline caching without data loss.
  • Hardware Interruptions: Handling incoming phone calls, biometrics prompts, low battery dialogs, and screen sleep events.
  • Complex Touch Gestures: Multi-touch pinch-to-zoom, fling scrolling, drag-and-drop, and long-press interactions.
  • OEM Fragmentation: Validating layouts across hundreds of screen aspect ratios, camera notches, and vendor-specific Android distributions.

2. Appium 2.0 Modular Driver Architecture

# 1. Install Appium 2.0 core CLI
npm install -g appium

# 2. Install dedicated drivers for Android & iOS
appium driver install uiautomator2
appium driver install xcuitest

# 3. Add image recognition plugin
appium plugin install images
appium --use-plugins=images

3. Python Appium Automation Code Example

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = UiAutomator2Options()
options.platform_name = "Android"
options.automation_name = "UiAutomator2"
options.device_name = "Pixel_7_API_34"
options.app = "/path/to/app.apk"

driver = webdriver.Remote("http://127.0.0.1:4723", options=options)
wait = WebDriverWait(driver, 15)

try:
    email_field = wait.until(EC.presence_of_element_located((AppiumBy.ACCESSIBILITY_ID, "input_email")))
    email_field.send_keys("student@qaacademy.az")

    password_field = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "input_password")
    password_field.send_keys("SecurePassword2026!")

    driver.find_element(AppiumBy.XPATH, '//android.widget.Button[@text="LOG IN"]').click()

    welcome = wait.until(EC.visibility_of_element_located((AppiumBy.ID, "com.app:id/welcome_text")))
    assert "Welcome" in welcome.text
finally:
    driver.quit()

Frequently Asked Questions (FAQ)

Does Appium support native and hybrid mobile apps?

Yes, Appium seamlessly inspects and automates native UI components as well as hybrid WebViews.

Why is real-device testing necessary over emulators?

Real devices reveal critical hardware constraints, biometric authentication behaviors, and OEM-specific OS customizations that simulators cannot reproduce.

Elnur Hajiyev

Elnur Hajiyev

Senior Android Lead

Elnur Hajiyev is Senior Android Lead with 10+ years across GoldenPay, Guavapay, and ABB, leading mobile QA and automated testing with Appium 2.0.