chore: include recent console logs in results (#689)

This commit is contained in:
Pavel Feldman
2025-07-17 14:58:44 -07:00
committed by GitHub
parent c97bc6e2ae
commit 5bfff0a059
9 changed files with 103 additions and 51 deletions

View File

@@ -161,14 +161,13 @@ export class Context {
});
const result: string[] = [];
result.push(`- Ran Playwright code:
result.push(`### Ran Playwright code
\`\`\`js
${code.join('\n')}
\`\`\`
`);
\`\`\``);
if (this.modalStates().length) {
result.push(...this.modalStatesMarkdown());
result.push('', ...this.modalStatesMarkdown());
return {
content: [{
type: 'text',
@@ -177,6 +176,13 @@ ${code.join('\n')}
};
}
const messages = tab.takeRecentConsoleMessages();
if (messages.length) {
result.push('', `### New console messages`);
for (const message of messages)
result.push(`- ${trim(message.toString(), 100)}`);
}
if (this._downloads.length) {
result.push('', '### Downloads');
for (const entry of this._downloads) {
@@ -185,15 +191,16 @@ ${code.join('\n')}
else
result.push(`- Downloading file ${entry.download.suggestedFilename()} ...`);
}
result.push('');
}
if (captureSnapshot && tab.hasSnapshot()) {
if (this.tabs().length > 1)
result.push(await this.listTabsMarkdown(), '');
result.push('', await this.listTabsMarkdown());
if (this.tabs().length > 1)
result.push('### Current tab');
result.push('', '### Current tab');
else
result.push('', '### Page state');
result.push(
`- Page URL: ${tab.page.url()}`,
@@ -346,3 +353,9 @@ ${code.join('\n')}
return result;
}
}
function trim(text: string, maxLength: number) {
if (text.length <= maxLength)
return text;
return text.slice(0, maxLength) + '...';
}

View File

@@ -42,7 +42,7 @@ export class PageSnapshot {
private async _build() {
const snapshot = await callOnPageNoTrace(this._page, page => (page as PageEx)._snapshotForAI());
this._text = [
`- Page Snapshot`,
`- Page Snapshot:`,
'```yaml',
snapshot,
'```',

View File

@@ -26,6 +26,7 @@ export class Tab {
readonly context: Context;
readonly page: playwright.Page;
private _consoleMessages: ConsoleMessage[] = [];
private _recentConsoleMessages: ConsoleMessage[] = [];
private _requests: Map<playwright.Request, playwright.Response | null> = new Map();
private _snapshot: PageSnapshot | undefined;
private _onPageClose: (tab: Tab) => void;
@@ -34,8 +35,8 @@ export class Tab {
this.context = context;
this.page = page;
this._onPageClose = onPageClose;
page.on('console', event => this._consoleMessages.push(messageToConsoleMessage(event)));
page.on('pageerror', error => this._consoleMessages.push(pageErrorToConsoleMessage(error)));
page.on('console', event => this._handleConsoleMessage(messageToConsoleMessage(event)));
page.on('pageerror', error => this._handleConsoleMessage(pageErrorToConsoleMessage(error)));
page.on('request', request => this._requests.set(request, null));
page.on('response', response => this._requests.set(response.request(), response));
page.on('close', () => this._onClose());
@@ -56,9 +57,15 @@ export class Tab {
private _clearCollectedArtifacts() {
this._consoleMessages.length = 0;
this._recentConsoleMessages.length = 0;
this._requests.clear();
}
private _handleConsoleMessage(message: ConsoleMessage) {
this._consoleMessages.push(message);
this._recentConsoleMessages.push(message);
}
private _onClose() {
this._clearCollectedArtifacts();
this._onPageClose(this);
@@ -119,6 +126,12 @@ export class Tab {
async captureSnapshot() {
this._snapshot = await PageSnapshot.create(this.page);
}
takeRecentConsoleMessages(): ConsoleMessage[] {
const result = this._recentConsoleMessages.slice();
this._recentConsoleMessages.length = 0;
return result;
}
}
export type ConsoleMessage = {