From 14f4b4d17db6bb59211d484d9193a4491583c085 Mon Sep 17 00:00:00 2001 From: Chris Farhood Date: Tue, 5 May 2026 06:50:21 +0000 Subject: [PATCH] fix(e2e): add waitForSidebar helper and networkidle waits for reliability Add waitForSidebar helper function with explicit sidebar visibility wait and networkidle state to ensure page is fully loaded before assertions. This addresses flaky E2E tests where elements were not consistently found due to timing issues during page transitions. --- e2e/kube-vip.spec.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/e2e/kube-vip.spec.ts b/e2e/kube-vip.spec.ts index 9afe4ac..3fcca72 100644 --- a/e2e/kube-vip.spec.ts +++ b/e2e/kube-vip.spec.ts @@ -1,28 +1,35 @@ import { test, expect } from '@playwright/test'; +async function waitForSidebar(page: import('@playwright/test').Page) { + const sidebar = page.getByRole('navigation', { name: 'Navigation' }); + await expect(sidebar).toBeVisible({ timeout: 15_000 }); + await page.waitForLoadState('networkidle'); + return sidebar; +} + test.describe('kube-vip plugin smoke tests', () => { test('sidebar contains kube-vip entry', async ({ page }) => { await page.goto('/'); - const sidebar = page.getByRole('navigation', { name: 'Navigation' }); - await expect(sidebar).toBeVisible({ timeout: 15_000 }); + const sidebar = await waitForSidebar(page); await expect(sidebar.getByRole('button', { name: /kube.vip/i })).toBeVisible(); }); test('kube-vip sidebar entry navigates to kube-vip view', async ({ page }) => { await page.goto('/'); - const sidebar = page.getByRole('navigation', { name: 'Navigation' }); - await expect(sidebar).toBeVisible({ timeout: 15_000 }); + const sidebar = await waitForSidebar(page); const entry = sidebar.getByRole('button', { name: /kube.vip/i }); await expect(entry).toBeVisible(); await entry.click(); + await page.waitForLoadState('networkidle'); await expect(page).toHaveURL(/kube-vip/); await expect(page.getByRole('heading', { name: /kube.vip/i })).toBeVisible(); }); test('kube-vip page renders content', async ({ page }) => { await page.goto('/c/main/kube-vip'); + await waitForSidebar(page); await expect(page.getByRole('heading', { name: /kube.vip/i })).toBeVisible({ timeout: 15_000, @@ -35,6 +42,7 @@ test.describe('kube-vip plugin smoke tests', () => { test('plugin settings page shows kube-vip plugin entry', async ({ page }) => { await page.goto('/settings/plugins'); + await page.waitForLoadState('networkidle'); const pluginEntry = page.locator('text=/kube.vip/i').first(); await expect(pluginEntry).toBeVisible({ timeout: 30_000 }); -- 2.52.0