Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions docs/src/api/class-page.md
Original file line number Diff line number Diff line change
Expand Up @@ -2760,6 +2760,14 @@ Clears all stored page errors from this page. Subsequent calls to [`method: Page

Returns up to (currently) 200 last console messages from this page. See [`event: Page.console`] for more details.

### option: Page.consoleMessages.filter
* since: v1.59
- `filter` <[ConsoleMessagesFilter]<"all"|"sinceNavigation">>

Controls which messages are returned:
- `'sinceNavigation'` (default) — returns only messages logged after the last committed main-frame navigation.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is't this a breaking change?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes

- `'all'` — returns all stored console messages.


## async method: Page.pageErrors
* since: v1.56
Expand All @@ -2775,6 +2783,15 @@ Returns up to (currently) 200 last page errors from this page. See [`event: Page

Returns up to (currently) 200 last page errors from this page. See [`event: Page.pageError`] for more details.

### option: Page.pageErrors.filter
* since: v1.59
* langs: js
- `filter` <[PageErrorsFilter]<"all"|"sinceNavigation">>

Controls which errors are returned:
- `'sinceNavigation'` (default) — returns only errors thrown after the last committed main-frame navigation.
- `'all'` — returns all stored page errors.


## method: Page.locator
* since: v1.14
Expand Down
24 changes: 18 additions & 6 deletions packages/playwright-client/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2258,15 +2258,15 @@ export interface Page {

/**
* 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.
* [page.consoleMessages([options])](https://playwright.dev/docs/api/class-page#page-console-messages) will only
* return messages logged after the clear.
*/
clearConsoleMessages(): Promise<void>;

/**
* Clears all stored page errors from this page. Subsequent calls to
* [page.pageErrors()](https://playwright.dev/docs/api/class-page#page-page-errors) will only return errors thrown
* after the clear.
* [page.pageErrors([options])](https://playwright.dev/docs/api/class-page#page-page-errors) will only return errors
* thrown after the clear.
*/
clearPageErrors(): Promise<void>;

Expand Down Expand Up @@ -2395,8 +2395,14 @@ export interface Page {
/**
* Returns up to (currently) 200 last console messages from this page. See
* [page.on('console')](https://playwright.dev/docs/api/class-page#page-event-console) for more details.
* @param options
*/
consoleMessages(): Promise<Array<ConsoleMessage>>;
consoleMessages(options?: {
/**
* Controls which messages are returned:
*/
filter?: "all"|"sinceNavigation";
}): Promise<Array<ConsoleMessage>>;

/**
* Gets the full HTML contents of the page, including the doctype.
Expand Down Expand Up @@ -3739,8 +3745,14 @@ export interface Page {
/**
* Returns up to (currently) 200 last page errors from this page. See
* [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) for more details.
* @param options
*/
pageErrors(): Promise<Array<Error>>;
pageErrors(options?: {
/**
* Controls which errors are returned:
*/
filter?: "all"|"sinceNavigation";
}): Promise<Array<Error>>;

/**
* Pauses script execution. Playwright will stop executing the script and wait for the user to either press the
Expand Down
8 changes: 4 additions & 4 deletions packages/playwright-core/src/client/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -670,17 +670,17 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
await this._channel.clearConsoleMessages();
}

async consoleMessages(): Promise<ConsoleMessage[]> {
const { messages } = await this._channel.consoleMessages();
async consoleMessages(options?: { filter?: 'all' | 'sinceNavigation' }): Promise<ConsoleMessage[]> {
const { messages } = await this._channel.consoleMessages({ filter: options?.filter });
return messages.map(message => new ConsoleMessage(this._platform, message, this, null));
}

async clearPageErrors(): Promise<void> {
await this._channel.clearPageErrors();
}

async pageErrors(): Promise<Error[]> {
const { errors } = await this._channel.pageErrors();
async pageErrors(options?: { filter?: 'all' | 'sinceNavigation' }): Promise<Error[]> {
const { errors } = await this._channel.pageErrors({ filter: options?.filter });
return errors.map(error => parseError(error));
}

Expand Down
9 changes: 7 additions & 2 deletions packages/playwright-core/src/protocol/validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ scheme.APIResponse = tObject({
headers: tArray(tType('NameValue')),
});
scheme.LifecycleEvent = tEnum(['load', 'domcontentloaded', 'networkidle', 'commit']);
scheme.ConsoleMessagesFilter = tEnum(['all', 'sinceNavigation']);
scheme.LocalUtilsInitializer = tObject({
deviceDescriptors: tArray(tObject({
name: tString,
Expand Down Expand Up @@ -1249,7 +1250,9 @@ scheme.PageCloseParams = tObject({
scheme.PageCloseResult = tOptional(tObject({}));
scheme.PageClearConsoleMessagesParams = tOptional(tObject({}));
scheme.PageClearConsoleMessagesResult = tOptional(tObject({}));
scheme.PageConsoleMessagesParams = tOptional(tObject({}));
scheme.PageConsoleMessagesParams = tObject({
filter: tOptional(tType('ConsoleMessagesFilter')),
});
scheme.PageConsoleMessagesResult = tObject({
messages: tArray(tObject({
type: tString,
Expand Down Expand Up @@ -1457,7 +1460,9 @@ scheme.PageTouchscreenTapParams = tObject({
scheme.PageTouchscreenTapResult = tOptional(tObject({}));
scheme.PageClearPageErrorsParams = tOptional(tObject({}));
scheme.PageClearPageErrorsResult = tOptional(tObject({}));
scheme.PagePageErrorsParams = tOptional(tObject({}));
scheme.PagePageErrorsParams = tObject({
filter: tOptional(tType('ConsoleMessagesFilter')),
});
scheme.PagePageErrorsResult = tObject({
errors: tArray(tType('SerializedError')),
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,15 +290,15 @@ export class PageDispatcher extends Dispatcher<Page, channels.PageChannel, Brows
// Otherwise, if subscription is added in a different task from this call (either before or after),
// there is a chance for a duplicate or a lost console message.
this._subscriptions.add('console');
return { messages: this._page.consoleMessages().map(message => this.parentScope().serializeConsoleMessage(message, this)) };
return { messages: this._page.consoleMessages(params.filter).map(message => this.parentScope().serializeConsoleMessage(message, this)) };
}

async clearPageErrors(params: channels.PageClearPageErrorsParams, progress: Progress): Promise<channels.PageClearPageErrorsResult> {
this._page.clearPageErrors();
}

async pageErrors(params: channels.PagePageErrorsParams, progress: Progress): Promise<channels.PagePageErrorsResult> {
return { errors: this._page.pageErrors().map(error => serializeError(error)) };
return { errors: this._page.pageErrors(params.filter).map(error => serializeError(error)) };
}

async mouseMove(params: channels.PageMouseMoveParams, progress: Progress): Promise<void> {
Expand Down
22 changes: 18 additions & 4 deletions packages/playwright-core/src/server/page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ export type PageEventMap = {
[PageEvent.Worker]: [worker: Worker];
};

const navigationMarkSymbol = Symbol('navigationMark');

export class Page extends SdkObject<PageEventMap> {
static Events = PageEvent;

Expand Down Expand Up @@ -403,8 +405,11 @@ export class Page extends SdkObject<PageEventMap> {
this._consoleMessages.length = 0;
}

consoleMessages() {
return this._consoleMessages;
consoleMessages(filter?: 'all' | 'sinceNavigation') {
if (filter === 'all')
return this._consoleMessages;
const marked = this._consoleMessages.findLastIndex(m => (m as any)[navigationMarkSymbol]);
return marked === -1 ? this._consoleMessages : this._consoleMessages.slice(marked + 1);
}

addPageError(pageError: Error) {
Expand All @@ -422,8 +427,11 @@ export class Page extends SdkObject<PageEventMap> {
this._pageErrors.length = 0;
}

pageErrors() {
return this._pageErrors;
pageErrors(filter?: 'all' | 'sinceNavigation') {
if (filter === 'all')
return this._pageErrors;
const marked = this._pageErrors.findLastIndex(e => (e as any)[navigationMarkSymbol]);
return marked === -1 ? this._pageErrors : this._pageErrors.slice(marked + 1);
}

async reload(progress: Progress, options: types.NavigateOptions): Promise<network.Response | null> {
Expand Down Expand Up @@ -842,6 +850,12 @@ export class Page extends SdkObject<PageEventMap> {
const origin = frame.origin();
if (origin)
this.browserContext.addVisitedOrigin(origin);
if (frame === this.mainFrame()) {
if (this._consoleMessages.length > 0)
(this._consoleMessages[this._consoleMessages.length - 1] as any)[navigationMarkSymbol] = true;
if (this._pageErrors.length > 0)
(this._pageErrors[this._pageErrors.length - 1] as any)[navigationMarkSymbol] = true;
}
}

allInitScripts() {
Expand Down
3 changes: 2 additions & 1 deletion packages/playwright-core/src/tools/console.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,15 @@ const console = defineTabTool({
description: 'Returns all console messages',
inputSchema: z.object({
level: z.enum(['error', 'warning', 'info', 'debug']).default('info').describe('Level of the console messages to return. Each level includes the messages of more severe levels. Defaults to "info".'),
all: z.boolean().optional().describe('Return all console messages since the beginning of the session, not just since the last navigation. Defaults to false.'),
filename: z.string().optional().describe('Filename to save the console messages to. If not provided, messages are returned as text.'),
}),
type: 'readOnly',
},
handle: async (tab, params, response) => {
const count = await tab.consoleMessageCount();
const header = [`Total messages: ${count.total} (Errors: ${count.errors}, Warnings: ${count.warnings})`];
const messages = await tab.consoleMessages(params.level);
const messages = await tab.consoleMessages(params.level, params.all);
if (messages.length !== count.total)
header.push(`Returning ${messages.length} messages for level "${params.level}"`);
const text = [...header, '', ...messages.map(message => message.toString())].join('\n');
Expand Down
11 changes: 5 additions & 6 deletions packages/playwright-core/src/tools/tab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,6 @@ export class Tab extends EventEmitter<TabEventsInterface> {
async navigate(url: string) {
await this._initializedPromise;

await this.clearConsoleMessages();
this._clearCollectedArtifacts();

const { promise: downloadEvent, abort: abortDownloadEvent } = eventWaiter<playwright.Download>(this.page, 'download', 3000);
Expand Down Expand Up @@ -327,8 +326,8 @@ export class Tab extends EventEmitter<TabEventsInterface> {

async consoleMessageCount(): Promise<{ total: number, errors: number, warnings: number }> {
await this._initializedPromise;
const messages = await this.page.consoleMessages();
const pageErrors = await this.page.pageErrors();
const messages = await this.page.consoleMessages({ filter: 'sinceNavigation' });
const pageErrors = await this.page.pageErrors({ filter: 'sinceNavigation' });
let errors = pageErrors.length;
let warnings = 0;
for (const message of messages) {
Expand All @@ -340,17 +339,17 @@ export class Tab extends EventEmitter<TabEventsInterface> {
return { total: messages.length + pageErrors.length, errors, warnings };
}

async consoleMessages(level: ConsoleMessageLevel): Promise<ConsoleMessage[]> {
async consoleMessages(level: ConsoleMessageLevel, all?: boolean): Promise<ConsoleMessage[]> {
await this._initializedPromise;
const result: ConsoleMessage[] = [];
const messages = await this.page.consoleMessages();
const messages = await this.page.consoleMessages({ filter: all ? 'all' : 'sinceNavigation' });
for (const message of messages) {
const cm = messageToConsoleMessage(message);
if (shouldIncludeMessage(level, cm.type))
result.push(cm);
}
if (shouldIncludeMessage(level, 'error')) {
const errors = await this.page.pageErrors();
const errors = await this.page.pageErrors({ filter: all ? 'all' : 'sinceNavigation' });
for (const error of errors)
result.push(pageErrorToConsoleMessage(error));
}
Expand Down
24 changes: 18 additions & 6 deletions packages/playwright-core/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2258,15 +2258,15 @@ export interface Page {

/**
* 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.
* [page.consoleMessages([options])](https://playwright.dev/docs/api/class-page#page-console-messages) will only
* return messages logged after the clear.
*/
clearConsoleMessages(): Promise<void>;

/**
* Clears all stored page errors from this page. Subsequent calls to
* [page.pageErrors()](https://playwright.dev/docs/api/class-page#page-page-errors) will only return errors thrown
* after the clear.
* [page.pageErrors([options])](https://playwright.dev/docs/api/class-page#page-page-errors) will only return errors
* thrown after the clear.
*/
clearPageErrors(): Promise<void>;

Expand Down Expand Up @@ -2395,8 +2395,14 @@ export interface Page {
/**
* Returns up to (currently) 200 last console messages from this page. See
* [page.on('console')](https://playwright.dev/docs/api/class-page#page-event-console) for more details.
* @param options
*/
consoleMessages(): Promise<Array<ConsoleMessage>>;
consoleMessages(options?: {
/**
* Controls which messages are returned:
*/
filter?: "all"|"sinceNavigation";
}): Promise<Array<ConsoleMessage>>;

/**
* Gets the full HTML contents of the page, including the doctype.
Expand Down Expand Up @@ -3739,8 +3745,14 @@ export interface Page {
/**
* Returns up to (currently) 200 last page errors from this page. See
* [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) for more details.
* @param options
*/
pageErrors(): Promise<Array<Error>>;
pageErrors(options?: {
/**
* Controls which errors are returned:
*/
filter?: "all"|"sinceNavigation";
}): Promise<Array<Error>>;

/**
* Pauses script execution. Playwright will stop executing the script and wait for the user to either press the
Expand Down
21 changes: 15 additions & 6 deletions packages/protocol/src/channels.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,7 @@ export type APIResponse = {
};

export type LifecycleEvent = 'load' | 'domcontentloaded' | 'networkidle' | 'commit';
export type ConsoleMessagesFilter = 'all' | 'sinceNavigation';
// ----------- LocalUtils -----------
export type LocalUtilsInitializer = {
deviceDescriptors: {
Expand Down Expand Up @@ -2108,7 +2109,7 @@ export interface PageChannel extends PageEventTarget, EventTargetChannel {
addInitScript(params: PageAddInitScriptParams, progress?: Progress): Promise<PageAddInitScriptResult>;
close(params: PageCloseParams, progress?: Progress): Promise<PageCloseResult>;
clearConsoleMessages(params?: PageClearConsoleMessagesParams, progress?: Progress): Promise<PageClearConsoleMessagesResult>;
consoleMessages(params?: PageConsoleMessagesParams, progress?: Progress): Promise<PageConsoleMessagesResult>;
consoleMessages(params: PageConsoleMessagesParams, progress?: Progress): Promise<PageConsoleMessagesResult>;
emulateMedia(params: PageEmulateMediaParams, progress?: Progress): Promise<PageEmulateMediaResult>;
exposeBinding(params: PageExposeBindingParams, progress?: Progress): Promise<PageExposeBindingResult>;
goBack(params: PageGoBackParams, progress?: Progress): Promise<PageGoBackResult>;
Expand Down Expand Up @@ -2136,7 +2137,7 @@ export interface PageChannel extends PageEventTarget, EventTargetChannel {
mouseWheel(params: PageMouseWheelParams, progress?: Progress): Promise<PageMouseWheelResult>;
touchscreenTap(params: PageTouchscreenTapParams, progress?: Progress): Promise<PageTouchscreenTapResult>;
clearPageErrors(params?: PageClearPageErrorsParams, progress?: Progress): Promise<PageClearPageErrorsResult>;
pageErrors(params?: PagePageErrorsParams, progress?: Progress): Promise<PagePageErrorsResult>;
pageErrors(params: PagePageErrorsParams, progress?: Progress): Promise<PagePageErrorsResult>;
pdf(params: PagePdfParams, progress?: Progress): Promise<PagePdfResult>;
requests(params?: PageRequestsParams, progress?: Progress): Promise<PageRequestsResult>;
snapshotForAI(params: PageSnapshotForAIParams, progress?: Progress): Promise<PageSnapshotForAIResult>;
Expand Down Expand Up @@ -2220,8 +2221,12 @@ export type PageCloseResult = void;
export type PageClearConsoleMessagesParams = {};
export type PageClearConsoleMessagesOptions = {};
export type PageClearConsoleMessagesResult = void;
export type PageConsoleMessagesParams = {};
export type PageConsoleMessagesOptions = {};
export type PageConsoleMessagesParams = {
filter?: ConsoleMessagesFilter,
};
export type PageConsoleMessagesOptions = {
filter?: ConsoleMessagesFilter,
};
export type PageConsoleMessagesResult = {
messages: {
type: string,
Expand Down Expand Up @@ -2547,8 +2552,12 @@ export type PageTouchscreenTapResult = void;
export type PageClearPageErrorsParams = {};
export type PageClearPageErrorsOptions = {};
export type PageClearPageErrorsResult = void;
export type PagePageErrorsParams = {};
export type PagePageErrorsOptions = {};
export type PagePageErrorsParams = {
filter?: ConsoleMessagesFilter,
};
export type PagePageErrorsOptions = {
filter?: ConsoleMessagesFilter,
};
export type PagePageErrorsResult = {
errors: SerializedError[],
};
Expand Down
10 changes: 10 additions & 0 deletions packages/protocol/src/protocol.yml
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@ LifecycleEvent:
- networkidle
- commit

ConsoleMessagesFilter:
type: enum
literals:
- all
- sinceNavigation

CommonScreenshotOptions:
type: mixin
properties:
Expand Down Expand Up @@ -1615,6 +1621,8 @@ Page:
consoleMessages:
title: Get console messages
group: getter
parameters:
filter: ConsoleMessagesFilter?
returns:
messages:
type: array
Expand Down Expand Up @@ -1959,6 +1967,8 @@ Page:
pageErrors:
title: Get page errors
group: getter
parameters:
filter: ConsoleMessagesFilter?
returns:
errors:
type: array
Expand Down
Loading
Loading