Appium Setup for Mobile Testing
Three ways to give Certyn an Appium endpoint — a device cloud, your own server, or a local install with a runner or tunnel.
Certyn drives native mobile and desktop apps through Appium. To test your app, Certyn needs three things: an Appium endpoint it can reach, credentials for that endpoint (if it has any), and the app to launch. This guide covers the three ways to provide them.
Option 1: A device cloud (recommended)
BrowserStack, Sauce Labs, and LambdaTest host real devices and expose a public Appium endpoint. Nothing to install, and no tunnel or runner needed — Certyn connects straight to the provider.
Enter your credentials
During onboarding (or in Settings → Runtime), pick your provider and enter its username and access key. Certyn stores them separately from the URL and sends them as basic auth on every session.
Upload your app build
Device clouds run the app from an uploaded artifact, not an app store. Upload the .apk / .ipa with the provider's API — the wizard shows a ready-to-paste curl command — and note the app id in the response:
- BrowserStack:
bs://<hash>from theapp_urlfield - Sauce Labs:
storage:filename=<your-file> - LambdaTest:
lt://<id>from theapp_urlfield
Pick a device
Set Device name (for example Samsung Galaxy S23 or iPhone 15) and OS version (13.0, 17) — that's how the provider selects the device. Provider-specific options (project names, idle timeouts, local testing) go in Extra capabilities as a JSON object, for example:
{ "bstack:options": { "projectName": "My app" } }
Each Certyn session occupies one device slot on your plan while it runs.
Option 2: Your own Appium server
If you already run Appium — on a CI box, a device lab, or a Mac mini in the office — point Certyn at it. The URL must be reachable from where Certyn's runner executes:
- Cloud runs need a public HTTPS URL (or a tunnel, see below).
- Self-hosted runner runs can use any address the runner's machine can reach, including private network addresses.
Use the Test button next to the URL field to confirm Certyn can reach the server's /status endpoint before your first run.
Option 3: Install Appium locally
Run Appium on the machine your device or emulator is attached to.
Install and start
npm install -g appium
appium driver install uiautomator2 # Android — use xcuitest for iOS
appium
Platform notes:
- Android: connect a device with USB debugging on, or start an emulator from Android Studio. Confirm it shows in
adb devices. - iOS: requires a Mac with Xcode. Simulators work out of the box. Real devices additionally need WebDriverAgent code signing with your Apple developer account.
- Windows: install the driver with
appium driver install --source=npm appium-windows-driverand turn on Developer Mode in Windows settings. - macOS: install the driver with
appium driver install mac2; macOS prompts for Accessibility permission on the first session.
Make it reachable
A local Appium server listens on localhost:4723, which Certyn's cloud cannot reach. Two ways to bridge that:
A self-hosted runner (recommended). Run a Certyn runner on the same machine — the onboarding wizard provisions it with one docker run command. The runner reaches Appium locally, so nothing is exposed to the internet. Use http://host.docker.internal:4723 as the Appium server URL.
A tunnel. Expose the port with ngrok (ngrok http 4723) or Cloudflare Tunnel and use the public HTTPS URL it prints. Simpler to start, but the URL changes on every ngrok restart and the endpoint is publicly reachable while the tunnel is up.
Troubleshooting
- "Failed to create Appium session" — check the driver for your platform is installed (
appium driver list --installed) and a device/emulator is actually available. - Device cloud rejects the session — confirm the app id is the uploaded artifact reference (
bs://…,storage:filename=…,lt://…), not a bundle id, and that Device name + OS version match a device the provider offers. - Test button fails but the server is running — the probe comes from Certyn's cloud. A localhost or private address is only reachable on the self-hosted runner path, where the probe is skipped.