Skip to content
Latchkey

Playwright "Timed out waiting ... from config.webServer"

Playwright started your app via webServer but the configured url never responded within the timeout. The server is slow to compile/boot in CI, crashed on start, or the url/port does not match.

What this error means

The run aborts before tests with "Timed out waiting 60000ms from config.webServer." No specs run because Playwright never confirmed the app was ready.

Playwright output
Error: Timed out waiting 60000ms from config.webServer.

  at WebServer._waitForProcess

Diagnose it: browser, server, or timing?

End-to-end failures in CI are dominated by three causes that have nothing to do with the test: the browser binary is missing, the application under test is not listening yet, or the test raced the page. Establish which before reading the assertion.

Terminal
# 1. are the browsers actually installed in THIS job?
npx playwright install --with-deps chromium
npx playwright --version

# 2. is the app up before the tests start?
npx wait-on http://localhost:3000 --timeout 60000

# 3. capture evidence for the failure you cannot reproduce
npx playwright test --trace on --video retain-on-failure

Common causes

App boots slower than the timeout in CI

A cold build (Next/Vite production build, asset compilation) on a loaded runner takes longer than the default 60s readiness window - a timing race that often clears on retry.

Wrong url/port or a crashed server

The webServer.url does not match where the app listens, or the start command exits/crashes immediately, so the url never becomes reachable.

How to fix it

Raise the readiness timeout and match the url

playwright.config.ts
// playwright.config.ts
export default defineConfig({
  webServer: {
    command: 'npm run start',
    url: 'http://localhost:3000',
    timeout: 180_000,
    reuseExistingServer: !process.env.CI,
  },
});

Diagnose a server that never starts

  1. Run the command manually in CI to confirm it boots and listens on the expected port.
  2. Check the server logs Playwright prints for a crash on startup.
  3. Build the app in a prior step so webServer only has to serve, not compile.

Make the browser cache safe

  • Key the browser cache to the exact test-runner version. A cache restored from a different version gives you a binary that does not match the client and fails in a way that reads like a missing install.
  • Install browsers after dependencies, not before; a dependency install can replace the package that owns the browser path.
  • Prefer the vendor container image when the runner allows it. It removes the whole class of missing-system-library failures.

How to prevent it

  • Set a generous webServer.timeout for the slowest CI tier.
  • Pre-build the app before the E2E step so boot is fast.
  • Keep webServer.url and the app port in one shared value.

Frequently asked questions

What causes Playwright "Timed out waiting ... from config.webServer"?
There are 2 common causes: app boots slower than the timeout in ci and wrong url/port or a crashed server. A cold build (Next/Vite production build, asset compilation) on a loaded runner takes longer than the default 60s readiness window - a timing race that often clears on retry.
How do I fix Playwright "Timed out waiting ... from config.webServer"?
There are 2 fixes depending on which cause you have: raise the readiness timeout and match the url and diagnose a server that never starts. Work through them in order, since the first is the most common.
What does Playwright "Timed out waiting ... from config.webServer" actually mean?
The run aborts before tests with "Timed out waiting 60000ms from config.webServer." No specs run because Playwright never confirmed the app was ready.
How do I stop Playwright "Timed out waiting ... from config.webServer" happening again?
Set a generous webServer.timeout for the slowest CI tier. The prevention section lists 3 changes that keep it from recurring.
Can Latchkey fix this automatically?
Yes. Latchkey runs your GitHub Actions on managed runners that detect this failure, apply the fix, and retry the job automatically - self-healing is on by default.

Related guides

References

This is a timeout, not a logic error. Latchkey detects, repairs, and retries it for you. Start free → 30-day trial · No credit card