Your first test

SootSim supports three testing approaches. Pick the one that matches your workflow.

Flow files (YAML)

The simplest place to start. Create flows/smoke.yaml:

- launchApp: {}
- waitFor:
text: 'Welcome'
timeout: 10000
- tapOn: 'Get Started'
- waitForAnimationToEnd: true
- assertVisible: 'Home'
- takeScreenshot: home-screen

Run it:

terminal

sootsim flow flows/smoke.yaml

Detox-style tests (Playwright)

If you want a familiar API, create test/my-app.test.ts:

import { test } from '@playwright/test'
import { sootsim } from 'sootsim-engine/test/kitchen-sink/sootsim-detox'
test('shows home screen', async ({ page }) => {
const { element, by, expect, waitFor } = await sootsim(page)
await expect(element(by.text('Welcome'))).toBeVisible()
await element(by.text('Get Started')).tap()
await expect(element(by.text('Home'))).toBeVisible()
})

Run with:

terminal

sootsim test

Detox compat (existing Detox suites)

If you already have Detox tests, SootSim can run them unmodified:

terminal

sootsim test --detox

This auto-detects your Detox configuration and remaps import { by, element, expect } from 'detox' to SootSim’s driver.

Test bridge API

All test drivers access the node tree through window.__sootsimTest:

// find elements
findByText(text) findById(id) findByTestId(testId)
findByLabel(label) findByRole(role) findAllByRole(role)
// inspect elements
getStyle(id) getLayout(id) getAbsolutePosition(id)
isVisible(id) getNodeCount()
// query
queryAll({ type?, hasText?, hasId?, hasRole?, hasLabel? })
// debug
dumpTree(maxDepth?) dumpAccessibilityTree(maxDepth?)
waitForTree()

CI integration

For plain JUnit test output in CI:

terminal

sootsim test --flows --reporter junit

That does not require a SootSim account.

If you also want SootSim cloud preview uploads from CI, that lane needs a paid plan plus a SOOTSIM_API_KEY secret created with sootsim keys create <label>. Use Personal for your own repos; use Team for shared org workflows and pooled quota.