diff --git a/tests/e2e/file-explorer-watch-refresh.spec.ts b/tests/e2e/file-explorer-watch-refresh.spec.ts index d8a1bc1e4e7..85fbd66409e 100644 --- a/tests/e2e/file-explorer-watch-refresh.spec.ts +++ b/tests/e2e/file-explorer-watch-refresh.spec.ts @@ -35,7 +35,7 @@ test('refreshes the visible tree after external Windows file changes', async ({ const row = (name: string) => orcaPage .locator('[data-file-explorer-row]') - .filter({ hasText: new RegExp(`^${name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`) }) + .filter({ has: orcaPage.getByText(name, { exact: true }) }) rmSync(originalPath, { force: true }) rmSync(renamedPath, { force: true }) diff --git a/tests/e2e/helpers/ssh-config-host-picker.ts b/tests/e2e/helpers/ssh-config-host-picker.ts index 9b7d7b2d34a..1ad35ad7699 100644 --- a/tests/e2e/helpers/ssh-config-host-picker.ts +++ b/tests/e2e/helpers/ssh-config-host-picker.ts @@ -73,11 +73,19 @@ export async function closeSettingsPage(page: Page): Promise { export async function closeOpenDialogs(page: Page): Promise { for (let attempt = 0; attempt < 5; attempt += 1) { + // Nested dialogs can finish their exit animations in different frames. + await expect(page.locator('[role="dialog"][data-state="closed"]')).toHaveCount(0, { + timeout: 3_000 + }) const dialogCount = await page.getByRole('dialog').count() if (dialogCount === 0) { return } - const dialog = page.getByRole('dialog').last() + const dialogId = await page.getByRole('dialog').last().getAttribute('id') + if (!dialogId) { + throw new Error('Open dialog is missing its Radix identity') + } + const dialog = page.locator(`[role="dialog"][id=${JSON.stringify(dialogId)}]`) const cancelOrBack = dialog.getByRole('button', { name: /^(Cancel|Back)$/ }) await ((await cancelOrBack .first() @@ -85,11 +93,10 @@ export async function closeOpenDialogs(page: Page): Promise { .catch(() => false)) ? cancelOrBack.first().click() : page.keyboard.press('Escape')) - await expect - .poll(async () => page.getByRole('dialog').count(), { timeout: 3_000 }) - .toBeLessThan(dialogCount) - .catch(() => undefined) + // Back can replace the picker with its parent without reducing the dialog count. + await expect(dialog).toBeHidden({ timeout: 3_000 }) } + await expect(page.getByRole('dialog')).toHaveCount(0, { timeout: 3_000 }) } /** Leave settings / overlays so the main shell (Add Project) is reachable. */ diff --git a/tests/e2e/tabs.spec.ts b/tests/e2e/tabs.spec.ts index d5106ce4dd2..50d02e507a4 100644 --- a/tests/e2e/tabs.spec.ts +++ b/tests/e2e/tabs.spec.ts @@ -157,7 +157,6 @@ test.describe('Tabs', () => { await orcaPage.getByRole('button', { name: 'New tab' }).click({ force: true }) const newMarkdownMenuItem = orcaPage.getByRole('menuitem', { name: /New Markdown/i }).first() await newMarkdownMenuItem.click() - await expect(newMarkdownMenuItem).toBeHidden({ timeout: 3_000 }) // Why: require an id that did not exist before the click, so an already-open // Markdown file can't satisfy the assertions (or be deleted by cleanup), and @@ -179,6 +178,7 @@ test.describe('Tabs', () => { const editor = orcaPage.locator('.rich-markdown-editor') await expect(editor).toBeVisible({ timeout: 25_000 }) + await expect(newMarkdownMenuItem).toBeHidden({ timeout: 3_000 }) await expect .poll(() => editor.evaluate((element) => document.activeElement === element), {