diff --git a/packages/playwright-core/src/tools/backend/context.ts b/packages/playwright-core/src/tools/backend/context.ts index 8d0c7399dcc9b..c8f96c13a731e 100644 --- a/packages/playwright-core/src/tools/backend/context.ts +++ b/packages/playwright-core/src/tools/backend/context.ts @@ -190,6 +190,7 @@ export class Context { await this.newTab(); if (crashed) this._currentTab!.logErrorMessage('Page crashed and was reset to about:blank.'); + await this._currentTab!.waitForInitialized(); return this._currentTab!; } diff --git a/packages/playwright-core/src/tools/backend/tab.ts b/packages/playwright-core/src/tools/backend/tab.ts index 676f5da4e9040..441f8a9f75b00 100644 --- a/packages/playwright-core/src/tools/backend/tab.ts +++ b/packages/playwright-core/src/tools/backend/tab.ts @@ -148,6 +148,10 @@ export class Tab extends EventEmitter { this._consoleLog.stop(); } + async waitForInitialized() { + await this._initializedPromise; + } + static forPage(page: playwright.Page): Tab | undefined { // eslint-disable-next-line no-restricted-syntax return (page as any)[tabSymbol]; diff --git a/tests/mcp/init-page.spec.ts b/tests/mcp/init-page.spec.ts index c2ea53aaafc59..6e708116a0f36 100644 --- a/tests/mcp/init-page.spec.ts +++ b/tests/mcp/init-page.spec.ts @@ -94,6 +94,27 @@ test('init-page surfaces load errors instead of silently dropping them', async ( expect(JSON.stringify(response.content)).toContain('boom from initPage'); }); +test('init-page is applied before the first page screenshot', async ({ startClient }) => { + const initPagePath = test.info().outputPath('screenshotInitPage.ts'); + await fs.promises.writeFile(initPagePath, ` + export default async ({ page }) => { + page.screenshot = async () => { + throw new Error('initPage screenshot hook applied'); + }; + }; + `); + + const { client } = await startClient({ + args: [`--init-page=${initPagePath}`], + }); + const response: any = await client.callTool({ + name: 'browser_take_screenshot', + arguments: {}, + }); + expect(response.isError).toBe(true); + expect(JSON.stringify(response.content)).toContain('initPage screenshot hook applied'); +}); + test('--init-page w/ --init-script', async ({ startClient, server }) => { server.setContent('/', `
Hello world