diff --git a/tests/e2e/playwright.config.ts b/tests/e2e/playwright.config.ts index 4423a77..85be0a2 100644 --- a/tests/e2e/playwright.config.ts +++ b/tests/e2e/playwright.config.ts @@ -12,6 +12,12 @@ export default defineConfig({ timeout: 90_000, expect: { timeout: 15_000 }, retries: 1, + // Run the specs serially. Each spec drives a full `channel: 'chromium'` browser, and the e2e + // shares an 8 GB runner with the entire compose stack (OpenZaak, NRC, Keycloak, Flowable, 4× + // Postgres, every service + 3 portals). Two parallel browsers exhaust memory and the renderer is + // OOM-killed mid-action ("Page crashed") — fixing the flakiness at its source rather than leaning + // on `retries` (CLAUDE.md §15). Only two long-running happy-path specs, so serial costs little. + workers: 1, reporter: [['list']], use: { baseURL, @@ -26,7 +32,13 @@ export default defineConfig({ // headless), not Playwright's default headless-shell, so pin `channel: 'chromium'`. channel: 'chromium', launchOptions: { - args: [`--unsafely-treat-insecure-origin-as-secure=${baseURL},${behandelURL}`], + args: [ + `--unsafely-treat-insecure-origin-as-secure=${baseURL},${behandelURL}`, + // Write Chromium's shared memory to /tmp instead of the container's small /dev/shm, so a + // large DOM/heap can't crash the renderer on the memory-constrained runner (belt-and-braces + // alongside the single worker above). + '--disable-dev-shm-usage', + ], }, }, projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],