diff --git a/packages/html-reporter/src/filter.ts b/packages/html-reporter/src/filter.ts
index 099b57ab72..43abf1bae7 100644
--- a/packages/html-reporter/src/filter.ts
+++ b/packages/html-reporter/src/filter.ts
@@ -113,6 +113,7 @@ export class Filter {
status: status as any,
file: test.location.file,
line: String(test.location.line),
+ column: String(test.location.column),
};
(test as any).searchValues = searchValues;
}
@@ -132,8 +133,8 @@ export class Filter {
for (const text of this.text) {
if (searchValues.text.includes(text))
continue;
- const location = text.split(':');
- if (location.length === 2 && searchValues.file.includes(location[0]) && searchValues.line.includes(location[1]))
+ const [fileName, line, column] = text.split(':');
+ if (searchValues.file.includes(fileName) && searchValues.line === line && (column === undefined || searchValues.column === column))
continue;
return false;
}
@@ -154,5 +155,6 @@ type SearchValues = {
status: 'passed' | 'failed' | 'flaky' | 'skipped';
file: string;
line: string;
+ column: string;
};
diff --git a/tests/playwright-test/reporter-html.spec.ts b/tests/playwright-test/reporter-html.spec.ts
index e40f398c90..e1391e0327 100644
--- a/tests/playwright-test/reporter-html.spec.ts
+++ b/tests/playwright-test/reporter-html.spec.ts
@@ -2064,6 +2064,36 @@ for (const useIntermediateMergeReport of [false, true] as const) {
await expect(page.getByText('passes title')).toBeVisible();
});
+ test('tests should filter by fileName:line/column', async ({ runInlineTest, showReport, page }) => {
+ const result = await runInlineTest({
+ 'a.test.js': `
+ const { test, expect } = require('@playwright/test');
+ test('test1', async ({}) => { expect(1).toBe(1); });
+ test('test2', async ({}) => { expect(1).toBe(2); });
+ `,
+ }, { reporter: 'dot,html' }, { PW_TEST_HTML_REPORT_OPEN: 'never' });
+
+ expect(result.exitCode).toBe(1);
+ expect(result.passed).toBe(1);
+ expect(result.failed).toBe(1);
+
+ await showReport();
+
+ const searchInput = page.locator('.subnav-search-input');
+
+ await searchInput.fill('a.test.js:3:11');
+ await expect(page.getByText('a.test.js:3', { exact: true })).toBeVisible();
+ await expect(page.getByText('a.test.js:4', { exact: true })).toBeHidden();
+
+ await searchInput.fill('a.test.js:3');
+ await expect(page.getByText('a.test.js:3', { exact: true })).toBeVisible();
+ await expect(page.getByText('a.test.js:4', { exact: true })).toBeHidden();
+
+ await searchInput.fill('a.test.js:4:15');
+ await expect(page.getByText('a.test.js:3', { exact: true })).toBeHidden();
+ await expect(page.getByText('a.test.js:4', { exact: true })).toBeVisible();
+ });
+
test('should properly display beforeEach with and without title', async ({ runInlineTest, showReport, page }) => {
const result = await runInlineTest({
'a.test.js': `