diff --git a/packages/playwright/src/matchers/toEqual.ts b/packages/playwright/src/matchers/toEqual.ts index bb0f4e147e..4296444a7b 100644 --- a/packages/playwright/src/matchers/toEqual.ts +++ b/packages/playwright/src/matchers/toEqual.ts @@ -19,6 +19,7 @@ import { matcherHint } from './matcherHint'; import type { MatcherResult } from './matcherHint'; import type { ExpectMatcherState } from '../../types/test'; import type { Locator } from 'playwright-core'; +import { isRegExp } from 'playwright-core/lib/utils'; // Omit colon and one or more spaces, so can call getLabelPrinter. const EXPECTED_LABEL = 'Expected'; @@ -59,6 +60,21 @@ export async function toEqual( if (pass) { printedExpected = `Expected: not ${this.utils.printExpected(expected)}`; printedReceived = `Received: ${this.utils.printReceived(received)}`; + } else if (Array.isArray(expected) && Array.isArray(received)) { + const normalizedExpected = expected.map((exp, index) => { + const rec = received[index]; + if (isRegExp(exp)) + return exp.test(rec) ? rec : exp; + + return exp; + }); + printedDiff = this.utils.printDiffOrStringify( + normalizedExpected, + received, + EXPECTED_LABEL, + RECEIVED_LABEL, + false, + ); } else { printedDiff = this.utils.printDiffOrStringify( expected, diff --git a/tests/playwright-test/expect.spec.ts b/tests/playwright-test/expect.spec.ts index 08ce16e7ec..c35cdd7c09 100644 --- a/tests/playwright-test/expect.spec.ts +++ b/tests/playwright-test/expect.spec.ts @@ -616,6 +616,33 @@ test('should print pending operations for toHaveText', async ({ runInlineTest }) expect(output).toContain('waiting for locator(\'no-such-thing\')'); }); +test('should only highlight unmatched regex in diff message for toHaveText with array', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.spec.ts': ` + import { test, expect } from '@playwright/test'; + + test('toHaveText with mixed strings and regexes (array)', async ({ page }) => { + await page.setContent(\` + + \`); + + const items = page.locator('li'); + await expect(items).toHaveText(['Coffee', /\\d+/, /Milk/]); + }); + `, + }); + expect(result.exitCode).toBe(1); + const output = result.output; + expect(output).toContain('- /\\d+/,'); + expect(output).toContain('+ "Tea",'); + expect(output).not.toContain('- /Milk/,'); + expect(output).not.toContain('- "Coffee",'); +}); + test('should print expected/received on Ctrl+C', async ({ interactWithTestRunner }) => { test.skip(process.platform === 'win32', 'No sending SIGINT on Windows');