## TL;DR

`ERR_ABORTED` means something cancelled the navigation: a redirect chain, a download starting, or the SPA router intercepting it. Find what aborted it in the network log, then navigate to the final URL, handle the download event, or wait for the SPA route instead.

## Error

```text
Error: page.goto: net::ERR_ABORTED; maybe frame was detached?
```

## Steps

1. Open the trace and look at the network tab around the goto. Expected: you see the redirect, download, or cancelled request.
2. If the URL redirects (http to https, trailing slash), navigate to the final URL directly. Expected: one clean navigation, no abort.
3. If the goto triggers a download, handle it: `const dl = await page.waitForEvent('download'); await page.getByRole('link', { name: 'Export' }).click()`. Expected: no goto for downloads at all.
4. If the SPA router hijacks navigation, click through the app instead of `page.goto()` for in-app moves. Expected: the router handles the transition.
5. As a diagnostic, try `waitUntil: 'commit'` instead of the default `load`. Expected: distinguishes slow-load from aborted-load.

## When to use

- `page.goto` fails with `ERR_ABORTED` specifically.
- The URL works when pasted into a manual browser.

## When not to use

- `ERR_CONNECTION_REFUSED` or DNS errors (server not reachable).
- Navigation succeeds but the page content is wrong (app bug).

## Tool compatibility

- Playwright 1.30 through latest; all browsers.

## Variant phrasings

### page.goto: net::ERR_ABORTED; maybe frame was detached

The full form; the frame detached because navigation was cancelled.

### Navigation aborted in Playwright

Same event from the reporter's perspective.

## Why it happens

The browser started loading, then something legitimately cancelled it. Playwright reports the cancellation instead of silently continuing.

## Edge cases

- Service workers can abort navigations they decide to handle; test with a fresh context.
- `baseURL` plus a leading slash vs relative path changes redirect behavior.
- Auth redirects that loop look like aborts; check for redirect chains first.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_Hj9AX3Y34q-UOSshbzmIVw
