diff --git a/packages/html-reporter/src/types.d.ts b/packages/html-reporter/src/types.d.ts
index 17c5a3b3730a4..51ae99704d2d1 100644
--- a/packages/html-reporter/src/types.d.ts
+++ b/packages/html-reporter/src/types.d.ts
@@ -113,3 +113,12 @@ export type TestStep = {
count: number;
skipped?: boolean;
};
+
+export type AsyncResult = {
+ type: 'loading'
+} | {
+ type: 'data',
+ data: T,
+} | {
+ type: 'error',
+};
diff --git a/tests/playwright-test/reporter-html.spec.ts b/tests/playwright-test/reporter-html.spec.ts
index aa827cda08d0e..3a7bd47028fa6 100644
--- a/tests/playwright-test/reporter-html.spec.ts
+++ b/tests/playwright-test/reporter-html.spec.ts
@@ -2933,6 +2933,25 @@ for (const useIntermediateMergeReport of [true, false] as const) {
const prompt = await page.evaluate(() => navigator.clipboard.readText());
expect(prompt, 'contains snapshot').toContain('- button "Click me"');
});
+
+ test('should show error if test ID not found', async ({ runInlineTest, showReport, page }) => {
+ const result = await runInlineTest({
+ 'example.spec.ts': `
+ import { test, expect } from '@playwright/test';
+ test('sample', async ({ browser }) => {
+ const page = await browser.newPage();
+ await page.setContent('');
+ expect(2).toBe(2);
+ });
+ `,
+ }, { reporter: 'html' }, { PLAYWRIGHT_HTML_OPEN: 'never' });
+ expect(result.exitCode).toBe(0);
+ await showReport();
+
+ await page.goto(`${page.url()}#?testId=non-existing-test-id`);
+
+ await expect(page.getByText('Test not found')).toBeVisible();
+ });
});
}