Your frameworks. Your CI. Your devices.
RobusTest is an Appium- and Selenium-compatible hub inside your network. Point the test suites you already have at the lab's endpoint and they run — in parallel, across your real device pool, with results your pipeline can consume.
First-class runners, not wrappers.
Each framework has a dedicated runner in the platform — with its own preparation, report parser, and failure handling — so results come back structured, not as a log dump.
Appium
A standard /wd/hub endpoint for app and mobile-browser automation. Your existing Appium suites connect by changing one URL; capabilities route to devices automatically.
Espresso
Native Android instrumentation runs — upload the app and test APKs, pick a device pool, and get parsed test-level results back.
XCUITest & XCTest
The lab provisions WebDriverAgent and resigns your runner IPA on its own nodes — no per-device Xcode babysitting. Runs on real iPhones, iPads, and Apple TVs.
Selenium grid
Desktop-browser automation through the same hub — grid nodes register browsers, and sessions route by requested capabilities.
UIAutomator
Suite-based UIAutomator jobs for Android system-level flows that instrumentation can't reach.
Maestro-style flows
YAML flow definitions run against lab devices — the lightweight option for smoke tests and flows QA can own.
Parallel across the pool, not one device at a time.
A run fans out into jobs, jobs claim devices from the pool, and every step reports back live. You define which devices qualify; the lab does the dispatching.
- Parallel run mode distributes a job across every matching free device
- Saved device queries target pools by platform, OS version, model, or tag — "all Android 14 phones", not hard-coded serials
- Retry policies per job type: retry on the same device or a fresh one, with a max-attempts cap
- Live progress over websockets — watch tests move through the run → job → session → testcase → result hierarchy as they execute
When a test fails at 2 a.m., the evidence is already collected.
Step-level screenshots
Before and after screenshots attach to individual steps, so a failure shows you the screen at the moment it happened.
Every log type
Device logs from every platform — Android logcat, iOS syslog, TV and browser logs — plus Appium server logs, captured per result, viewable in the report, and downloadable per type.
JUnit XML export
Every job exports standard JUnit XML, so your CI's own test-report UI shows lab results natively.
HTML run reports
Framework-aware parsers turn raw output into browsable reports at run, job, and testcase level.
Time analysis
Per-session time breakdowns show where a run's minutes actually went — queueing, preparation, or the tests themselves.
Result hooks
Completed jobs notify Slack, email, generic webhooks, or push metrics to InfluxDB for dashboards.
And every run records more than test results. Performance vitals and HTTP(S) network capture run by default on every automated session — so a failed test comes back with its FPS trace and the API calls behind it, per result, no extra configuration. See performance testing and network capture.
Triggered by your pipeline, not a person.
A documented HTTP API triggers jobs, polls status, and fetches results using per-user access keys — the same API our largest customers run their nightly regressions through. Jenkins, GitHub Actions, GitLab CI: anything that can call an endpoint can drive the lab.
- Trigger a job, poll its status, list its device instances, or abort it — all over HTTP
- Per-user API access keys, revocable and regenerable at any time
- JUnit XML pulls lab results into your pipeline's pass/fail gate
- Job hooks announce finished runs where the team already looks — Slack, email, or your own webhook
# trigger a run from CI
curl -X POST \
"https://lab.internal/v3/job/trigger" \
-H "Authorization: Bearer $LAB_KEY" \
-d @nightly-regression.json
# poll until done, then fetch JUnit
curl "https://lab.internal/v3/job/$ID/junit" \
-H "Authorization: Bearer $LAB_KEY"
Run tonight's regression on your own rack.
Bring one existing suite to the demo — we'll point it at a RobusTest hub and run it in parallel while you watch.