From b8b3ec5d6405e17a6b2cefc374019a699cfcec68 Mon Sep 17 00:00:00 2001 From: Test User Date: Tue, 21 Apr 2026 21:11:00 +0000 Subject: [PATCH] fix(e2e): scope heading locators to main content area MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace bare getByRole("heading", { name: /Intel GPU — .../i }) calls with page.locator('main').getByRole('heading', { name: '...' }) so that each locator matches exactly one element and Playwright strict mode is satisfied. The main element is the appropriate scoping container for plugin page content. Exact name matching (without regex) is used to be precise about which heading is being targeted. Co-Authored-By: Paperclip --- e2e/intel-gpu.spec.ts | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/e2e/intel-gpu.spec.ts b/e2e/intel-gpu.spec.ts index 104380d..3aae3ef 100644 --- a/e2e/intel-gpu.spec.ts +++ b/e2e/intel-gpu.spec.ts @@ -19,16 +19,18 @@ test.describe('Intel GPU plugin smoke tests', () => { // Should navigate to the overview route await expect(page).toHaveURL(/\/intel-gpu$/); - await expect(page.getByRole('heading', { name: /Intel GPU — Overview/i })).toBeVisible(); + await expect( + page.locator('main').getByRole('heading', { name: 'Intel GPU — Overview' }) + ).toBeVisible(); }); test('overview page renders GPU device list or empty state', async ({ page }) => { await page.goto('/c/main/intel-gpu'); // Overview heading should be present - await expect(page.getByRole('heading', { name: /Intel GPU — Overview/i })).toBeVisible({ - timeout: 15_000, - }); + await expect( + page.locator('main').getByRole('heading', { name: 'Intel GPU — Overview' }) + ).toBeVisible({ timeout: 15_000 }); // Either a populated table/list or an empty-state indicator must be visible const hasTable = await page.locator('table').first().isVisible().catch(() => false); @@ -43,9 +45,9 @@ test.describe('Intel GPU plugin smoke tests', () => { test('device plugins page renders or shows empty state', async ({ page }) => { await page.goto('/c/main/intel-gpu/device-plugins'); - await expect(page.getByRole('heading', { name: /Intel GPU — Device Plugins/i })).toBeVisible({ - timeout: 15_000, - }); + await expect( + page.locator('main').getByRole('heading', { name: 'Intel GPU — Device Plugins' }) + ).toBeVisible({ timeout: 15_000 }); const hasTable = await page.locator('table').first().isVisible().catch(() => false); const hasEmptyState = await page @@ -61,18 +63,24 @@ test.describe('Intel GPU plugin smoke tests', () => { // not after clicking the parent entry from the overview. Test route // accessibility via direct navigation — each route must render its heading. await page.goto('/c/main/intel-gpu'); - await expect(page.getByRole('heading', { name: /Intel GPU — Overview/i })).toBeVisible({ - timeout: 15_000, - }); + await expect( + page.locator('main').getByRole('heading', { name: 'Intel GPU — Overview' }) + ).toBeVisible({ timeout: 15_000 }); await page.goto('/c/main/intel-gpu/nodes'); - await expect(page.getByRole('heading', { name: /Intel GPU — Nodes/i })).toBeVisible({ timeout: 15_000 }); + await expect( + page.locator('main').getByRole('heading', { name: 'Intel GPU — Nodes' }) + ).toBeVisible({ timeout: 15_000 }); await page.goto('/c/main/intel-gpu/pods'); - await expect(page.getByRole('heading', { name: /Intel GPU — Pods/i })).toBeVisible({ timeout: 15_000 }); + await expect( + page.locator('main').getByRole('heading', { name: 'Intel GPU — Pods' }) + ).toBeVisible({ timeout: 15_000 }); await page.goto('/c/main/intel-gpu/metrics'); - await expect(page.getByRole('heading', { name: /Intel GPU — Metrics/i })).toBeVisible({ timeout: 15_000 }); + await expect( + page.locator('main').getByRole('heading', { name: 'Intel GPU — Metrics' }) + ).toBeVisible({ timeout: 15_000 }); }); test('plugin settings page shows intel-gpu plugin entry', async ({ page }) => { -- 2.52.0