Android is now part of Ruviolta.
The same readable .ut (User Testing) language now drives native Android applications on the Ruviolta Emulator and connected real devices. Web, API and Android testing live in one intentionally unified platform.

Android in one view
Ruviolta Emulator
Use a managed Android virtual device with deterministic display, lifecycle and application settings.
Real devices
Run the same tests on a supported USB-connected Android device with debugging authorized.
Native controls
Interact with inputs, spinners, switches, checkboxes, radio options, scrolling, gestures and file pickers.
Lazy provisioning
The normal Web/API install stays small. Android is downloaded only after explicit initialization.
One command provisions the correct Android package
ruviolta android initruviolta mobile start android
ruviolta mobile status
ruviolta mobile stop androidPlatform-aware and non-destructive
Initialization detects Windows or Linux, downloads and verifies the matching runtime, and creates projects/android. Existing project files are preserved and a verified runtime is reused.
The managed runtime stays outside the user workspace, so Web/API projects remain clean.
Install, launch and inspect Android applications
app install
Install any local APK on the configured virtual or real device.
ruviolta mobile app install android path/to/app.apkapp launch
Install when needed and open an Android application.
ruviolta mobile app launch android path/to/app.apkinspect
See accessible native controls and selectors from the current screen.
ruviolta mobile inspect androidTest real mobile interactions with readable commands
Variables:
let file = "../demoData/DemoData.pdf"
waitFor(contains["SIGNED IN"])
waitFor("FORM").click()
waitFor("First name").replaceInput("Georgi")
waitFor("Country select").select("Bulgaria")
upload("Choose a file", file)
checkbox("Accept demo terms checkbox", ON)
switch("Enable notifications switch", ON)
waitFor("Submit request").click()Native controls, familiar flow
waitFor(), click(), input(), replaceInput(), select() and upload() work with native controls. State helpers cover checkboxes, switches and radio options.
Gestures include longPress(), dragAndDrop(), scrollTo(), swipe() and back().
Find controls by meaning, context or symbol
contains[]
Use normalized, case-insensitive partial text.
waitFor(contains["SIGNED IN"])Context selectors
Scope a target with nextTo[], before[] or after[].
click("A", nextTo["Class 7"])
click("Save", before["Edit"])
waitFor("Student", after["Title"])symbol[]
Match an icon by its exposed Unicode code point and combine it with context.
waitFor(
symbol["U+F100"],
nextTo[contains["Georgi"]]
).click()Keep local test data out of committed examples
export default {
androidLogin: {
email: "[email protected]",
password: "Ruviolta123",
},
};data(), project .env and explicit login()
Read private values with data("androidLogin", "email"), project-local environment values with env("NAME"), and invoke the configured login flow with login("androidLogin").
Safe example templates remain trackable while real config/data.mjs and .env files stay local.
Change the device, not the test language
android: {
device: { type: "virtual" },
toolbar: "hide",
softKeyboard: "hidden"
}android: {
device: {
type: "real",
// serial: "optional-device-serial"
},
softKeyboard: "hidden"
}When the soft keyboard is hidden for a Ruviolta session, the previous device setting is restored when the session ends.