Parallel and cross-browser
Both work today, on the recordings you already have. Nothing is recorded again, and nothing here spends tokens.
Run in parallel
npx saffron run --workers 4
or "workers": 4 in saffron.config.json. Each worker replays one
scenario at a time in its own browser context, so cookies and storage
never leak between scenarios.
What happens to a scenario that cannot simply replay (no cache yet, a
stale cache, or a failure): it is set aside, and after the parallel phase
it runs again on its own, with the agent, exactly as it would without
--workers. Healing depends on the precise state of the failed page, so
agent work stays sequential. The cost is one extra replay for those
scenarios; a fully cached suite pays nothing.
| How many workers | Start with the number of CPU cores. Browsers are the cost, not Saffron. |
| Order | Scenarios start in file order and finish in any order. The report keeps file order. |
--no-agent |
Combine them in CI: --workers 4 --no-agent is the fast, zero-token gate. |
| Shared test data | Parallel scenarios share your application. Two scenarios that edit the same record will interfere, the same as in any parallel runner. Give them their own data, or keep them in one scenario. |
Run on another browser
npx saffron run --no-agent --browser firefox
npx saffron run --no-agent --browser webkit
or "browser": "firefox" in the config. Install the engine once with
npx playwright install firefox webkit.
Recordings are browser-neutral: targets are roles, names and labels, not engine-specific selectors. Record once on Chromium, replay on every engine. Recording and healing always use Chromium, because the agent attaches to the browser over CDP. Under Firefox or WebKit a scenario that needs the agent fails with that instruction instead of a confusing error, so a red there means "record this on Chromium first" or a genuine cross-browser difference in your app.
Supported today: chromium, firefox, webkit. Branded Chrome and Edge,
and several engines in one command, are on the roadmap.
A cross-browser matrix in CI
strategy:
matrix:
browser: [chromium, firefox, webkit]
steps:
- run: npm ci
- run: npx playwright install ${{ matrix.browser }} --with-deps
- run: npx saffron run --no-agent --strict --workers 4 --browser ${{ matrix.browser }}
Three jobs, zero tokens, no credentials: replay needs no AI provider.
Run in parallel
npx saffron run --workers 4
or "workers": 4 in saffron.config.json. Each worker replays one
scenario at a time in its own browser context, so cookies and storage
never leak between scenarios.
What happens to a scenario that cannot simply replay (no cache yet, a
stale cache, or a failure): it is set aside, and after the parallel phase
it runs again on its own, with the agent, exactly as it would without
--workers. Healing depends on the precise state of the failed page, so
agent work stays sequential. The cost is one extra replay for those
scenarios; a fully cached suite pays nothing.
| How many workers | Start with the number of CPU cores. Browsers are the cost, not Saffron. |
| Order | Scenarios start in file order and finish in any order. The report keeps file order. |
--no-agent |
Combine them in CI: --workers 4 --no-agent is the fast, zero-token gate. |
| Shared test data | Parallel scenarios share your application. Two scenarios that edit the same record will interfere, the same as in any parallel runner. Give them their own data, or keep them in one scenario. |
Run on another browser
npx saffron run --no-agent --browser firefox
npx saffron run --no-agent --browser webkit
or "browser": "firefox" in the config. Install the engine once with
npx playwright install firefox webkit.
Recordings are browser-neutral: targets are roles, names and labels, not engine-specific selectors. Record once on Chromium, replay on every engine. Recording and healing always use Chromium, because the agent attaches to the browser over CDP. Under Firefox or WebKit a scenario that needs the agent fails with that instruction instead of a confusing error, so a red there means "record this on Chromium first" or a genuine cross-browser difference in your app.
Supported today: chromium, firefox, webkit. Branded Chrome and Edge,
and several engines in one command, are on the roadmap.
A cross-browser matrix in CI
strategy:
matrix:
browser: [chromium, firefox, webkit]
steps:
- run: npm ci
- run: npx playwright install ${{ matrix.browser }} --with-deps
- run: npx saffron run --no-agent --strict --workers 4 --browser ${{ matrix.browser }}
Three jobs, zero tokens, no credentials: replay needs no AI provider.