---
title: Appium Cloud Testing | TestingBot
description: Run Appium tests for native and hybrid iOS and Android apps on real iPhones,
  iPads and Android devices in the TestingBot cloud. Java, Python, Node.js, Ruby,
  C# and PHP supported.
source_url:
  html: https://testingbot.com/support/app-automate/appium
  md: https://testingbot.com/support/app-automate/appium/index.md
---
Documentation

# Appium Cloud Testing

Appium is the open-source W3C WebDriver framework for native, hybrid and mobile-web applications. TestingBot runs Appium tests on real iPhones, iPads and Android devices in our EU datacenter, alongside iOS simulators and Android emulators for fast iteration. Bring your existing Appium tests in Java, Python, Node.js, Ruby, C#, PHP or Robot Framework and point them at the TestingBot grid.

## Quick start: run your first Appium test

Four steps to point an existing Appium test at the TestingBot cloud:

1. **Sign up and grab your API key.** [Create a free account](https://testingbot.com/users/sign_up). Your API key and secret are in the dashboard under Account, then Keys and Authentication. 
2. **Upload your app binary to TestingBot Storage.** Upload your `.ipa` (iOS) or `.apk` (Android) to [TestingBot Storage](https://testingbot.com/support/api#upload). The response returns a `tb://` URL you reference as the `appium:app` capability. 
3. **Point Appium at the TestingBot endpoint.** Connect your Appium client to `https://hub.testingbot.com/wd/hub`. Set `platformName`, `appium:deviceName`, `appium:platformVersion` and `appium:app` (the `tb://` URL). Pass your key and secret via `tb:options`. 
4. **Run the test and view results.** TestingBot streams a live video, screenshots, device logs and Appium command logs into the dashboard while the test runs and after it finishes. 

## Pick a language or framework

Each card below links to a complete setup guide for that language or framework, including a working example, capability reference and CI integration.

### [Java](https://testingbot.com/support/app-automate/appium/java)

Appium with the Java Appium client. JUnit, TestNG and Cucumber friendly.

- [Java tutorial](https://testingbot.com/support/app-automate/appium/java)
- [TestNG](https://testingbot.com/support/app-automate/appium/java/testng)

### [Node.js](https://testingbot.com/support/app-automate/appium/nodejs)

Appium with the Node.js Appium or WebdriverIO clients.

- [Node.js tutorial](https://testingbot.com/support/app-automate/appium/nodejs)
- [CodeceptJS](https://testingbot.com/support/app-automate/appium/nodejs/codeceptjs)
- [WebdriverIO](https://testingbot.com/support/app-automate/appium/nodejs/webdriverio)

### [C# / .NET](https://testingbot.com/support/app-automate/appium/csharp)

Appium with the C# Appium client. NUnit, Reqnroll and SpecFlow friendly.

- [C# tutorial](https://testingbot.com/support/app-automate/appium/csharp)
- [NUnit](https://testingbot.com/support/app-automate/appium/csharp/nunit)
- [Reqnroll](https://testingbot.com/support/app-automate/appium/csharp/reqnroll)
- [SpecFlow](https://testingbot.com/support/app-automate/appium/csharp/specflow)

### [Python](https://testingbot.com/support/app-automate/appium/python)

Appium with the Python Appium client and pytest.

- [Python tutorial](https://testingbot.com/support/app-automate/appium/python)
- [Robot Framework](https://testingbot.com/support/app-automate/appium/robotframework)

### [Ruby](https://testingbot.com/support/app-automate/appium/ruby)

Appium with the Ruby `appium_lib` gem.

- [Ruby tutorial](https://testingbot.com/support/app-automate/appium/ruby)

### [PHP](https://testingbot.com/support/app-automate/appium/php)

Appium with the PHP WebDriver client.

- [PHP tutorial](https://testingbot.com/support/app-automate/appium/php)

 ![Robot Framework](https://testingbot.com/assets/wizard/robotframework-08821f4942343bcb1f828470b5cbff3163369c14884b7ca285be190017ee7a94.png)
### [Robot Framework](https://testingbot.com/support/app-automate/appium/robotframework)

Keyword-driven testing with AppiumLibrary on top of Robot Framework.

- [Robot Framework tutorial](https://testingbot.com/support/app-automate/appium/robotframework)

## Preparing your app

Before uploading, make sure your `.ipa` or `.apk` is built for testing (not release-signed for the App Store) so it can be installed on TestingBot devices. See [preparing a mobile app for testing](https://testingbot.com/support/app-automate/help/prepare) for the iOS provisioning profile and Android signing requirements.

## Useful Appium capabilities

Appium exposes [a comprehensive list of capabilities](https://appium.io/docs/en/2.0/guides/caps/) for configuring a test. The capabilities below are the ones we see come up most often:

### Android-specific

- `appium:appActivity` and `appium:appPackage`: by default Appium extracts the launch activity from your APK. Set these explicitly if extraction fails or if you want to start in a non-default activity.
- `appium:chromeOptions`: extra ChromeDriver options when testing the in-app Chromium web view.
- `appium:otherApps`: a JSON array of additional app URLs to install alongside the app under test (useful for testing share-targets or deep links to other apps).

### Android and iOS

- `appium:locale`: the language of the simulator or device (for example `fr_CA`). 

This sets the locale on the entire device or simulator, except on real iOS devices. For real iOS devices, TestingBot passes `-AppleLocale` as a launch argument to the app instead.

- `appium:newCommandTimeout`: how many seconds Appium waits for a new command from the client before assuming the client quit and ending the session.
- `appium:autoGrantPermissions` (Android) or `appium:autoAcceptAlerts` (iOS): silently grant or accept permission popups so they do not block the test. See [permission popups](https://testingbot.com/support/app-automate/appium/permission-popups).
- `realDevice: true` inside `tb:options`: route the test to a physical iPhone, iPad or Android device instead of a simulator or emulator.

## Frequently asked questions

What is Appium and what is it used for?

Appium is an open-source cross-platform test framework for native, hybrid and mobile-web applications. It implements the W3C WebDriver protocol so you can use the same client library to drive iOS and Android apps from Java, Python, Node.js, Ruby, C#, PHP and other languages. TestingBot runs Appium on a cloud grid of real devices and simulators so you do not have to maintain local Appium servers.

Which languages and frameworks does Appium support on TestingBot?

All Appium client libraries work against the TestingBot grid: [Java](https://testingbot.com/support/app-automate/appium/java), [Python](https://testingbot.com/support/app-automate/appium/python), [Node.js](https://testingbot.com/support/app-automate/appium/nodejs) (including [WebdriverIO](https://testingbot.com/support/app-automate/appium/nodejs/webdriverio) and [CodeceptJS](https://testingbot.com/support/app-automate/appium/nodejs/codeceptjs)), [Ruby](https://testingbot.com/support/app-automate/appium/ruby), [C#](https://testingbot.com/support/app-automate/appium/csharp) (including [NUnit](https://testingbot.com/support/app-automate/appium/csharp/nunit), [Reqnroll](https://testingbot.com/support/app-automate/appium/csharp/reqnroll) and [SpecFlow](https://testingbot.com/support/app-automate/appium/csharp/specflow)), [PHP](https://testingbot.com/support/app-automate/appium/php) and [Robot Framework](https://testingbot.com/support/app-automate/appium/robotframework).

Can I run Appium tests on real iPhones and real Android devices?

Yes. TestingBot runs Appium tests on physical iPhones, iPads and Android phones and tablets housed in our EU datacenter, alongside iOS simulators and Android emulators. Use `realDevice: true` in your capabilities to target real hardware. See [real device testing](https://testingbot.com/real-device-testing) for the full real-hardware overview.

How do I upload my app binary for Appium tests?

Upload your `.ipa` or `.apk` to [TestingBot Storage](https://testingbot.com/support/api#upload) with your API key and secret. The response returns a `tb://` URL that you pass as the `appium:app` capability in your test. See [uploading apps for Appium](https://testingbot.com/support/app-automate/appium/upload-files) for details.

Which Appium version does TestingBot run?

TestingBot automatically selects the latest Appium 2 release compatible with the device, OS and OS version you request. Pin a specific version with the [`appiumVersion` capability](https://testingbot.com/support/app-automate/appium/appium-versions) if you need an exact release. The full list of supported versions is on the [Appium versions page](https://testingbot.com/support/app-automate/appium/appium-versions).

Can I test the mobile web (Safari, Chrome) with Appium on TestingBot?

Yes. Set `browserName` to `safari` (iOS) or `chrome` (Android) and omit the `app` capability. See [mobile browser testing](https://testingbot.com/support/web-automate/mobile) for the full setup.

How do I handle permission popups, push notifications or app upgrades in Appium tests?

TestingBot supports the standard Appium capabilities for these flows: [auto-grant or auto-accept permission popups](https://testingbot.com/support/app-automate/appium/permission-popups), [trigger and interact with push notifications](https://testingbot.com/support/app-automate/appium/push-notifications), and [test app upgrades](https://testingbot.com/support/app-automate/appium/test-app-upgrades) by chaining installs of two binaries.

Can I run Appium tests behind a firewall or against a staging API?

Yes. Start the [TestingBot Tunnel](https://testingbot.com/support/tunnel) and pass `tunnelIdentifier` in your `tb:options` capabilities. The cloud device will route HTTP traffic through your tunnel so it can reach internal staging APIs and local development servers.

## Next steps

- [ **Capabilities builder**  
Generate ready-to-paste Appium capabilities](https://testingbot.com/support/app-automate/appium/capabilities)
- [ **tb:options reference**  
All TestingBot-specific Appium options](https://testingbot.com/support/app-automate/appium/options)
- [ **Appium versions**  
Pin a specific Appium release](https://testingbot.com/support/app-automate/appium/appium-versions)
- [ **Uploading apps**  
.ipa and .apk uploads to TestingBot Storage](https://testingbot.com/support/app-automate/appium/upload-files)
- [ **Permission popups**  
Auto-grant Android and iOS permission dialogs](https://testingbot.com/support/app-automate/appium/permission-popups)
- [ **Push notifications**  
Test FCM and APNs flows in your app](https://testingbot.com/support/app-automate/appium/push-notifications)
- [ **Supported devices**  
Real iPhones, iPads and Android devices](https://testingbot.com/support/app-automate/devices)
- [ **TestingBot Tunnel**  
Test against internal or staging APIs](https://testingbot.com/support/tunnel)

### Looking for more help?

Have questions or need more information? Reach out via email or Slack.

[Email us](https://testingbot.com/contact/new)[Slack Join our Slack](https://join.slack.com/t/testingb0t/shared_invite/zt-3bcw9xch-jk19~6XPs_xBrsAgAedkCw)
