できない.dev

Playwright で page.goto が net::ERR_CONNECTION_REFUSED になる

テスト対象サーバーがまだ起動していない・URL やポートが違う・webServer 設定が無いと、page.goto が接続拒否で失敗する。
webServer を設定して起動完了を待たせれば解消する。

公開: 更新:

実行例あり(2026-09-19 に実環境で検証)

要約

page.goto の net::ERR_CONNECTION_REFUSED は、接続先でサーバーが待ち受けていないときに出ます。

多くは「アプリサーバーがまだ起動していない」「URL やポートが違う」「webServer 未設定で起動を待っていない」のいずれかです。

Playwright の webServer を設定すると、テスト開始前にサーバーを起動し、指定 URL が応答するまで待ってくれます。

実行例

baseURL が 3000 のままでサーバーが 3001 で待ち受けていると page.goto は net::ERR_CONNECTION_REFUSED で落ち、curl でも 3000 だけ接続できない。
baseURL を実際のポートに合わせるとテストは通り、webServer を設定した場合は DEBUG=pw:webserver に起動待ちの再試行が 200 を返すまで並ぶ。

$ npx playwright test --reporter=line
Running 1 test using 1 worker
 
[1/1] home.spec.js:3:1 › トップページが表示される
  1) home.spec.js:3:1 › トップページが表示される ───────────────────────────────────────────────────────────────
 
    Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:3000/
    Call log:
      - navigating to "http://localhost:3000/", waiting until "load"
 
      2 |
      3 | test("トップページが表示される", async ({ page }) => {
    > 4 |   await page.goto("/");
        |              ^
      5 |   await expect(page.locator("h1")).toHaveText("できない.dev");
      6 | });
      7 |
        at /tmp/tmp.E87GkHLsXn/home.spec.js:4:14
 
    Error Context: test-results/home-トップページが表示される/error-context.md
 
  1 failed
    home.spec.js:3:1 › トップページが表示される ────────────────────────────────────────────────────────────────
終了コード: 1
$ grep -n baseURL playwright.config.js
4:  use: { browserName: "chromium", baseURL: "http://localhost:3000" },
$ curl -sS http://localhost:3000/
curl: (7) Failed to connect to localhost port 3000 after 0 ms: Couldn't connect to server
$ curl -sS http://localhost:3001/
<h1>できない.dev</h1>
$ grep -n baseURL playwright.config.js
4:  use: { browserName: "chromium", baseURL: "http://localhost:3001" },
$ npx playwright test --reporter=line
Running 1 test using 1 worker
 
[1/1] home.spec.js:3:1 › トップページが表示される
  1 passed (425ms)
終了コード: 0
$ DEBUG=pw:webserver npx playwright test --reporter=line
2026-09-19T03:32:53.098Z pw:webserver HTTP GET: http://localhost:3000/
2026-09-19T03:32:53.105Z pw:webserver Error while checking if http://localhost:3000/ is available: connect ECONNREFUSED ::1:3000
connect ECONNREFUSED 127.0.0.1:3000
2026-09-19T03:32:53.105Z pw:webserver Starting WebServer process npm run start...
2026-09-19T03:32:53.107Z pw:webserver Process started
2026-09-19T03:32:53.107Z pw:webserver Waiting for availability...
2026-09-19T03:32:53.107Z pw:webserver HTTP GET: http://localhost:3000/
2026-09-19T03:32:53.108Z pw:webserver Error while checking if http://localhost:3000/ is available: connect ECONNREFUSED ::1:3000
connect ECONNREFUSED 127.0.0.1:3000
2026-09-19T03:32:53.108Z pw:webserver Waiting 100ms
[WebServer] 
[WebServer] > tmp.e87gkhlsxn@1.0.0 start
[WebServer] > node server.js
[WebServer] 
 
2026-09-19T03:32:53.209Z pw:webserver HTTP GET: http://localhost:3000/
2026-09-19T03:32:53.210Z pw:webserver Error while checking if http://localhost:3000/ is available: connect ECONNREFUSED ::1:3000
connect ECONNREFUSED 127.0.0.1:3000
2026-09-19T03:32:53.210Z pw:webserver Waiting 250ms
2026-09-19T03:32:53.461Z pw:webserver HTTP GET: http://localhost:3000/
2026-09-19T03:32:53.461Z pw:webserver Error while checking if http://localhost:3000/ is available: connect ECONNREFUSED ::1:3000
connect ECONNREFUSED 127.0.0.1:3000
2026-09-19T03:32:53.461Z pw:webserver Waiting 500ms
2026-09-19T03:32:53.962Z pw:webserver HTTP GET: http://localhost:3000/
2026-09-19T03:32:53.965Z pw:webserver Error while checking if http://localhost:3000/ is available: connect ECONNREFUSED ::1:3000
connect ECONNREFUSED 127.0.0.1:3000
2026-09-19T03:32:53.965Z pw:webserver Waiting 1000ms
[WebServer] listening on 3000
 
2026-09-19T03:32:54.966Z pw:webserver HTTP GET: http://localhost:3000/
2026-09-19T03:32:54.969Z pw:webserver HTTP Status: 200
2026-09-19T03:32:54.970Z pw:webserver WebServer available
 
Running 1 test using 1 worker
 
[1/1] home.spec.js:3:1 › トップページが表示される
2026-09-19T03:32:55.387Z pw:webserver Terminating the WebServer
2026-09-19T03:32:55.389Z pw:webserver Terminated the WebServer
  1 passed (2.3s)
終了コード: 0

— 2026-09-19 時点の出力

検証環境

検証日
実行環境
node:20Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. アプリサーバーが起動する前にテストが goto してしまう。
  2. baseURL や goto のポートが実際の起動先と違う。
  3. webServer 未設定で、起動完了を待つ仕組みが無い。

解決策

1. webServer を設定して起動を待たせる

// playwright.config.ts
import { defineConfig } from "@playwright/test";
 
export default defineConfig({
  use: { baseURL: "http://localhost:3000" },
  webServer: {
    command: "npm run start",
    url: "http://localhost:3000",
    reuseExistingServer: !process.env.CI,
  },
});

url を指定すると、そこが応答するまで Playwright がテスト開始を待ちます。

2. URL とポートを合わせる

baseURL と webServer.url、実際の起動ポートを一致させます。
アプリが 3000 以外で起動するなら全箇所をそろえます。

3. 起動ログで切り分ける

DEBUG=pw:webserver npx playwright test

webServer の起動コマンドや待機状況が出力されるので、起動失敗かポート違いかを切り分けられます。
詳しくは公式の Web server | Playwright(新しいタブで開く) を参照してください。

この記事は役立ちましたか?