Skip to content

Commit 1125381

Browse files
authored
feat: page.consoleMessages and page.pageErrors (#37450)
1 parent cde6c43 commit 1125381

File tree

21 files changed

+219
-44
lines changed

21 files changed

+219
-44
lines changed

docs/src/api/class-page.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,6 +2677,21 @@ Returns whether the element is [visible](../actionability.md#visible). [`param:
26772677
* since: v1.8
26782678
- type: <[Keyboard]>
26792679

2680+
2681+
## async method: Page.consoleMessages
2682+
* since: v1.56
2683+
- returns: <[Array]<[ConsoleMessage]>>
2684+
2685+
Returns up to 200 last console messages from this page. See [`event: Page.console`] for more details.
2686+
2687+
2688+
## async method: Page.pageErrors
2689+
* since: v1.56
2690+
- returns: <[Array]<[Error]>>
2691+
2692+
Returns up to 200 last page errors from this page. See [`event: Page.pageError`] for more details.
2693+
2694+
26802695
## method: Page.locator
26812696
* since: v1.14
26822697
- returns: <[Locator]>

packages/playwright-client/types/types.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,6 +2284,12 @@ export interface Page {
22842284
runBeforeUnload?: boolean;
22852285
}): Promise<void>;
22862286

2287+
/**
2288+
* Returns up to 200 last console messages from this page. See
2289+
* [page.on('console')](https://playwright.dev/docs/api/class-page#page-event-console) for more details.
2290+
*/
2291+
consoleMessages(): Promise<Array<ConsoleMessage>>;
2292+
22872293
/**
22882294
* Gets the full HTML contents of the page, including the doctype.
22892295
*/
@@ -3598,6 +3604,12 @@ export interface Page {
35983604
*/
35993605
opener(): Promise<null|Page>;
36003606

3607+
/**
3608+
* Returns up to 200 last page errors from this page. See
3609+
* [page.on('pageerror')](https://playwright.dev/docs/api/class-page#page-event-page-error) for more details.
3610+
*/
3611+
pageErrors(): Promise<Array<Error>>;
3612+
36013613
/**
36023614
* Pauses script execution. Playwright will stop executing the script and wait for the user to either press the
36033615
* 'Resume' button in the page overlay or to call `playwright.resume()` in the DevTools console.

packages/playwright-core/src/client/browserContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
114114
this.emit(Events.BrowserContext.ServiceWorker, serviceWorker);
115115
});
116116
this._channel.on('console', event => {
117-
const consoleMessage = new ConsoleMessage(this._platform, event);
117+
const consoleMessage = new ConsoleMessage(this._platform, event, Page.fromNullable(event.page));
118118
this.emit(Events.BrowserContext.Console, consoleMessage);
119119
const page = consoleMessage.page();
120120
if (page)

packages/playwright-core/src/client/consoleMessage.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ type ConsoleMessageLocation = channels.BrowserContextConsoleEvent['location'];
2626
export class ConsoleMessage implements api.ConsoleMessage {
2727

2828
private _page: Page | null;
29-
private _event: channels.BrowserContextConsoleEvent | channels.ElectronApplicationConsoleEvent;
29+
private _event: channels.WorkerConsoleEvent;
3030

31-
constructor(platform: Platform, event: channels.BrowserContextConsoleEvent | channels.ElectronApplicationConsoleEvent) {
32-
this._page = ('page' in event && event.page) ? Page.from(event.page) : null;
31+
constructor(platform: Platform, event: channels.WorkerConsoleEvent, page: Page | null) {
32+
this._page = page;
3333
this._event = event;
3434
if (platform.inspectCustom)
3535
(this as any)[platform.inspectCustom] = () => this._inspect();

packages/playwright-core/src/client/electron.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export class ElectronApplication extends ChannelOwner<channels.ElectronApplicati
9292
this._channel.on('close', () => {
9393
this.emit(Events.ElectronApplication.Close);
9494
});
95-
this._channel.on('console', event => this.emit(Events.ElectronApplication.Console, new ConsoleMessage(this._platform, event)));
95+
this._channel.on('console', event => this.emit(Events.ElectronApplication.Console, new ConsoleMessage(this._platform, event, null)));
9696
this._setEventToSubscriptionMapping(new Map<string, channels.ElectronApplicationUpdateSubscriptionParams['event']>([
9797
[Events.ElectronApplication.Console, 'console'],
9898
]));

packages/playwright-core/src/client/page.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { evaluationScript } from './clientHelper';
2222
import { Coverage } from './coverage';
2323
import { Download } from './download';
2424
import { ElementHandle, determineScreenshotType } from './elementHandle';
25-
import { TargetClosedError, isTargetClosedError, serializeError } from './errors';
25+
import { TargetClosedError, isTargetClosedError, parseError, serializeError } from './errors';
2626
import { Events } from './events';
2727
import { FileChooser } from './fileChooser';
2828
import { Frame, verifyLoadState } from './frame';
@@ -41,6 +41,7 @@ import { trimStringWithEllipsis } from '../utils/isomorphic/stringUtils';
4141
import { urlMatches, urlMatchesEqual } from '../utils/isomorphic/urlMatch';
4242
import { LongStandingScope } from '../utils/isomorphic/manualPromise';
4343
import { isObject, isRegExp, isString } from '../utils/isomorphic/rtti';
44+
import { ConsoleMessage } from './consoleMessage';
4445

4546
import type { BrowserContext } from './browserContext';
4647
import type { Clock } from './clock';
@@ -669,6 +670,16 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
669670
return await this._mainFrame.fill(selector, value, options);
670671
}
671672

673+
async consoleMessages(): Promise<ConsoleMessage[]> {
674+
const { messages } = await this._channel.consoleMessages();
675+
return messages.map(message => new ConsoleMessage(this._platform, message, this));
676+
}
677+
678+
async pageErrors(): Promise<Error[]> {
679+
const { errors } = await this._channel.pageErrors();
680+
return errors.map(error => parseError(error));
681+
}
682+
672683
locator(selector: string, options?: LocatorOptions): Locator {
673684
return this.mainFrame().locator(selector, options);
674685
}

packages/playwright-core/src/client/worker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class Worker extends ChannelOwner<channels.WorkerChannel> implements api.
4747
this.emit(Events.Worker.Close, this);
4848
});
4949
this._channel.on('console', event => {
50-
this.emit(Events.Worker.Console, new ConsoleMessage(this._page?.context()._platform ?? this._context?._platform!, event));
50+
this.emit(Events.Worker.Console, new ConsoleMessage(this._page?.context()._platform ?? this._context?._platform!, event, null));
5151
});
5252
this.once(Events.Worker.Close, () => this._closedScope.close(this._page?._closeErrorWithReason() || new TargetClosedError()));
5353
this._setEventToSubscriptionMapping(new Map<string, channels.WorkerUpdateSubscriptionParams['event']>([

packages/playwright-core/src/protocol/validator.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,19 @@ scheme.PageCloseParams = tObject({
12451245
reason: tOptional(tString),
12461246
});
12471247
scheme.PageCloseResult = tOptional(tObject({}));
1248+
scheme.PageConsoleMessagesParams = tOptional(tObject({}));
1249+
scheme.PageConsoleMessagesResult = tObject({
1250+
messages: tArray(tObject({
1251+
type: tString,
1252+
text: tString,
1253+
args: tArray(tChannel(['ElementHandle', 'JSHandle'])),
1254+
location: tObject({
1255+
url: tString,
1256+
lineNumber: tInt,
1257+
columnNumber: tInt,
1258+
}),
1259+
})),
1260+
});
12481261
scheme.PageEmulateMediaParams = tObject({
12491262
media: tOptional(tEnum(['screen', 'print', 'no-override'])),
12501263
colorScheme: tOptional(tEnum(['dark', 'light', 'no-preference', 'no-override'])),
@@ -1440,6 +1453,10 @@ scheme.PageAccessibilitySnapshotParams = tObject({
14401453
scheme.PageAccessibilitySnapshotResult = tObject({
14411454
rootAXNode: tOptional(tType('AXNode')),
14421455
});
1456+
scheme.PagePageErrorsParams = tOptional(tObject({}));
1457+
scheme.PagePageErrorsResult = tObject({
1458+
errors: tArray(tType('SerializedError')),
1459+
});
14431460
scheme.PagePdfParams = tObject({
14441461
scale: tOptional(tFloat),
14451462
displayHeaderFooter: tOptional(tBoolean),

packages/playwright-core/src/server/bidi/bidiPage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ export class BidiPage implements PageDelegate {
271271
const location = `${f.url}:${f.lineNumber + 1}:${f.columnNumber + 1}`;
272272
return f.functionName ? ` at ${f.functionName} (${location})` : ` at ${location}`;
273273
}).join('\n')}`;
274-
this._page.emitOnContextOnceInitialized(BidiBrowserContext.Events.PageError, error, this._page);
274+
this._page.addPageError(error);
275275
return;
276276
}
277277
if (params.type !== 'console')

packages/playwright-core/src/server/chromium/crPage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ class FrameSession {
783783
const args = event.args.map(o => createHandle(worker.existingExecutionContext!, o));
784784
this._page.addConsoleMessage(event.type, args, toConsoleMessageLocation(event.stackTrace));
785785
});
786-
session.on('Runtime.exceptionThrown', exception => this._page.emitOnContextOnceInitialized(BrowserContext.Events.PageError, exceptionToError(exception.exceptionDetails), this._page));
786+
session.on('Runtime.exceptionThrown', exception => this._page.addPageError(exceptionToError(exception.exceptionDetails)));
787787
}
788788

789789
_onDetachedFromTarget(event: Protocol.Target.detachedFromTargetPayload) {
@@ -873,7 +873,7 @@ class FrameSession {
873873
}
874874

875875
_handleException(exceptionDetails: Protocol.Runtime.ExceptionDetails) {
876-
this._page.emitOnContextOnceInitialized(BrowserContext.Events.PageError, exceptionToError(exceptionDetails), this._page);
876+
this._page.addPageError(exceptionToError(exceptionDetails));
877877
}
878878

879879
async _onTargetCrashed() {

0 commit comments

Comments
 (0)