Exploring Appium: Basics in Mobile App Testing

Reading Time : 18 min read
what is appium

Your first Appium test passes. The app launches, the login screen fills in, the assertion goes green, and for about an hour you feel like mobile automation is solved. Then regression week arrives. A test that passed on a Pixel fails on a Samsung. A session hangs for no obvious reason. Someone asks why the iOS run took three times as long as the Android run, and nobody has a good answer.

That gap between “it runs” and “we trust it” is where most Appium conversations actually happen. This post explains what Appium is, how it works, how it compares with the alternatives, and what teams do to make it reliable at enterprise scale.

What is Appium?

Appium is a popular open-source framework used for automating mobile app testing. It supports testing of native, hybrid, and web applications across iOS and Android platforms.

You write test code in a language you already use (Java, Python, JavaScript, C#, and others), and Appium translates those commands into actions on a real device or emulator: tap this button, type into that field, read this label. It follows the WebDriver standard, the same protocol family behind browser automation. That’s why web testers pick it up quickly, and why one test approach can cover both platforms without a rewrite of your tooling.

Appium is a bridge. It doesn’t write good tests for you, pick stable locators, or provide devices. Those parts stay with your team.

The Appium framework elevates mobile testing, and it is a versatile tool. Let us learn more.

Free Appium Course

How Appium Works

Appium is an HTTP server written in Node.js that uses the W3C WebDriver protocol to drive iOS and Android sessions. Older versions also accepted the JSON Wire Protocol, but Appium 2 and 3 accept W3C WebDriver only. It provides a versatile and efficient platform for mobile app testing across different devices and platforms.

REST API completes actions such as:

  • Receiving client-side connections
  • Listening to the command
  • Then, completing that command on a chosen mobile device
  • And finally, returning that command execution status as an HTTP response

Let’s consider it this way: Appium enables automation in a session context. To start a session, the client (written in Java, JavaScript, PHP, Ruby, Python, or C#) sends the Appium server a POST /session request with a JSON object of capabilities.

At that point, the server begins an automation session. Ultimately, it will respond with a unique session ID to deliver additional commands, depending upon the session in question.

Client, Server, and Drivers

Three pieces matter.

  • The client. Your test script, using an Appium client library for your language.
  • The Appium server. It receives commands from the client over HTTP and manages sessions.
  • The drivers. Appium routes each command to a platform-specific driver. For Android UI automation, that’s typically the UiAutomator2 driver. For iOS, it’s the XCUITest driver, which builds on Apple’s XCUITest framework.

The capabilities in that first request (platform, platform version, device, app location, and so on) tell the server which driver to use. Appium 2 made this modular, so drivers are installed separately from the server.

Capabilities are where “works on my device” problems begin. If every engineer defines them differently, you get inconsistent sessions and results nobody can compare. Strong teams centralize capability definitions and driver versions. Kobiton’s guide to Appium desired capabilities covers the option classes for Android and iOS.

Appium 1, 2, and 3: Why Your Version Matters

Many Appium tutorials still describe Appium 1. Following one on a current install is a common source of confusing setup failures, so check which version you’re running before anything else.

VersionStatusWhat changed
Appium 3Current major version, generally available since August 2025Requires Node.js 20.19+ and npm 10+. Removes endpoints deprecated in Appium 2. Scopes insecure feature flags to a driver (adb_shell becomes uiautomator2:adb_shell). Inspector can run as a server plugin. Clients can mark requests as sensitive so passwords are masked in logs.
Appium 2Still works; new development happens on Appium 3Drivers and plugins installed separately (for example, appium driver install uiautomator2). W3C WebDriver is the only protocol. Non-standard capabilities need the appium: prefix. The server moved from /wd/hub to the root path.
Appium 1End of life, with no fixes or security updatesAll drivers bundled into one server. Served at /wd/hub. Accepted the legacy JSON Wire Protocol.

For most teams, moving from Appium 2 to 3 is an infrastructure change more than a test rewrite. Update Node.js on your CI agents and Docker images first, then upgrade your drivers together with the server. The server and client libraries are versioned independently, so a 3.x server doesn’t need a matching 3.x client.

Appium vs. Selenium, Espresso, and XCUITest

Appium sits between two kinds of tool, and teams usually need to compare it with both.

Selenium automates browsers, and Appium automates mobile apps. Both speak WebDriver, so client syntax and concepts like sessions, locators, and waits carry over directly. Many teams run both: Selenium for the web product, Appium for the mobile apps.

Espresso (Android) and XCUITest (iOS) are the platform vendors’ own UI testing frameworks. Appium’s drivers are built on top of them, and you can also use them directly. Used directly, they run closer to the app and are faster, but each covers one platform and lives inside the app project.

 AppiumEspressoXCUITest
PlatformsAndroid and iOSAndroid onlyiOS only
Test languagesJava, Python, JavaScript, C#, Ruby, and othersJava, KotlinSwift, Objective-C
Where tests liveSeparate repo or alongside app codeInside the Android projectUI test target in the Xcode project
Changes to the appNoneTest code built with the appTest target added to the project
SpeedSlower: every command is an HTTP round tripFastest: runs in the app’s processFast
SynchronizationExplicit waits you writeAutomatic idle sync with the UI threadBuilt-in waits such as waitForExistence

Appium is the better fit when one team covers both platforms with one suite, when your testers come from a Selenium background, when tests are owned by QA outside the app repository, or when you need to run on a shared device cloud. The native frameworks fit better when mobile developers own the tests and want them in the app’s own language, when the app ships on one platform only, or when per-test speed is the binding constraint.

Many enterprise teams use both. Developers write Espresso or XCUITest checks for fast component-level feedback, and QA runs Appium for cross-platform end-to-end regression. Kobiton supports all three.

Key Features of Appium

Many features make Appium a powerful and versatile open-source automation testing framework for mobile applications as part of traditional mobile app testing. Below are some of its most notable features.

Cross-Platform Testing

First, Appium allows for the writing of tests against multiple platforms (including both iOS and Android), using the same API to do so. This enables code reuse between test suites for iOS and Android — a big plus.

No App Code Modification Required

Second – unlike some other testing tools – Appium does not require any modification to the app’s code, nor does it call for the inclusion of any additional agents inside the app to function. Ease of use is a big plus, which is a big component of Appium’s popularity.

Programming Languages Support

Appium uses the WebDriver protocol, and it can support test scripts written in any WebDriver-compatible language like Java, Python, JavaScript (Node.js), PHP, Ruby, and C#.

Automation of Native, Hybrid, and Web Applications

Appium allows automation testing for native, hybrid, and web applications, supporting automation tests on physical devices, emulators, or simulators.

Appium’s Integration with Other Tools

Another big benefit of Appium is its ease of integration with other powerful tools, like Selenium and Jenkins.

Appium and Selenium

While Selenium is tailored for web applications – and Appium is tailored for mobile apps – their overlap in WebDriver protocol and programming languages makes them a powerful duo for comprehensive testing strategies covering both web and mobile platforms.

Appium with Jenkins

Appium can also be integrated into Jenkins pipelines to automate the execution of mobile tests as part of the build process. Jenkins can trigger Appium tests, report results, and even manage test devices, making it a powerful tool for CI/CD pipelines.

Common Problems in Appium

There are, however, a few small (but common) issues implementing Appium. They are worth noting, and important to anticipate.

Configuration Complexity

Some users find setting up Appium to be time-consuming, especially when configuring it to work with different devices and operating systems. The initial setup, including installations and configurations, can be complex.

On iOS, real devices also need WebDriverAgent built and signed with a valid provisioning profile. Version mismatches between Node.js, the Appium server, drivers, and the platform SDKs cause most “it won’t start” problems, so pin versions and script your setup.

Limited Support

While Appium supports a wide range of gestures, certain complex gestures might not be directly supported or may work inconsistently across different platforms.

Pinch, multi-finger swipes, and long-press-and-drag are built from W3C Actions and can behave differently across platforms and OS versions. Verify each gesture on every target platform rather than assuming the Android version works on iOS.

Platform Fragmentation

Android and iOS behave differently, and so do devices within each platform: OEM skins, screen sizes, and OS versions all vary. Appium’s single API reduces duplicated code, but tests still need platform-specific handling where flows differ, and a test that passes on one device can fail on another. Running regression on the real devices your users carry is the only reliable check.

High Memory Usage

Appium sessions can also consume a significant amount of memory, especially when running multiple instances or tests concurrently.

Size your host capacity for the parallelism you want, or run parallel sessions on managed devices so one overloaded machine doesn’t slow or destabilize the whole run.

Slower Execution Than Native Frameworks

Every command travels from your client to the server, through a driver, into the device’s automation framework, and back. Tests with dozens of interactions add up. You win the time back through parallel runs and fewer commands per test, not by tuning a single command.

iOS Automation Requires macOS

Building and running iOS sessions requires Xcode on a Mac, so your iOS capacity is tied to Mac hardware or a device cloud.

Some Capabilities Live Outside the Core

Image comparison and image-based element finding come from the images plugin, not the base install. Visual testing usually means adding a plugin or a separate tool.

Failures Can Be Hard to Trace

A broken test may originate in your code, the client library, the server, the driver, or the device. Without logs and video for each run, triage turns into reproduction.

How Teams Use Appium for Mobile Test Automation

A typical workflow looks like this:

  1. Tests live in the same repository as the app code or in a dedicated automation repo, often organized with the Page Object Model so UI changes get fixed in one place.
  2. A pipeline builds the app, uploads the binary, and triggers the suite.
  3. Each test opens a session against a target device, runs its steps, and closes the session.
  4. Results, logs, and screenshots get collected for triage.

Device choice is the decision that shapes everything else. Emulators are fast and cheap, and they’re fine for early feedback. They don’t reproduce real battery behavior, sensor input, carrier networks, OEM skins, or the performance quirks of an older phone in a customer’s pocket. For a banking, retail, or travel app where one device-specific crash costs revenue, regression has to run on physical devices.

Debugging is the other half. A failed test with only a stack trace sends an engineer on a long reproduction hunt. A failed test with the video, device logs, and a step-by-step timeline turns that into a short read. Teams that skip this investment end up with automation people stop trusting.

Best Practices for Appium Testing

Fortunately, there are a number of techniques that users can implement to get the most of Appium testing. I’ll share a few here — but would also like to remind readers that Kobiton professionals are standing by to help, with additional tips and tricks (not covered here) which we’ve gained during our years of experience helping companies just like yours.

Choose Locators That Survive UI Changes

Accessibility ID is usually the most stable choice because it’s built for assistive technology and works on both platforms. Resource IDs help on Android. XPath is a last resort, since it’s slow and breaks when layouts shift.

Use Appium Inspector

Appium Inspector is a valuable tool that allows engineers to identify and interact with mobile app elements, simplifying the testing process.

It connects to a live session, shows the app’s element tree and attributes, and lets you try a locator before you commit it to code. In Appium 3, Inspector can also be installed as a server plugin (appium plugin install inspector) instead of a separate desktop app.

Right Test Scripting Language

Choose the scripting language that aligns with your team’s expertise and project requirements to ensure efficient test script development.

Utilize Appium’s Advanced Features

Explore and utilize advanced features of Appium such as handling notifications, deep linking, and using mobile device gestures.

Data-Driven Testing

Data-driven testing separates test data from test scripts, enabling the execution of the same test script with different input data.

Store inputs such as accounts, search terms, and locales in a data file or fixture. Giving each parallel session its own data set then becomes a configuration change rather than a code change.

Use Explicit Waits

Hard-coded sleeps cause most flakiness. Wait for a specific condition, such as an element being visible or clickable, then proceed. It makes tests faster when the app is fast and survivable when it’s slow.

Keep the Command Count Low

Every find, tap, and check is a separate round trip to the device, so a test’s runtime tracks how many commands it sends. Don’t tap through six screens to reach the one you’re testing. Set up state directly with an API call, a deep link, or a pre-seeded test account, then start the test on the screen under test.

Parallelize Deliberately

Running across multiple devices cuts cycle time, but it exposes shared-state problems. Two tests using the same test account will collide. Give each parallel session its own data, keep tests independent of order, and make sure every session requests a distinct device.

Automate the Whole Chain and Archive Results

CI should handle build upload, capability injection, device allocation, and execution. Keep the logs, video, device details, and app build version for every run. When a failure shows up three days later, that archive is the difference between a diagnosis and a guess.

Plan for Maintenance

UI changes break locators. That’s the main ongoing cost of any Appium suite, and it’s the reason self-healing approaches get attention.

Use Cases of Appium

Every testing scenario is different, and there are some situations where Appium use cases have proven to be especially beneficial. Here, I will highlight just a few of those scenarios.

Mobile App Testing

Appium is widely used for mobile app testing on both Android and iOS platforms. It allows for automation testing of native, hybrid, and web applications, supporting test automation on physical devices, emulators, or simulators.

Mobile Game Testing

Appium can be utilized for mobile game testing, ensuring the quality and performance of mobile games on different devices and platforms.

Accessibility Testing

Appium can be helpful for accessibility testing, ensuring that mobile applications are accessible to users with disabilities. It allows for testing the accessibility features of mobile apps to comply with accessibility standards and regulations.

Where Kobiton Fits into an Appium Workflow

Kobiton is a real-device mobile testing platform for enterprise QA, development, and DevOps teams. It supports Appium in Java, Python, NodeJS, and C#, so existing scripts can point at physical Android and iOS devices in the cloud or on-prem, without building and babysitting an in-house device lab.

Three parts of the platform address the pain points above:

  • Authoring. Appium script generation turns recorded manual sessions into reusable automation, which helps when authoring is the bottleneck.
  • Execution. Recorded tests can run in parallel across selected devices, and Jenkins and other CI/CD integrations connect the runs to your pipeline.
  • Debugging. Session Explorer replays test execution to pinpoint defects. Logs, device metrics (CPU, memory, network, battery, temperature), HAR export, and one-click Jira filing with session context mean a failure arrives with its evidence attached. The built-in element inspector also pulls locators straight from test sessions.

Governance matters at this scale too. Cloud and on-prem deployment options let security-conscious teams keep devices where policy requires them.

Conclusion: Appium for Enhanced Mobile App Quality

It is no secret that Appium is a popular tool for software development testing. Not only is it powerful and efficient, but it is also easy to use and become acclimated to. I invite you to explore Appium further, to enhance your own mobile app quality.

Appium gives you a standard way to drive mobile apps. Reliability comes from the habits around it: a current Appium version, stable locators, explicit waits, isolated parallel runs, real devices, and a debugging loop that doesn’t depend on guesswork. If you’re standardizing mobile regression, start by mapping how you author, execute, and debug today, and fix the first gap you find.

Next steps: Experience uninterrupted test flows yourself, with intelligent error handling and cross-device compatibility with Appium Self-Healing — doing so can provide an 80% reduction in script maintenance time, a 99% reduction in “Element not Found” failures, and nearly zero stops while regression testing.

For more on that (and other testing scenarios), Kobiton is ready to help.

Kobiton offers a free trial of its platform, which simplifies mobile testing and enables users to create, execute, and analyze tests easily. Sign up for our free trial today to experience the benefits of Kobiton and take your mobile testing to the next level.

To see the Kobiton Platform in action, sign up for a trial today and get:

  • 300 testing minutes on real devices
  • 5 AI-generated Appium scripts.
  • Powerful Session Explorer to analyze test results

To learn more about Kobiton, click here, or get started with a no-commitment free trial today.

Appium eBook

Frequently Asked Questions About Appium

Is Appium free to use?

Yes. Appium is open source under the Apache 2.0 license, with no licensing fee. The real costs are devices, the infrastructure to run sessions in parallel, and the engineering time to build and maintain the suite.

What is the difference between Appium and Selenium?

Selenium automates web browsers, and Appium automates mobile apps on Android and iOS. Both use the WebDriver protocol, so if you know Selenium, Appium’s client API will feel familiar.

Is Appium easy to learn?

The test-writing part is approachable if you know Selenium or one of the supported languages. The harder part is the mobile-specific setup: drivers, capabilities, SDKs, and device management. Expect the environment to take longer than your first test.

What are the disadvantages of Appium?

It’s slower than the native frameworks, setup has many moving parts, iOS automation requires a Mac, and complex gestures can behave differently across platforms. See “Common Problems in Appium” above for how teams work around each one.

Does Appium need the app’s source code?

No. Appium automates a compiled build without modification, which is why it suits QA teams working outside the app repository.

Which version of Appium should I use?

Use Appium 3 for new work. Appium 1 is end of life and receives no security updates, and Appium 2 suites can usually move to Appium 3 with infrastructure changes rather than test rewrites.

Can one Appium script test both Android and iOS?

Largely, yes, if you locate elements by accessibility ID and isolate platform differences inside page objects. Most suites still keep a small amount of platform-specific code for flows that differ between the two apps.

Interested in Learning More?

Subscribe today to stay informed and get regular updates from Kobiton

Ready to accelerate delivery of
your mobile apps?

Request a Demo