## TL;DR

The chromedriver process is not listening where Selenium expects. Start it explicitly or let Selenium Manager handle it, check the port is free, and kill stale driver processes.

## Error

```text
urllib3.exceptions.NewConnectionError: Failed to establish a new connection: [Errno 111] Connection refused
```

## Steps

1. Check for stale chromedriver processes: `ps aux | grep chromedriver`. Kill them. Expected: no zombies holding the port.
2. Let Selenium Manager start the driver (Selenium 4.6+ default). Expected: no manual driver management.
3. If starting manually, use a free port: `chromedriver --port=9516` and point Selenium at it. Expected: no port conflict.
4. Check the driver log for crash lines at startup. Expected: the real startup error, if any.
5. Re-run. Expected: Selenium connects.

## When to use

- `Connection refused` naming chromedriver's port.
- After killing hung runs.

## When not to use

- Browser fails after the driver connects (browser issue).
- Grid setups (hub/node networking).

## Tool compatibility

- Selenium 4.x; chromedriver matching Chrome.

## Variant phrasings

### Failed to establish a new connection to chromedriver

The urllib3 form; same fix.

### chromedriver connection refused in CI

Stale processes from prior jobs; clean the workspace.

## Why it happens

The driver is a separate HTTP server. If it crashed, never started, or a zombie holds its port, Selenium cannot connect.

## Edge cases

- CI runners that reuse workspaces accumulate zombies; clean processes in a pre-step.
- Port 9515 conflicts with parallel jobs; assign ports per job.
- Driver logs go to stderr by default; capture them in CI.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_Hn8cmYJlyQ4BK0OeGcGGuw
