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.
Deep links
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://homeRequired 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.