Skip to main content
Test automation

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.

Frameworks

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

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

Espresso

Native Android instrumentation runs — upload the app and test APKs, pick a device pool, and get parsed test-level results back.

XCUITEST

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

Selenium grid

Desktop-browser automation through the same hub — grid nodes register browsers, and sessions route by requested capabilities.

UIAUTOMATOR

UIAutomator

Suite-based UIAutomator jobs for Android system-level flows that instrumentation can't reach.

FLOWS

Maestro-style flows

YAML flow definitions run against lab devices — the lightweight option for smoke tests and flows QA can own.

Execution

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
1 URL
Change to adopt the hub
Pool
Device targeting by query
Live
Progress over websockets
Retry
Same or fresh device, capped
Artifacts & reporting

When a test fails at 2 a.m., the evidence is already collected.

SHOTS

Step-level screenshots

Before and after screenshots attach to individual steps, so a failure shows you the screen at the moment it happened.

LOGS

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

JUnit XML export

Every job exports standard JUnit XML, so your CI's own test-report UI shows lab results natively.

REPORTS

HTML run reports

Framework-aware parsers turn raw output into browsable reports at run, job, and testcase level.

TIMING

Time analysis

Per-session time breakdowns show where a run's minutes actually went — queueing, preparation, or the tests themselves.

HOOKS

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.

Test run report — parallel Espresso job Illustration
CI/CD

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.