From 8cf79939bfb3f0c82d245c03ace8b07237f889ae Mon Sep 17 00:00:00 2001 From: Dhruv Parmar <83108871+dhruvjsx@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:12:08 +0530 Subject: [PATCH 1/3] removed flakyness from dataassetrulesdisabled --- .../Features/DataAssetRulesDisabled.spec.ts | 19 ++++++++++++++++--- .../Features/DataAssetRulesEnabled.spec.ts | 14 ++++++++++++-- .../e2e/Pages/DataContracts.spec.ts | 18 ++++++++++++++---- .../ui/playwright/e2e/Pages/Domains.spec.ts | 15 ++++++++++----- .../ui/playwright/e2e/Pages/Glossary.spec.ts | 7 ++++++- .../playwright/support/entity/EntityClass.ts | 4 ++-- .../ui/playwright/support/user/UserClass.ts | 5 ++++- .../resources/ui/playwright/utils/entity.ts | 15 +++++++++++++-- .../ui/playwright/utils/importUtils.ts | 14 ++++++-------- 9 files changed, 83 insertions(+), 28 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesDisabled.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesDisabled.spec.ts index 60a0a7a305ea..56aae43746e5 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesDisabled.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesDisabled.spec.ts @@ -210,10 +210,13 @@ test.describe( { state: 'detached' } ); + const teamsSearchBar = page.getByTestId('owner-select-teams-search-bar'); + await teamsSearchBar.waitFor({ state: 'visible' }); + const searchUser = page.waitForResponse( `/api/v1/search/query?q=*${encodeURIComponent(teamName)}*` ); - await page.getByTestId(`owner-select-teams-search-bar`).fill(teamName); + await teamsSearchBar.fill(teamName); await searchUser; const ownerItem = page.getByRole('listitem', { @@ -266,8 +269,18 @@ test.describe( } // Add Multiple GlossaryTerm to Table - await assignGlossaryTerm(page, glossaryTerm.responseData); - await assignGlossaryTerm(page, glossaryTerm2.responseData, 'Edit'); + await assignGlossaryTerm( + page, + glossaryTerm.responseData, + 'Add', + entity.endpoint + ); + await assignGlossaryTerm( + page, + glossaryTerm2.responseData, + 'Edit', + entity.endpoint + ); }); } } diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesEnabled.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesEnabled.spec.ts index 80807462d343..d396bae6034e 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesEnabled.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataAssetRulesEnabled.spec.ts @@ -201,8 +201,18 @@ test.describe( if (entityName === 'Table') { // Only glossaryTerm2.responseData data will be available due to single select type is enabled - await assignGlossaryTerm(page, glossaryTerm.responseData); - await assignGlossaryTerm(page, glossaryTerm2.responseData, 'Edit'); + await assignGlossaryTerm( + page, + glossaryTerm.responseData, + 'Add', + entity.endpoint + ); + await assignGlossaryTerm( + page, + glossaryTerm2.responseData, + 'Edit', + entity.endpoint + ); await expect( page diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts index 14599ef1641d..4be0d7b82761 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts @@ -1093,7 +1093,12 @@ test.describe('Data Contracts', () => { 'KnowledgePanel.Tags', testTag.responseData.fullyQualifiedName ); - await assignGlossaryTerm(page, testGlossaryTerm.responseData); + await assignGlossaryTerm( + page, + testGlossaryTerm.responseData, + 'Add', + EntityTypeEndpoint.Table + ); await navigateToContractTab(page); @@ -1103,7 +1108,7 @@ test.describe('Data Contracts', () => { await page.reload(); - + await page.waitForSelector('[data-testid="loader"]', { state: 'detached', }); @@ -1266,7 +1271,12 @@ test.describe('Data Contracts', () => { 'KnowledgePanel.Tags', testTag.responseData.fullyQualifiedName ); - await assignGlossaryTerm(page, testGlossaryTerm.responseData); + await assignGlossaryTerm( + page, + testGlossaryTerm.responseData, + 'Add', + EntityTypeEndpoint.Table + ); await navigateToContractTab(page); @@ -1276,7 +1286,7 @@ test.describe('Data Contracts', () => { await page.reload(); - + await page.waitForSelector('[data-testid="loader"]', { state: 'detached', }); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts index 8dcf080ba5fc..7ba3b691763a 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts @@ -3224,11 +3224,16 @@ test.describe('Domain Tree View Functionality', () => { }); // Add only glossary term to domain (no tags) - await assignGlossaryTerm(page, { - displayName: testGlossaryTerm.data.displayName, - name: testGlossaryTerm.data.name, - fullyQualifiedName: testGlossaryTerm.responseData.fullyQualifiedName, - }); + await assignGlossaryTerm( + page, + { + displayName: testGlossaryTerm.data.displayName, + name: testGlossaryTerm.data.name, + fullyQualifiedName: testGlossaryTerm.responseData.fullyQualifiedName, + }, + 'Add', + EntityTypeEndpoint.Domain + ); await visitGlossaryPage(page, testGlossary.data.displayName); await selectActiveGlossaryTerm(page, testGlossaryTerm.data.displayName); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts index 967e69db917a..7bcbc74f1e6f 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts @@ -1185,7 +1185,12 @@ test.describe('Glossary tests', () => { await glossary1.create(apiContext); await glossaryTerm1.create(apiContext); await table.visitEntityPage(page); - await assignGlossaryTerm(page, glossaryTerm1.responseData); + await assignGlossaryTerm( + page, + glossaryTerm1.responseData, + 'Add', + EntityTypeEndpoint.Table + ); await sidebarClick(page, SidebarItem.GLOSSARY); await selectActiveGlossary(page, glossary1.data.displayName); await goToAssetsTab(page, glossaryTerm1.data.displayName, 1); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/support/entity/EntityClass.ts b/openmetadata-ui/src/main/resources/ui/playwright/support/entity/EntityClass.ts index 3d767c8de51a..17e3717ce63d 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/support/entity/EntityClass.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/support/entity/EntityClass.ts @@ -416,7 +416,7 @@ export class EntityClass { glossaryTerm2: GlossaryTerm['responseData'], entity?: EntityClass ) { - await assignGlossaryTerm(page, glossaryTerm1); + await assignGlossaryTerm(page, glossaryTerm1, 'Add', this.endpoint); if (entity) { await checkExploreSearchFilter( page, @@ -426,7 +426,7 @@ export class EntityClass { entity ); } - await assignGlossaryTerm(page, glossaryTerm2, 'Edit'); + await assignGlossaryTerm(page, glossaryTerm2, 'Edit', this.endpoint); await removeGlossaryTerm(page, [glossaryTerm1, glossaryTerm2]); await page diff --git a/openmetadata-ui/src/main/resources/ui/playwright/support/user/UserClass.ts b/openmetadata-ui/src/main/resources/ui/playwright/support/user/UserClass.ts index 5f4451428ced..49263b1a90e2 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/support/user/UserClass.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/support/user/UserClass.ts @@ -198,7 +198,10 @@ export class UserClass { } getUserDisplayName() { - return this.responseData.displayName; + return ( + this.responseData.displayName ?? + this.responseData.name + ); } async login( diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts index b4a0e3cc7e7f..47075c826634 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts @@ -352,7 +352,9 @@ export const addMultiOwner = async (data: { clearAll = true, } = data; const isMultipleOwners = Array.isArray(ownerNames); - const owners = isMultipleOwners ? ownerNames : [ownerNames]; + const owners = (isMultipleOwners ? ownerNames : [ownerNames]).filter( + (name): name is string => Boolean(name) + ); await page.click(`[data-testid="${activatorBtnDataTestId}"]`); @@ -950,7 +952,8 @@ type GlossaryTermOption = { export const assignGlossaryTerm = async ( page: Page, glossaryTerm: GlossaryTermOption, - action: 'Add' | 'Edit' = 'Add' + action: 'Add' | 'Edit' = 'Add', + entityEndpoint?: string ) => { await page .getByTestId('KnowledgePanel.GlossaryTerms') @@ -978,11 +981,19 @@ export const assignGlossaryTerm = async ( page.getByTestId('custom-drop-down-menu').getByTestId('saveAssociatedTag') ).toBeEnabled(); + const patchRequest = entityEndpoint + ? page.waitForResponse(`/api/v1/${entityEndpoint}/*`) + : undefined; + await page .getByTestId('custom-drop-down-menu') .getByTestId('saveAssociatedTag') .click(); + if (patchRequest) { + await patchRequest; + } + await expect( page.getByTestId('custom-drop-down-menu').getByTestId('saveAssociatedTag') ).not.toBeVisible(); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts index a74dae16ead0..dd7d6e280818 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts @@ -52,19 +52,17 @@ export const createGlossaryTermRowDetails = () => { export const fillTextInputDetails = async (page: Page, text: string) => { await page.keyboard.press('Enter', { delay: 100 }); - const isVisible = await page + const textboxLocator = page .locator('.ant-layout-content') - .getByRole('textbox') - .isVisible(); + .getByRole('textbox'); - if (!isVisible) { + try { + await expect(textboxLocator).toBeVisible(); + } catch { await page.keyboard.press('Enter', { delay: 100 }); + await expect(textboxLocator).toBeVisible(); } - const textboxLocator = page - .locator('.ant-layout-content') - .getByRole('textbox'); - await textboxLocator.fill(text); await textboxLocator.press('Enter', { delay: 100 }); }; From 91e55358249b12ab3ff200adfd8dfddcc05159ef Mon Sep 17 00:00:00 2001 From: Dhruv Parmar <83108871+dhruvjsx@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:30:43 +0530 Subject: [PATCH 2/3] removed unwanted filters --- .../src/main/resources/ui/playwright/utils/entity.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts index 47075c826634..dc5ffd00a622 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts @@ -352,9 +352,7 @@ export const addMultiOwner = async (data: { clearAll = true, } = data; const isMultipleOwners = Array.isArray(ownerNames); - const owners = (isMultipleOwners ? ownerNames : [ownerNames]).filter( - (name): name is string => Boolean(name) - ); + const owners = (isMultipleOwners ? ownerNames : [ownerNames]) await page.click(`[data-testid="${activatorBtnDataTestId}"]`); From 6c414f77a8467dea80efe9e40a8bc0fff48a14eb Mon Sep 17 00:00:00 2001 From: Dhruv Parmar <83108871+dhruvjsx@users.noreply.github.com> Date: Wed, 28 Jan 2026 19:26:40 +0530 Subject: [PATCH 3/3] fixed flaky activecell --- .../main/resources/ui/playwright/utils/importUtils.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts index dd7d6e280818..007cd1189677 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/importUtils.ts @@ -50,18 +50,15 @@ export const createGlossaryTermRowDetails = () => { }; export const fillTextInputDetails = async (page: Page, text: string) => { - await page.keyboard.press('Enter', { delay: 100 }); + const activeCell = page.locator(RDG_ACTIVE_CELL_SELECTOR); + await activeCell.click(); + await activeCell.press('Enter', { delay: 100 }); const textboxLocator = page .locator('.ant-layout-content') .getByRole('textbox'); - try { - await expect(textboxLocator).toBeVisible(); - } catch { - await page.keyboard.press('Enter', { delay: 100 }); - await expect(textboxLocator).toBeVisible(); - } + await expect(textboxLocator).toBeVisible(); await textboxLocator.fill(text); await textboxLocator.press('Enter', { delay: 100 });