# 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/component.test.ts >> Component UI Test Suite >> Test Image Registry >> test image registry - Location: tests/ui/component.test.ts:206:5 # Error details ``` TimeoutError: Step timeout of 20000ms exceeded. ``` ``` Error: expect(locator).toBeVisible() failed Locator: getByRole('heading', { name: 'Quay repository: rhtap_qe/e2e-tests-go-cwgywers' }) Expected: visible Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 60000ms - waiting for getByRole('heading', { name: 'Quay repository: rhtap_qe/e2e-tests-go-cwgywers' }) ``` # 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=e116]: - generic [ref=e117]: - paragraph [ref=e118]: component — service - heading "e2e-tests-go-cwgywers Add to favorites" [level=1] [ref=e119]: - generic [ref=e120]: - generic "component:default/e2e-tests-go-cwgywers | service | Secure Supply Chain Example for Go Runtime http based application with advanced continuous integration pipeline covering building, CVE scanning, security scanning, signatures, attestations, SLSA provenance and SBOM along with Gitops-based continuous deployment." [ref=e122]: e2e-tests-go-cwgywers - button "Add to favorites" [ref=e123] [cursor=pointer]: - img [ref=e126] - generic [ref=e128]: - generic [ref=e130]: - paragraph [ref=e131]: Owner - paragraph [ref=e132]: - link "user:guest" [ref=e133] [cursor=pointer]: - /url: /catalog/default/user/guest - generic "user:default/guest" [ref=e134]: - img [ref=e136] - text: user:guest - generic [ref=e139]: - paragraph [ref=e140]: Lifecycle - paragraph [ref=e141]: experimental - button "more" [ref=e142] [cursor=pointer]: - img [ref=e144] - tablist "tabs" [ref=e150]: - tab "Overview" [selected] [ref=e151] [cursor=pointer] - tab "Topology" [ref=e152] [cursor=pointer] - tab "CI" [ref=e153] [cursor=pointer] - tab "CD" [ref=e154] [cursor=pointer] - tab "Kubernetes" [ref=e155] [cursor=pointer] - tab "API" [ref=e156] [cursor=pointer] - tab "Dependencies" [ref=e157] [cursor=pointer] - tab "Docs" [ref=e158] [cursor=pointer] - article [ref=e160]: - generic [ref=e161]: - alert [ref=e163]: - img [ref=e165] - generic [ref=e167]: "This entity has relations to other entities, which can't be found in the catalog. Entities not found are: user:default/guest" - generic [ref=e169]: - generic [ref=e171]: - generic [ref=e174]: Links - separator [ref=e175] - list [ref=e177]: - listitem [ref=e178]: - generic [ref=e180]: - img [ref=e183] - link "Trusted Secure Supply Chain , Opens in a new window" [ref=e186] [cursor=pointer]: - /url: https://www.redhat.com/en/solutions/trusted-software-supply-chain - text: Trusted Secure Supply Chain - generic [ref=e187]: ", Opens in a new window" - generic [ref=e189]: - generic [ref=e190]: - generic [ref=e191]: - generic [ref=e192]: About - navigation [ref=e194]: - link "View Source , Opens in a new window" [ref=e195] [cursor=pointer]: - /url: https://github.com/rhtap-rhdh-qe/e2e-tests-go-cwgywers/tree/main/ - img [ref=e196] - generic [ref=e198]: View Source - generic [ref=e199]: ", Opens in a new window" - link "View TechDocs" [ref=e200] [cursor=pointer]: - /url: /docs/default/Component/e2e-tests-go-cwgywers - img [ref=e201] - generic [ref=e203]: View TechDocs - generic [ref=e204]: - button "Refresh" [ref=e205] [cursor=pointer]: - img [ref=e207] - button "Edit, Opens in a new window" [ref=e209] [cursor=pointer]: - img [ref=e211] - generic [ref=e213]: ", Opens in a new window" - separator [ref=e214] - generic [ref=e216]: - generic [ref=e217]: - heading "Description" [level=2] [ref=e218] - paragraph [ref=e220]: Secure Supply Chain Example for Go Runtime http based application with advanced continuous integration pipeline covering building, CVE scanning, security scanning, signatures, attestations, SLSA provenance and SBOM along with Gitops-based continuous deployment. - generic [ref=e221]: - heading "Owner" [level=2] [ref=e222] - link "user:guest" [ref=e223] [cursor=pointer]: - /url: /catalog/default/user/guest - generic "user:default/guest" [ref=e224]: - img [ref=e226] - text: user:guest - generic [ref=e228]: - heading "System" [level=2] [ref=e229] - paragraph [ref=e230]: No System - generic [ref=e231]: - heading "Type" [level=2] [ref=e232] - paragraph [ref=e233]: service - generic [ref=e234]: - heading "Lifecycle" [level=2] [ref=e235] - paragraph [ref=e236]: experimental - generic [ref=e237]: - heading "Tags" [level=2] [ref=e238] - generic [ref=e240]: go - generic [ref=e242]: sscs - generic [ref=e244]: sbom - generic [ref=e246]: acs - generic [ref=e249]: - heading "Deployment Summary" [level=2] [ref=e252] - table [ref=e257]: - rowgroup [ref=e258]: - row "ArgoCD App Namespace Instance Server Revision Last deployed Sync status Health status" [ref=e259]: - columnheader "ArgoCD App" [ref=e260]: - button "ArgoCD App" [ref=e261] [cursor=pointer]: - text: ArgoCD App - img [ref=e262] - columnheader "Namespace" [ref=e264]: - button "Namespace" [ref=e265] [cursor=pointer]: - text: Namespace - img [ref=e266] - columnheader "Instance" [ref=e268]: - button "Instance" [ref=e269] [cursor=pointer]: - text: Instance - img [ref=e270] - columnheader "Server" [ref=e272]: - button "Server" [ref=e273] [cursor=pointer]: - text: Server - img [ref=e274] - columnheader "Revision" [ref=e276]: - button "Revision" [ref=e277] [cursor=pointer]: - text: Revision - img [ref=e278] - columnheader "Last deployed" [ref=e280]: - button "Last deployed" [ref=e281] [cursor=pointer]: - text: Last deployed - img [ref=e282] - columnheader "Sync status" [ref=e284]: - button "Sync status" [ref=e285] [cursor=pointer]: - text: Sync status - img [ref=e286] - columnheader "Health status" [ref=e288]: - button "Health status" [ref=e289] [cursor=pointer]: - text: Health status - img [ref=e290] - rowgroup [ref=e292]: - row "e2e-tests-go-cwgywers-ci tssc-app-ci default https://kubernetes.default.svc ea650e1 12/05/2026, 0:05:10 Synced Healthy" [ref=e293]: - cell "e2e-tests-go-cwgywers-ci" [ref=e294]: - link "e2e-tests-go-cwgywers-ci" [ref=e295] [cursor=pointer]: - /url: https://tssc-gitops-server-tssc-gitops.apps.rosa.kx-54a972131e.spir.p3.openshiftapps.com/applications/tssc-gitops/e2e-tests-go-cwgywers-ci - text: e2e-tests-go-cwgywers-ci - button [ref=e296]: - img [ref=e298] - cell "tssc-app-ci" [ref=e300] - cell "default" [ref=e301] - cell "https://kubernetes.default.svc" [ref=e302] - cell "ea650e1" [ref=e303]: - link "ea650e1" [ref=e304] [cursor=pointer]: - /url: https://github.com/rhtap-rhdh-qe/e2e-tests-go-cwgywers-gitops/commit/ea650e17524dae10bc68bccdc1b8c8f4ac945c28 - cell "12/05/2026, 0:05:10" [ref=e305] - cell "Synced" [ref=e306]: - img [ref=e307] - text: Synced - cell "Healthy" [ref=e309]: - img [ref=e310] - text: Healthy - row "e2e-tests-go-cwgywers-development tssc-app-development default https://kubernetes.default.svc a96e900 12/05/2026, 0:10:41 Synced Healthy" [ref=e312]: - cell "e2e-tests-go-cwgywers-development" [ref=e313]: - link "e2e-tests-go-cwgywers-development" [ref=e314] [cursor=pointer]: - /url: https://tssc-gitops-server-tssc-gitops.apps.rosa.kx-54a972131e.spir.p3.openshiftapps.com/applications/tssc-gitops/e2e-tests-go-cwgywers-development - text: e2e-tests-go-cwgywers-development - button [ref=e315]: - img [ref=e317] - cell "tssc-app-development" [ref=e319] - cell "default" [ref=e320] - cell "https://kubernetes.default.svc" [ref=e321] - cell "a96e900" [ref=e322]: - link "a96e900" [ref=e323] [cursor=pointer]: - /url: https://github.com/rhtap-rhdh-qe/e2e-tests-go-cwgywers-gitops/commit/a96e900b0ed5691218066efca46780317a3a9c05 - cell "12/05/2026, 0:10:41" [ref=e324] - cell "Synced" [ref=e325]: - img [ref=e326] - text: Synced - cell "Healthy" [ref=e328]: - img [ref=e329] - text: Healthy - row "e2e-tests-go-cwgywers-prod tssc-app-prod default https://kubernetes.default.svc 60fd948 12/05/2026, 0:14:18 Synced Healthy" [ref=e331]: - cell "e2e-tests-go-cwgywers-prod" [ref=e332]: - link "e2e-tests-go-cwgywers-prod" [ref=e333] [cursor=pointer]: - /url: https://tssc-gitops-server-tssc-gitops.apps.rosa.kx-54a972131e.spir.p3.openshiftapps.com/applications/tssc-gitops/e2e-tests-go-cwgywers-prod - text: e2e-tests-go-cwgywers-prod - button [ref=e334]: - img [ref=e336] - cell "tssc-app-prod" [ref=e338] - cell "default" [ref=e339] - cell "https://kubernetes.default.svc" [ref=e340] - cell "60fd948" [ref=e341]: - link "60fd948" [ref=e342] [cursor=pointer]: - /url: https://github.com/rhtap-rhdh-qe/e2e-tests-go-cwgywers-gitops/commit/60fd948ae151ba3cc1f8c04d87fecc16478c11a6 - cell "12/05/2026, 0:14:18" [ref=e343] - cell "Synced" [ref=e344]: - img [ref=e345] - text: Synced - cell "Healthy" [ref=e347]: - img [ref=e348] - text: Healthy - row "e2e-tests-go-cwgywers-stage tssc-app-stage default https://kubernetes.default.svc e7fd445 12/05/2026, 0:12:32 Synced Healthy" [ref=e350]: - cell "e2e-tests-go-cwgywers-stage" [ref=e351]: - link "e2e-tests-go-cwgywers-stage" [ref=e352] [cursor=pointer]: - /url: https://tssc-gitops-server-tssc-gitops.apps.rosa.kx-54a972131e.spir.p3.openshiftapps.com/applications/tssc-gitops/e2e-tests-go-cwgywers-stage - text: e2e-tests-go-cwgywers-stage - button [ref=e353]: - img [ref=e355] - cell "tssc-app-stage" [ref=e357] - cell "default" [ref=e358] - cell "https://kubernetes.default.svc" [ref=e359] - cell "e7fd445" [ref=e360]: - link "e7fd445" [ref=e361] [cursor=pointer]: - /url: https://github.com/rhtap-rhdh-qe/e2e-tests-go-cwgywers-gitops/commit/e7fd4455e42234f887c74f695c32e20031458278 - cell "12/05/2026, 0:12:32" [ref=e362] - cell "Synced" [ref=e363]: - img [ref=e364] - text: Synced - cell "Healthy" [ref=e366]: - img [ref=e367] - text: Healthy - row [ref=e369] - row [ref=e370] - table [ref=e371]: - rowgroup [ref=e372]: - row "5 rows First Page Previous Page 1-4 of 4 Next Page Last Page" [ref=e373]: - cell "5 rows First Page Previous Page 1-4 of 4 Next Page Last Page" [ref=e374]: - generic [ref=e375]: - generic [ref=e376]: - 'button "Rows per page: 5 rows" [ref=e377] [cursor=pointer]': - generic [ref=e378]: 5 rows - textbox: "5" - img - generic [ref=e379]: - generic "First Page" [ref=e380]: - button "First Page" [disabled]: - generic: - img - generic "Previous Page" [ref=e381]: - button "Previous Page" [disabled]: - generic: - img - generic [ref=e382]: 1-4 of 4 - generic "Next Page" [ref=e383]: - button "Next Page" [disabled]: - generic: - img - generic "Last Page" [ref=e384]: - button "Last Page" [disabled]: - generic: - img ``` # Test source ```ts 1 | import { expect, Page } from '@playwright/test'; 2 | import { ImageRegistry } from '../../../rhtap/core/integration/registry/imageRegistry'; 3 | import { BaseRegistryPlugin } from "./baseRegistryPlugin"; 4 | import { RegistryPO } from "../../page-objects/registryPo"; 5 | 6 | export class QuayUiPlugin extends BaseRegistryPlugin { 7 | 8 | constructor(registry: ImageRegistry) { 9 | super(registry); 10 | } 11 | 12 | async checkRepositoryHeading(page: Page): Promise { > 13 | await expect(page.getByRole('heading', { name: `${RegistryPO.quayRepositoryPrefix} ${this.registry.getOrganization()}/${this.registry.getImageName()}` })).toBeVisible(); | ^ Error: expect(locator).toBeVisible() failed 14 | } 15 | 16 | async checkRepositoryLink(page: Page): Promise { 17 | const repositoryLink = `${this.registry.getOrganization()}/${this.registry.getImageName()}`; 18 | 19 | await expect(page.getByRole('link', { name: repositoryLink })).toBeVisible(); 20 | } 21 | 22 | async checkTableColumns(page: Page): Promise { 23 | await this.checkTableColumnHeaders(page, [ 24 | RegistryPO.tagColumnHeader, 25 | RegistryPO.lastModifiedColumnHeader, 26 | RegistryPO.securityScanColumnHeader, 27 | RegistryPO.sizeColumnHeader, 28 | RegistryPO.expiresColumnHeader, 29 | RegistryPO.manifestColumnHeader, 30 | ]); 31 | } 32 | 33 | async checkVulnerabilities(page: Page): Promise { 34 | const searchInput = page.getByRole('textbox', { name: RegistryPO.searchPlaceholder }); 35 | await searchInput.fill('build-container'); 36 | 37 | // Click on the vulnerabilities scan link (any vulnerability counts) 38 | const vulnerabilitiesLink = page.getByRole('link', { name: /(Critical|High|Medium|Low):\s*\d+/ }).first(); 39 | await expect(vulnerabilitiesLink).toBeVisible(); 40 | await vulnerabilitiesLink.click(); 41 | 42 | // Check that the vulnerabilities heading is visible 43 | const vulnerabilitiesHeading = page.getByRole('heading', { name: /Vulnerabilities for .+/ }); 44 | await expect(vulnerabilitiesHeading).toBeVisible(); 45 | 46 | // Check that the vulnerabilities table headers are visible 47 | await expect(page.getByRole('columnheader', { name: RegistryPO.advisoryColumnHeader })).toBeVisible(); 48 | await expect(page.getByRole('columnheader', { name: RegistryPO.severityColumnHeader })).toBeVisible(); 49 | await expect(page.getByRole('columnheader', { name: RegistryPO.packageNameColumnHeader })).toBeVisible(); 50 | await expect(page.getByRole('columnheader', { name: RegistryPO.currentVersionColumnHeader })).toBeVisible(); 51 | await expect(page.getByRole('columnheader', { name: RegistryPO.fixedByColumnHeader })).toBeVisible(); 52 | 53 | // Close the vulnerabilities popup 54 | const goBackButton = page.getByRole('link', { name: RegistryPO.backToRepositoryLinkLabel }); 55 | await expect(goBackButton).toBeVisible(); 56 | await goBackButton.click(); 57 | 58 | // Check that the repository link is visible 59 | const repositoryLink = `${this.registry.getOrganization()}/${this.registry.getImageName()}`; 60 | await expect(page.getByRole('link', { name: repositoryLink })).toBeVisible(); 61 | } 62 | } 63 | ```