## 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

```text
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

1. Confirm it was a crash, not test failures: grep the output for `browser has been closed`, `Target crashed`, or `Browser closed unexpectedly`. Expected: you find a crash marker, distinct from assertion failures.
2. 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.
3. If the run died before writing results, re-derive the split from `--reporter=list` stdout or CI logs: any test that printed a result is done. Expected: a list of unfinished test titles.
4. Re-run only the unfinished tests: `npx playwright test --last-failed` covers failed ones, or pass the unfinished spec files explicitly. Add `--workers=2` to lower crash odds on the retry. Expected: the retry covers only what did not finish.
5. Merge the reports with `npx playwright merge-reports` so 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
