# Instructions - Following Playwright test failed. - Explain why, be concise, respect Playwright best practices. - Provide a snippet of code with the fix, if possible. # Test info - Name: ui/gitopsResource.test.ts >> Gitops Resource UI Test Suite >> Test Gitops Docs - Location: tests/ui/gitopsResource.test.ts:48:3 # Error details ``` Test timeout of 2100000ms exceeded. ``` ``` Error: locator.click: Test timeout of 2100000ms exceeded. Call log: - waiting for getByRole('tablist').getByText('Docs') ``` # Page snapshot ```yaml - generic [ref=e3]: - navigation [ref=e5]: - generic [ref=e6]: - link "Home" [ref=e8] [cursor=pointer]: - /url: / - img [ref=e9] - generic [ref=e18]: - img [ref=e20] - combobox "Search..." [ref=e22] - generic "Self-service" [ref=e25]: - link "Self-service" [ref=e26] [cursor=pointer]: - /url: /create - img [ref=e28] - button "Your starred items" [ref=e31] [cursor=pointer]: - img [ref=e32] - button "Application launcher" [ref=e35] [cursor=pointer]: - img [ref=e36] - button "Help" [ref=e39] [cursor=pointer]: - img [ref=e40] - separator [ref=e42] - button "Admin" [ref=e44] [cursor=pointer]: - generic [ref=e45]: - img [ref=e46] - paragraph [ref=e49]: Admin - img [ref=e50] - generic [ref=e53]: - navigation "sidebar nav": - generic [ref=e55]: - generic [ref=e58]: - link "Home" [ref=e60] [cursor=pointer]: - /url: / - img [ref=e64] - generic [ref=e66]: Home - link "Catalog" [ref=e68] [cursor=pointer]: - /url: /catalog - img [ref=e72] - generic [ref=e74]: Catalog - link "APIs" [ref=e76] [cursor=pointer]: - /url: /api-docs - img [ref=e80] - generic [ref=e82]: APIs - link "Learning Paths" [ref=e84] [cursor=pointer]: - /url: /learning-paths - img [ref=e88] - generic [ref=e90]: Learning Paths - separator [ref=e91] - link "Docs" [ref=e94] [cursor=pointer]: - /url: /docs - img [ref=e98] - generic [ref=e100]: Docs - generic [ref=e101]: - separator [ref=e102] - button "Administration" [ref=e103] [cursor=pointer]: - generic [ref=e104]: - img [ref=e108] - generic [ref=e111]: Administration - img [ref=e113] - main [ref=e115]: - generic [ref=e117]: - paragraph [ref=e118]: resource - heading "backend-tests-go-wijgfgsg-gitops" [level=1] [ref=e119]: - generic [ref=e121]: backend-tests-go-wijgfgsg-gitops - article [ref=e122]: - alert [ref=e123]: - 'button "Warning: Entity not found" [ref=e124] [cursor=pointer]': - generic [ref=e125]: - img [ref=e126] - 'heading "Warning: Entity not found" [level=6] [ref=e128]' - img [ref=e131] ``` # Test source ```ts 1 | import { expect, Page, Locator } from '@playwright/test'; 2 | import { LoggerFactory } from '../logger/logger'; 3 | import type { Logger } from '../logger/logger'; 4 | 5 | const logger: Logger = LoggerFactory.getLogger('ui.common'); 6 | 7 | /** 8 | * Checks if a website URL returns an expected status code 9 | * @param page - The Playwright page object 10 | * @param href - The URL to check 11 | * @param expectedStatus - The expected HTTP status code (defaults to 200) 12 | */ 13 | export async function checkWebsiteStatus( 14 | page: Page, 15 | href: string, 16 | okStatuses: number[] = [200, 204, 301, 302, 307, 308] 17 | ): Promise { 18 | const response = await page.request.head(href); 19 | expect(okStatuses).toContain(response.status()); 20 | } 21 | 22 | /** 23 | * Hides the Quick start side panel if it is visible 24 | * @param page - The Playwright page object 25 | */ 26 | export async function hideQuickStartIfVisible(page: Page): Promise { 27 | // Wait for the page to be loaded by checking the self service icon 28 | const selfServiceIcon = page.getByTestId('AddCircleOutlineIcon'); 29 | await selfServiceIcon.waitFor({ state: 'visible', timeout: 20000 }); 30 | 31 | // Wait for welcome paragraph to be visible 32 | const welcomeParagraph = page.getByText("Let's get you started with Developer Hub", { exact: true }); 33 | const hideButton = page.getByRole('button', { name: 'Hide' }); 34 | try { 35 | await welcomeParagraph.waitFor({ state: 'visible', timeout: 2000 }); 36 | await hideButton.click({ timeout: 2000 }); 37 | logger.debug('Paragraph visible; hiding Quick start side panel'); 38 | } catch { 39 | logger.debug('Paragraph not visible; skipping hide'); 40 | } 41 | 42 | await expect(welcomeParagraph).toBeHidden({ timeout: 10000 }); 43 | } 44 | 45 | export async function waitForPageLoad(page: Page, name: string) { 46 | const progressBars = page.getByRole('main').getByRole('progressbar'); 47 | // Get all progressbar elements and wait until all are hidden 48 | const bars = await progressBars.all(); 49 | await Promise.all( 50 | bars.map(bar => expect(bar).toBeHidden({ timeout: 90000 })) 51 | ); 52 | 53 | await expect(page.getByTestId('sidebar-root')).toBeAttached({ timeout: 30000 }); 54 | 55 | await expect(page.getByRole('heading', { name: name }).first()).toBeVisible({ timeout: 20000 }); 56 | await page.waitForLoadState(); 57 | } 58 | 59 | export async function openTab(page: Page, tabName: string) { 60 | const tab = page.getByRole('tablist').getByText(tabName); > 61 | await tab.click(); | ^ Error: locator.click: Test timeout of 2100000ms exceeded. 62 | } 63 | 64 | /** 65 | * Applies a blur filter to the locator element 66 | * @param locator - Locator to blur 67 | */ 68 | export async function blurLocator(locator: Locator): Promise { 69 | await locator.evaluate(el => { (el as HTMLElement).style.filter = 'blur(5px)'; }); 70 | } 71 | ```