Fixtures

Deep links and required flows

Start deeper in the app: URLs, launch settings, and flows that run first.

"Start on the checkout screen" should be a launch, not twelve taps.

A flow's app.url is opened right after the app launches (simctl openurl on iOS, an android.intent.action.VIEW intent on Android):

"app": { "bundleId": "com.example.shop", "url": "shop://checkout" }

Links the app itself handles, its own scheme or a universal link, keep the launched process. System links such as sms: or tel: make iOS start the target app afresh, which the driver cannot follow.

Launch environment and arguments

app.env and app.args are passed to the app at launch: a mock-server URL, a feature flag, a -ui-testing argument your app checks.

An environment can set all three for every flow, with a flow's own values winning per key:

environments:
  staging:
    vars: { api: https://staging.example.com }
    launch:
      env: { API_URL: "{{ vars.api }}", MOCK_PAYMENTS: "1" }
      args: [-ui-testing]
      url: shop://home

Required flows

{
  "name": "Shop: check out",
  "requires": "sign-in",
  "app": { "bundleId": "com.example.shop" },
  "goal": "…"
}

requires names flows (files beside this one, .json optional; a string or a list) that must have passed first. They run once per invocation, however many flows require them, and this flow runs only if they passed. A flow that signs in leaves the app's saved session behind, so the dependent flow launches already signed in. A required flow that fails stops its dependents with a message naming it; a missing file is reported with the path that was looked for.