From 6a939df6ca482595ae99ada829d5e2c22c3fdbda Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 17:03:10 +0000 Subject: [PATCH] test(e2e): pick the header Create link button in share-links spec The empty state renders a second Create link button, so the main-scoped locator matched two elements and failed in strict mode. Co-Authored-By: Claude Opus 5.5 (1M context) Signed-off-by: Claude --- web/e2e/specs/live/share-links.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/e2e/specs/live/share-links.spec.ts b/web/e2e/specs/live/share-links.spec.ts index 899126adf..2e292db59 100644 --- a/web/e2e/specs/live/share-links.spec.ts +++ b/web/e2e/specs/live/share-links.spec.ts @@ -160,13 +160,14 @@ test.describe("live: share links", () => { // not because a dialog could be open yet here (none is), but so this // stays correct even if a previous dialog's DOM lingers — the button text // "Create link" is shared with the create dialog's own submit button. + // When the list is empty the page renders a second "Create link" (the empty-state CTA, ShareLinks.tsx), so take the header one with .first(). async function openCreateDialog(page: Page): Promise { const detail = new ServerDetailPage(page); await detail.goto(serverName); await expect(page.getByRole("heading", { name: serverName })).toBeVisible({ timeout: 20_000 }); await detail.clickTab("Settings"); await page.getByRole("tab", { name: /^share links$/i }).click(); - await page.getByRole("main").getByRole("button", { name: "Create link" }).click(); + await page.getByRole("main").getByRole("button", { name: "Create link" }).first().click(); const dialog = page.getByRole("dialog", { name: new RegExp(`^create share link for ${serverName}$`, "i"), });