From 132b5f83d4af6bc0bda4338cfc598f07fd42b64f Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Mon, 10 Aug 2026 17:06:55 +0200 Subject: [PATCH 1/2] fix: serialize Playwright CI runs against shared external test sites Both playwright.yml and playwright-hlx.yml run tests against fixed, shared external sites (da-sites/da-status and da-testautomation/da-e2e-tests respectively) with no isolation between concurrent runs. Overlapping CI jobs from different PRs collide on the same backend, causing document create/cleanup races and timeouts that look like hangs (e.g. run 31389050902 on #1227: 27 failures, all timing out waiting for the editor to load, while two other PRs' Helix jobs were running against the same site concurrently). Add a concurrency group per workflow so runs queue instead of racing. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/playwright-hlx.yml | 4 ++++ .github/workflows/playwright.yml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.github/workflows/playwright-hlx.yml b/.github/workflows/playwright-hlx.yml index 139771259..02aed45df 100644 --- a/.github/workflows/playwright-hlx.yml +++ b/.github/workflows/playwright-hlx.yml @@ -7,6 +7,10 @@ on: pull_request: types: [opened, synchronize, reopened] +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: false + permissions: contents: read diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 20822b28a..5bd390dc1 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -7,6 +7,10 @@ on: pull_request: types: [opened, synchronize, reopened] +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: false + permissions: contents: read From 938782ef836b8326e278abbc6c5ef45a06e86699 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Mon, 10 Aug 2026 18:02:23 +0200 Subject: [PATCH 2/2] fix(e2e): catch late-appearing alert banners in dismissAlertBanner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dismissAlertBanner only checked once, with a bounded 3s wait, near the start of each test. Some banners (e.g. the "public sandbox" org warning on da-sites/da-status) depend on an async check that can resolve later than that window, so the one-shot check missed them — the banner then appeared mid-test and sat on top of later controls, blocking clicks (e.g. "Clicking Preview opens a confirmation dialog" timing out after 30s trying to click button.preview-button, blocked by #nx-toast-host's "Notifications" region). Now, if the banner isn't visible in the initial window, arm a background watcher for the rest of the test so a late appearance still gets dismissed. Co-Authored-By: Claude Sonnet 5 --- test/e2e/utils/utils.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/e2e/utils/utils.js b/test/e2e/utils/utils.js index 42a563deb..1eec8a40d 100644 --- a/test/e2e/utils/utils.js +++ b/test/e2e/utils/utils.js @@ -18,6 +18,7 @@ */ export async function dismissAlertBanner(page) { const alert = page.getByRole('alert'); + const dismiss = () => alert.getByRole('button', { name: 'Dismiss' }).click().catch(() => {}); let visible = await alert.isVisible().catch(() => false); if (!visible) { @@ -28,6 +29,13 @@ export async function dismissAlertBanner(page) { } if (visible) { - await alert.getByRole('button', { name: 'Dismiss' }).click(); + await dismiss(); + } else { + // Some banners (e.g. the "public sandbox" org warning) depend on an async + // check that can resolve well after this initial window, then sit on top + // of later controls (e.g. the preview button) and block clicks. Keep + // watching for a late appearance for the rest of the test instead of + // giving up after a single check. + alert.waitFor({ state: 'visible' }).then(dismiss).catch(() => {}); } }