agent's playwright browser crashed mid-suite: how to recover the run
Recovers an aborted Playwright suite after a mid-run browser crash by splitting finished from unfinished tests and re-running only the remainder. Use when a run dies with browser-closed or target-crashed errors halfway through. Not for first-test crashes (environment issue) or ordinary assertion failures.
TL;DR
Do not restart the whole suite when the Playwright browser crashes. Detect the crash from the output, figure out which tests already finished from the reporter JSON, and re-run only the unfinished ones with --last-failed or an explicit list, then merge the reports.
Error
Running 120 tests using 4 workers
78 passed, 2 failed (3m 12s)
Error: browser has been closed
at Connection.onClose (playwright/lib/client/connection.js)Half the suite ran, then the browser process died and the run aborted.
Steps
- Confirm it was a crash, not test failures: grep the output for
browser has been closed,Target crashed, orBrowser closed unexpectedly. Expected: you find a crash marker, distinct from assertion failures. - Check for reporter output: if you ran with
--reporter=json, open the JSON and list every test with a recorded result. Expected: a concrete done versus not-done split. - If the run died before writing results, re-derive the split from
--reporter=liststdout or CI logs: any test that printed a result is done. Expected: a list of unfinished test titles. - Re-run only the unfinished tests:
npx playwright test --last-failedcovers failed ones, or pass the unfinished spec files explicitly. Add--workers=2to lower crash odds on the retry. Expected: the retry covers only what did not finish. - Merge the reports with
npx playwright merge-reportsso the final report reflects the whole suite. Expected: one report, no double-counted tests.
When to use
- A Playwright run aborts mid-suite with a browser crash message.
- CI shows partial results and the job died on the browser process.
- You want to salvage a long suite instead of paying for a full re-run.
When not to use
- The browser crashes on the very first test every time (that is an environment problem: missing system deps, bad launch args; fix the environment, not the resume).
- Tests fail with assertion errors but the browser stays up (normal failures, not a crash).
- You changed code between the crash and the retry (re-run everything; partial results are stale).
Tool compatibility
- Playwright Test 1.30+, any browser channel it supports.
- JSON and list reporters; the merge-reports CLI for combining runs.
Variant phrasings
Playwright worker process died
Worker crashes leave the browser up but kill parallelism. Same recovery: split done from not-done, re-run the rest.
Target crashed in headless Chromium
Usually memory pressure or GPU flags. Recover the run first, then fix launch args (disable GPU, lower workers) so it does not recur.
CI killed the browser (out of memory)
The container ran out of memory. Resume the run to get results now, then raise the container memory or shard the suite.
Why it happens
Browser crashes mid-suite are usually resource exhaustion (too many workers, memory-hungry pages, GPU in headless CI) or an unstable browser build, not test bugs. The suite itself is fine; only the runner process died, so the completed results are still valid and only the remainder needs running.
Edge cases
- A crash can corrupt the JSON reporter mid-write: validate the JSON parses before trusting the done/not-done split.
- Retried tests that depend on state from earlier tests (shared fixtures, seeded DBs) may fail on resume; make setup idempotent or re-run the dependent chain.
- If crashes repeat at the same test, that test is probably crashing the browser (huge DOM, runaway page JS): quarantine it and investigate separately.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_IlHtipiNbhWcjDkN9CuBMg