diff --git a/docs/src/api/class-page.md b/docs/src/api/class-page.md index 61f033cb979ca..311736f6399aa 100644 --- a/docs/src/api/class-page.md +++ b/docs/src/api/class-page.md @@ -2722,6 +2722,11 @@ Returns whether the element is [visible](../actionability.md#visible). [`param: - type: <[Keyboard]> +## async method: Page.clearConsoleMessages +* since: v1.59 + +Clears all stored console messages from this page. Subsequent calls to [`method: Page.consoleMessages`] will only return messages logged after the clear. + ## async method: Page.consoleMessages * since: v1.56 - returns: <[Array]<[ConsoleMessage]>> diff --git a/packages/playwright-client/types/types.d.ts b/packages/playwright-client/types/types.d.ts index 842b739220864..39a29ac015edc 100644 --- a/packages/playwright-client/types/types.d.ts +++ b/packages/playwright-client/types/types.d.ts @@ -2256,6 +2256,13 @@ export interface Page { trial?: boolean; }): Promise; + /** + * Clears all stored console messages from this page. Subsequent calls to + * [page.consoleMessages()](https://playwright.dev/docs/api/class-page#page-console-messages) will only return + * messages logged after the clear. + */ + clearConsoleMessages(): Promise; + /** * **NOTE** Use locator-based [locator.click([options])](https://playwright.dev/docs/api/class-locator#locator-click) instead. * Read more about [locators](https://playwright.dev/docs/locators). diff --git a/packages/playwright-core/src/client/page.ts b/packages/playwright-core/src/client/page.ts index 8fe1a33857ee1..9375390fe9fdb 100644 --- a/packages/playwright-core/src/client/page.ts +++ b/packages/playwright-core/src/client/page.ts @@ -655,6 +655,10 @@ export class Page extends ChannelOwner implements api.Page return await this._mainFrame.fill(selector, value, options); } + async clearConsoleMessages(): Promise { + await this._channel.clearConsoleMessages(); + } + async consoleMessages(): Promise { const { messages } = await this._channel.consoleMessages(); return messages.map(message => new ConsoleMessage(this._platform, message, this, null)); diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index 3861d86e577cd..2c12ae6c87a8d 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -1230,6 +1230,8 @@ scheme.PageCloseParams = tObject({ reason: tOptional(tString), }); scheme.PageCloseResult = tOptional(tObject({})); +scheme.PageClearConsoleMessagesParams = tOptional(tObject({})); +scheme.PageClearConsoleMessagesResult = tOptional(tObject({})); scheme.PageConsoleMessagesParams = tOptional(tObject({})); scheme.PageConsoleMessagesResult = tObject({ messages: tArray(tObject({ diff --git a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts index e4319894001a0..18cc7f413ec28 100644 --- a/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/pageDispatcher.ts @@ -272,6 +272,10 @@ export class PageDispatcher extends Dispatcher { + this._page.clearConsoleMessages(); + } + async consoleMessages(params: channels.PageConsoleMessagesParams, progress: Progress): Promise { // Send all future console messages to the client, so that it can reliably receive all of them. // Otherwise, if subscription is added in a different task from this call (either before or after), diff --git a/packages/playwright-core/src/server/page.ts b/packages/playwright-core/src/server/page.ts index 90553ed1129d2..5039267d282ca 100644 --- a/packages/playwright-core/src/server/page.ts +++ b/packages/playwright-core/src/server/page.ts @@ -400,6 +400,10 @@ export class Page extends SdkObject { this.emitOnContext(BrowserContext.Events.Console, message); } + clearConsoleMessages() { + this._consoleMessages.length = 0; + } + consoleMessages() { return this._consoleMessages; } diff --git a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts index cc1bc350736b4..be0b674fdb8a9 100644 --- a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts +++ b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts @@ -106,6 +106,7 @@ export const methodMetainfo = new Map; + /** + * Clears all stored console messages from this page. Subsequent calls to + * [page.consoleMessages()](https://playwright.dev/docs/api/class-page#page-console-messages) will only return + * messages logged after the clear. + */ + clearConsoleMessages(): Promise; + /** * **NOTE** Use locator-based [locator.click([options])](https://playwright.dev/docs/api/class-locator#locator-click) instead. * Read more about [locators](https://playwright.dev/docs/locators). diff --git a/packages/protocol/src/channels.d.ts b/packages/protocol/src/channels.d.ts index 165caeae220a1..5ca37806cb9c7 100644 --- a/packages/protocol/src/channels.d.ts +++ b/packages/protocol/src/channels.d.ts @@ -2088,6 +2088,7 @@ export interface PageChannel extends PageEventTarget, EventTargetChannel { _type_Page: boolean; addInitScript(params: PageAddInitScriptParams, progress?: Progress): Promise; close(params: PageCloseParams, progress?: Progress): Promise; + clearConsoleMessages(params?: PageClearConsoleMessagesParams, progress?: Progress): Promise; consoleMessages(params?: PageConsoleMessagesParams, progress?: Progress): Promise; emulateMedia(params: PageEmulateMediaParams, progress?: Progress): Promise; exposeBinding(params: PageExposeBindingParams, progress?: Progress): Promise; @@ -2187,6 +2188,9 @@ export type PageCloseOptions = { reason?: string, }; export type PageCloseResult = void; +export type PageClearConsoleMessagesParams = {}; +export type PageClearConsoleMessagesOptions = {}; +export type PageClearConsoleMessagesResult = void; export type PageConsoleMessagesParams = {}; export type PageConsoleMessagesOptions = {}; export type PageConsoleMessagesResult = { diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index d6e204d6292ca..657663dec42d3 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -1589,6 +1589,9 @@ Page: flags: pausesBeforeAction: true + clearConsoleMessages: + title: Clear console messages + consoleMessages: title: Get console messages group: getter diff --git a/tests/page/page-event-console.spec.ts b/tests/page/page-event-console.spec.ts index 832b1bf24a528..f6cf5778d7b12 100644 --- a/tests/page/page-event-console.spec.ts +++ b/tests/page/page-event-console.spec.ts @@ -275,3 +275,24 @@ it('consoleMessages should work', async ({ page }) => { expect(objects.length, 'should be at least 100 messages').toBeGreaterThanOrEqual(100); expect(objects.slice(objects.length - expected.length), 'should return last messages').toEqual(expected); }); + +it('clearConsoleMessages should work', async ({ page }) => { + await page.evaluate(() => { + console.log('message1'); + console.log('message2'); + }); + + let messages = await page.consoleMessages(); + expect(messages.map(m => m.text())).toContain('message1'); + expect(messages.map(m => m.text())).toContain('message2'); + + await page.clearConsoleMessages(); + + messages = await page.consoleMessages(); + expect(messages).toEqual([]); + + await page.evaluate(() => console.log('message3')); + messages = await page.consoleMessages(); + expect(messages.length).toBe(1); + expect(messages[0].text()).toBe('message3'); +});