From a4c7b6e5439d7d036eca829a9e367f1e8b2bb7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Kociubi=C5=84ski?= Date: Mon, 8 Dec 2025 09:27:49 +0100 Subject: [PATCH 1/4] change expect to expect poll asertions for color checking --- .../playwright/tests/e2e/mainTimeline.spec.ts | 15 ++++++++++++--- .../blog/playwright/tests/e2e/profilePage.spec.ts | 14 +++++++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts b/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts index 6f1e67680..c64cfa9b8 100644 --- a/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts +++ b/apps/blog/playwright/tests/e2e/mainTimeline.spec.ts @@ -668,16 +668,25 @@ test.describe('Home page tests', () => { await homePage.changeThemeMode('Dark'); await homePage.validateThemeModeIsDark(); await expect(homePage.loginBtn).toBeVisible(); - await expect(await homePage.getElementCssPropertyValue(await homePage.loginBtn, 'color')).toBe( + + await expect.poll(async () => { + return await homePage.getElementCssPropertyValue(await homePage.loginBtn, 'color'); + }).toBe( 'rgb(255, 255, 255)' ); - await expect(await homePage.getElementCssPropertyValue(await homePage.loginBtn, 'background-color')).toBe( + + await expect.poll(async () => { + return await homePage.getElementCssPropertyValue(await homePage.loginBtn, 'background-color'); + }).toBe( 'rgba(0, 0, 0, 0)' ); + await homePage.loginBtn.hover(); // Use toHaveCSS with auto-retry instead of fixed timeout await expect(homePage.loginBtn).toHaveCSS('color', 'rgb(226, 18, 53)'); - await expect(await homePage.getElementCssPropertyValue(await homePage.loginBtn, 'background-color')).toBe( + await expect.poll( async () => { + return await homePage.getElementCssPropertyValue(await homePage.loginBtn, 'background-color'); + }).toBe( 'rgb(29, 40, 58)' ); }); diff --git a/apps/blog/playwright/tests/e2e/profilePage.spec.ts b/apps/blog/playwright/tests/e2e/profilePage.spec.ts index 582803917..632bc3c8f 100644 --- a/apps/blog/playwright/tests/e2e/profilePage.spec.ts +++ b/apps/blog/playwright/tests/e2e/profilePage.spec.ts @@ -286,10 +286,14 @@ test.describe('Profile page of @gtg', () => { await homePage.changeThemeMode('Dark'); await homePage.validateThemeModeIsDark(); - expect(await profilePage.getElementCssPropertyValue(profilePage.followButton, 'color')).toBe( + expect.poll(async () => { + await profilePage.getElementCssPropertyValue(profilePage.followButton, 'color'); + }).toBe( 'rgb(2, 2, 5)' ); - expect(await profilePage.getElementCssPropertyValue(profilePage.followButton, 'background-color')).toBe( + expect.poll(async () => { + await profilePage.getElementCssPropertyValue(profilePage.followButton, 'background-color'); + }).toBe( 'rgb(248, 250, 252)' ); @@ -298,9 +302,9 @@ test.describe('Profile page of @gtg', () => { await expect.poll(async () => { return await profilePage.getElementCssPropertyValue(profilePage.followButton, 'color'); }).toBe('rgb(226, 18, 53)'); - expect( - await profilePage.getElementCssPropertyValue(await profilePage.followButton, 'background-color') - ).toBe('rgb(248, 250, 252)'); + expect.poll(async () => { + await profilePage.getElementCssPropertyValue(await profilePage.followButton, 'background-color'); + }).toBe('rgb(248, 250, 252)'); }); test("User Banner Row - Description",async ({page}) =>{ -- GitLab From 1f0517cfb6ab6408647325981c7952376a6cd912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Kociubi=C5=84ski?= Date: Mon, 8 Dec 2025 11:25:07 +0100 Subject: [PATCH 2/4] move locator to the class of pom of the proposals page --- .../playwright/tests/e2e/proposals.spec.ts | 18 +++++++++--------- .../tests/support/pages/proposalsPage.ts | 5 ++++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/wallet/playwright/tests/e2e/proposals.spec.ts b/apps/wallet/playwright/tests/e2e/proposals.spec.ts index 3a459217f..74d6da904 100644 --- a/apps/wallet/playwright/tests/e2e/proposals.spec.ts +++ b/apps/wallet/playwright/tests/e2e/proposals.spec.ts @@ -57,7 +57,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterStatusConntent.getByText('All').click(); await expect(proposalsPage.proposalsFilterStatus.locator('span')).toHaveText('All'); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); const amountProposalsItemUI = (await proposalsPage.proposalListItem.all()).length; @@ -89,7 +89,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterStatusConntent.getByText(/^Active$/).click(); await expect(proposalsPage.proposalsFilterStatus.locator('span')).toHaveText(/^Active$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await expect(proposalsPage.proposalStatusBadge.first()).toHaveText('started'); await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); @@ -123,7 +123,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.page.waitForSelector(proposalsPage.proposalsFilterStatus.getByText(/^Inactive$/)['_selector']); await expect(proposalsPage.proposalsFilterStatus.locator('span')).toHaveText(/^Inactive$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); await expect(proposalsPage.proposalStatusBadge.first()).toHaveText('not started'); @@ -156,7 +156,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterStatusConntent.getByText(/^Expired$/).click(); await expect(proposalsPage.proposalsFilterStatus.locator('span')).toHaveText(/^Expired$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await expect(proposalsPage.proposalStatusBadge.first()).toHaveText('finished'); await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); @@ -189,7 +189,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterStatusConntent.getByText(/^Votable$/).click(); await expect(proposalsPage.proposalsFilterStatus.locator('span')).toHaveText(/^Votable$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); const amountProposalsItemUI = (await proposalsPage.proposalListItem.all()).length; @@ -265,7 +265,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterOrderByConntent.getByText(/^Creator$/).click(); await expect(proposalsPage.proposalsFilterOrderBy.locator('span')).toHaveText(/^Creator$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); const amountProposalsItemUI = (await proposalsPage.proposalListItem.all()).length; @@ -303,7 +303,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterOrderByConntent.getByText(/^Start Date$/).click(); await expect(proposalsPage.proposalsFilterOrderBy.locator('span')).toHaveText(/^Start Date$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); const amountProposalsItemUI = (await proposalsPage.proposalListItem.all()).length; @@ -341,7 +341,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterOrderByConntent.getByText(/^End Date$/).click(); await expect(proposalsPage.proposalsFilterOrderBy.locator('span')).toHaveText(/^End Date$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); const amountProposalsItemUI = (await proposalsPage.proposalListItem.all()).length; @@ -379,7 +379,7 @@ test.describe('Proposals page tests', () => { await proposalsPage.proposalsFilterOrderByConntent.getByText(/^Total Votes$/).click(); await expect(proposalsPage.proposalsFilterOrderBy.locator('span')).toHaveText(/^Total Votes$/); // Wait for proposals to load after filter change - await proposalsPage.proposalListItem.first().or(proposalsPage.page.locator('text="Sorry, I can\'t show you any proposals right now."')).waitFor({ state: 'visible' }); + await proposalsPage.proposalListItem.first().or(proposalsPage.proposalMessageCannotShowYouAnyProposals).waitFor({ state: 'visible' }); if (await proposalsPage.proposalStatusBadge.first().isVisible()) { await proposalsPage.page.waitForSelector(proposalsPage.proposalListItem['_selector']); const amountProposalsItemUI = (await proposalsPage.proposalListItem.all()).length; diff --git a/apps/wallet/playwright/tests/support/pages/proposalsPage.ts b/apps/wallet/playwright/tests/support/pages/proposalsPage.ts index 3747e9b39..165e5843d 100644 --- a/apps/wallet/playwright/tests/support/pages/proposalsPage.ts +++ b/apps/wallet/playwright/tests/support/pages/proposalsPage.ts @@ -27,6 +27,7 @@ export class ProposalsPage { readonly proposalVoterLinkInDialogList: Locator; readonly voterValuesDialog: Locator; readonly cannotShowYouAnyProposals: Locator; + readonly proposalMessageCannotShowYouAnyProposals: Locator; constructor(page: Page) { this.page = page; @@ -65,6 +66,8 @@ export class ProposalsPage { this.proposalVoterLinkInDialogList = page.locator('[data-testid="proposal-voter-link-dialog"]'); this.voterValuesDialog = page.locator('[data-testid="voter-values-dialog"]'); this.cannotShowYouAnyProposals = page.locator('data-testid="cannot-show-you-any-proposals"'); + + this.proposalMessageCannotShowYouAnyProposals = page.locator('text="Sorry, I can\'t show you any proposals right now."') } async goToProposalsPage() { @@ -75,7 +78,7 @@ export class ProposalsPage { // Wait for proposals to load - either proposal items appear or "no proposals" message await Promise.race([ this.proposalListItem.first().waitFor({ state: 'visible', timeout: 10000 }), - this.page.locator('text="Sorry, I can\'t show you any proposals right now."').waitFor({ state: 'visible', timeout: 10000 }) + this.proposalMessageCannotShowYouAnyProposals.waitFor({ state: 'visible', timeout: 10000 }) ]).catch(() => { // If neither appears within timeout, continue anyway (data may still be loading) }); -- GitLab From 866422cf13ea864e719c5f4d8a44d6fe22e54864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Kociubi=C5=84ski?= Date: Tue, 16 Dec 2025 10:23:48 +0100 Subject: [PATCH 3/4] improve test validating votes of the comment card --- apps/blog/playwright/tests/e2e/profileRepliesPage.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/blog/playwright/tests/e2e/profileRepliesPage.spec.ts b/apps/blog/playwright/tests/e2e/profileRepliesPage.spec.ts index 474556575..5c14daa27 100644 --- a/apps/blog/playwright/tests/e2e/profileRepliesPage.spec.ts +++ b/apps/blog/playwright/tests/e2e/profileRepliesPage.spec.ts @@ -335,7 +335,7 @@ test.describe('Replies Tab in Profile page of @gtg', () => { await expect(firstCommentCardVote).toBeVisible(); await firstCommentCardVote.hover(); await profilePage.page.waitForTimeout(1000); - await expect(await profilePage.postVotesTooltip.nth(0)).toContainText('votesvotes'); + await expect(await profilePage.postVotesTooltip.nth(0)).toContainText(/\d+\s*votes\s*\d+\s*votes/); } else if (Number(firstCommentCardVoteText) == 1) { // equal 1 vote await expect(firstCommentCardVote).toBeVisible(); -- GitLab From e1982bef1ab6bd80fb15cdeeabf90b08267c2f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Kociubi=C5=84ski?= Date: Tue, 16 Dec 2025 11:27:07 +0100 Subject: [PATCH 4/4] improve comment tests with reveale comment --- apps/blog/playwright/tests/e2e/comments.spec.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/blog/playwright/tests/e2e/comments.spec.ts b/apps/blog/playwright/tests/e2e/comments.spec.ts index 97a9506e9..4d9a2181f 100644 --- a/apps/blog/playwright/tests/e2e/comments.spec.ts +++ b/apps/blog/playwright/tests/e2e/comments.spec.ts @@ -20,7 +20,10 @@ test.describe('Comments of post', () => { }) => { await homePage.goto(); await homePage.moveToTheFirstPostWithCommentsNumberMoreThanZero(); + await postPage.commentCardsHeaders.first().scrollIntoViewIfNeeded(); await expect(postPage.commentCardsHeaders.first()).toBeVisible(); + if (await postPage.commentCardsDescriptions.first().isHidden()) + await postPage.commentCardsHeaders.first().click(); await expect(postPage.commentCardsDescriptions.first()).toBeVisible(); await expect(postPage.commentCardsFooters.first()).toBeVisible(); }); @@ -28,6 +31,9 @@ test.describe('Comments of post', () => { test('Validate a hovered comment changes backgroundcolor style', async ({ page }) => { await homePage.goto(); await homePage.moveToTheFirstPostWithCommentsNumberMoreThanZero(); + await postPage.commentCardsHeaders.first().scrollIntoViewIfNeeded(); + if (await postPage.commentCardsDescriptions.first().isHidden()) + await postPage.commentCardsHeaders.first().click(); // Before hover expect( await postPage.getElementCssPropertyValue( @@ -56,7 +62,9 @@ test.describe('Comments of post', () => { await homePage.changeThemeMode('Dark'); await homePage.validateThemeModeIsDark(); await homePage.moveToTheFirstPostWithCommentsNumberMoreThanZero(); - + await postPage.commentCardsHeaders.first().scrollIntoViewIfNeeded(); + if (await postPage.commentCardsDescriptions.first().isHidden()) + await postPage.commentCardsHeaders.first().click(); // Before hover expect( await postPage.getElementCssPropertyValue( @@ -81,7 +89,10 @@ test.describe('Comments of post', () => { await homePage.goto(); await homePage.moveToTheFirstPostWithCommentsNumberMoreThanZero(); + await postPage.commentCardsHeaders.first().scrollIntoViewIfNeeded(); await expect(postPage.commentCardsHeaders.first()).toBeVisible(); + if (await postPage.commentCardsDescriptions.first().isHidden()) + await postPage.commentCardsHeaders.first().click(); await expect(postPage.commentCardsDescriptions.first()).toBeVisible(); await expect(postPage.commentCardsFooters.first()).toBeVisible(); -- GitLab