One test flow.Web + API + Android.Your rules.
Ruviolta 3.0.1 brings browser automation, first-class API testing and native Android testing into the same readable .ut (User Testing) language. Run on virtual or real Android devices without maintaining a separate mobile test project or runner.

Android joins the Ruviolta testing platform.
Provision Android only when you need it, then use the same readable test language against the Ruviolta Emulator or a connected real device. Native inputs, selects, switches, checkboxes, file uploads, scrolling and application lifecycle commands are ready for end-to-end mobile flows.
From empty folder to UI + API examples
Create a Node project
npm init -yInstall Ruviolta
npm install -g ruvioltaInitialize workspace
ruviolta initRun a tagged example
ruviolta run projects/example "@exampleDomain"npm init -y
npm install -g ruviolta
ruviolta init
ruviolta run projects/example "@exampleDomain"The run examples use the ruviolta executable. With a project-local npm installation, prefix the same command with npx unless Ruviolta is already available on your shell PATH.
One platform instead of separate Web, API and mobile worlds
Driver-free browser UI
Chrome and Edge use CDP. Firefox uses WebDriver BiDi. No separate browser drivers to download or keep in sync.
First-class API testing
Use api(), assertions, capture, OAuth 2.0, GraphQL, SOAP, polling, WebSocket and SSE directly inside .ut files.
Native Android testing
Use the same project model and readable commands with the Ruviolta Emulator or a connected physical Android device. Android support is downloaded only after explicit initialization.
Mixed UI + API flows
Go UI → API → UI or API → UI → API in one scenario. The browser starts lazily only when a browser step is actually reached.
API-aware Stepflow
Debug API-only tests in the standalone Stepflow window, then continue inside the injected panel when a mixed flow reaches the browser.
Unified reports
Browser steps, API requests, assertions, captures, reusable flows, cases, cleanup and screenshots stay together in the same project report.
Reusable parameterized flows
param() declares bindable flow inputs, run() accepts positional and named invocation values, output() returns data, and nested or cross-project flows keep their own local scope.
Download mobile support only when you need it
ruviolta android init
ruviolta mobile start android
ruviolta mobile app install android projects/android/demoData/Ruviolta-Demo-1.1.2.apk
ruviolta run projects/android "@demoTest"
ruviolta mobile stop androidA clean Web/API install by default
ruviolta android init detects Windows or Linux, downloads and verifies the matching Android package, installs the managed runtime outside your workspace, and creates only the editable projects/android example.
Advanced capabilities that stay readable
Parallel Workers
Run explicit isolated lanes concurrently. Each Worker owns its runtime, browser session, variables and login state.
Multiple isolated windows
Switch with openWindow() while each declared window keeps an independent browser process and profile.
Network mocking
Return custom responses, block requests or introduce deterministic delay with scenario-scoped browser network mocks.
Failure evidence
Optional failure video, screenshots, browser console evidence and unified nested reports make failures easier to understand.
Request → verify → capture → continue in the browser
File Description: Mixed UI and API example
@mixedUiApiExample
Scenario: Move from UI to API and back to UI
Variables:
let userId = 1
waitForText("body", "Example Domain", 5000)
clickLink("Learn more")
waitForUrlContains("iana.org", 5000)
api("GET", "/users/{id}", {
path: { id: userId }
})
Verify:
expectStatus(200)
expectHeader("content-type", /json/)
expectJson("$.id", userId)
expectExists("$.name")
captureJson("$.id") -> verifiedUserId
visit("https://example.com/?verifiedUser=" + verifiedUserId)
waitForUrlContains("verifiedUser=1")
waitForText("body", "Example Domain")No mode switch
UI and API are simply different kinds of Ruviolta steps. Conditional UI waits can optionally use a timeout in milliseconds as their final argument; when omitted, the project timeout is used. Captured response data can immediately drive browser navigation, reusable flows, cleanup, or another API request.
More than basic REST requests
Requests & auth
Path/query parameters, headers, cookies, JSON, form, text, binary, multipart, Bearer, Basic, API keys and custom signing.
Assertions & capture
Status, headers, cookies, deep JSON, schema, XPath, response time, text, grouped Verify:, captureJson() and captureXPath().
Protocols
GraphQL, SOAP 1.1/1.2, OAuth 2.0 and polling use the same response, report and debugger model.
Realtime
Named WebSocket and SSE sessions support send/receive, filtering, counts, timeouts and deterministic cleanup.
One project model across supported browsers
| Browser | Protocol | Windows | Linux |
|---|---|---|---|
| Google Chrome | Chrome DevTools Protocol | Supported | Supported |
| Microsoft Edge | Chrome DevTools Protocol | Supported | Supported |
| Mozilla Firefox | WebDriver BiDi | Supported | Supported |
baseUrl and use only api.baseUrl. In mixed flows, Ruviolta starts the configured browser only when the first browser command is reached.Ruviolta 3.0.1
Android joins the platform
Virtual and real devices, native controls, application lifecycle, file upload, contextual selectors, project data and lazy platform provisioning extend Ruviolta beyond the browser and API.
User Testing, one readable language
The same .ut file format and project model cover Web UI, API, Android and reusable cross-project flows without separate runners.