10 Basics of Native Mobile App Testing and Development
Cara Suarez
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.
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.

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:
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.
Three pieces matter.
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.
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.
| Version | Status | What changed |
| Appium 3 | Current major version, generally available since August 2025 | Requires 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 2 | Still works; new development happens on Appium 3 | Drivers 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 1 | End of life, with no fixes or security updates | All 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 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.
| Appium | Espresso | XCUITest | |
| Platforms | Android and iOS | Android only | iOS only |
| Test languages | Java, Python, JavaScript, C#, Ruby, and others | Java, Kotlin | Swift, Objective-C |
| Where tests live | Separate repo or alongside app code | Inside the Android project | UI test target in the Xcode project |
| Changes to the app | None | Test code built with the app | Test target added to the project |
| Speed | Slower: every command is an HTTP round trip | Fastest: runs in the app’s process | Fast |
| Synchronization | Explicit waits you write | Automatic idle sync with the UI thread | Built-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.
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.
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.
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.
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#.
Appium allows automation testing for native, hybrid, and web applications, supporting automation tests on physical devices, emulators, or simulators.
Another big benefit of Appium is its ease of integration with other powerful tools, like Selenium and Jenkins.
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 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.
There are, however, a few small (but common) issues implementing Appium. They are worth noting, and important to anticipate.
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.
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.
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.
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.
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.
Building and running iOS sessions requires Xcode on a Mac, so your iOS capacity is tied to Mac hardware or a device cloud.
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.
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.
A typical workflow looks like this:
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.
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.
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.
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.
Choose the scripting language that aligns with your team’s expertise and project requirements to ensure efficient test script development.
Explore and utilize advanced features of Appium such as handling notifications, deep linking, and using mobile device gestures.
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.
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.
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.
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.
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.
UI changes break locators. That’s the main ongoing cost of any Appium suite, and it’s the reason self-healing approaches get attention.
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.
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.
Appium can be utilized for mobile game testing, ensuring the quality and performance of mobile games on different devices and platforms.
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.
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:
Governance matters at this scale too. Cloud and on-prem deployment options let security-conscious teams keep devices where policy requires them.
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:
To learn more about Kobiton, click here, or get started with a no-commitment free trial today.

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.
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.
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.
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.
No. Appium automates a compiled build without modification, which is why it suits QA teams working outside the app repository.
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.
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.