diff --git a/README.md b/README.md index 631495a..b38acc4 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,8 @@ Playwright MCP server supports following arguments. They can be provided in the "http://myproxy:3128" or "socks5://myproxy:8080" --save-trace Whether to save the Playwright Trace of the session into the output directory. + --save-session Whether to save the session log with tool calls + and snapshots into the output directory. --storage-state path to the storage state file for isolated sessions. --user-agent specify user agent string diff --git a/src/context.ts b/src/context.ts index 4df378f..edea1c2 100644 --- a/src/context.ts +++ b/src/context.ts @@ -52,9 +52,8 @@ export class Context { this.config = config; this._browserContextFactory = browserContextFactory; testDebug('create context'); - if (this.config.saveSession) { + if (this.config.saveSession) void this._initializeSessionFile(); - } } clientSupportsImages(): boolean { @@ -138,11 +137,11 @@ export class Context { private async _initializeSessionFile() { if (!this.config.saveSession) return; - + const timestamp = new Date().toISOString(); const fileName = `session${timestamp}.yml`; this._sessionFile = await outputFile(this.config, fileName); - + // Initialize empty session file await fs.promises.writeFile(this._sessionFile, '# Session log started at ' + timestamp + '\n', 'utf8'); } @@ -163,9 +162,8 @@ export class Context { } // Add snapshot reference if provided - if (snapshotFile) { + if (snapshotFile) entry.push(` snapshot: ${path.basename(snapshotFile)}`); - } entry.push(''); // Empty line for readability @@ -191,7 +189,7 @@ export class Context { const tab = this.currentTabOrDie(); let snapshotFile: string | undefined; - + // TODO: race against modal dialogs to resolve clicks. const actionResult = await this._raceAgainstModalDialogs(async () => { try { @@ -214,9 +212,8 @@ export class Context { }); // Log session entry if enabled - if (this.config.saveSession) { + if (this.config.saveSession) await this._logSessionEntry(tool.schema.name, params || {}, snapshotFile); - } const result: string[] = []; result.push(`### Ran Playwright code diff --git a/tests/session.spec.ts b/tests/session.spec.ts index 5adea55..960d9dd 100644 --- a/tests/session.spec.ts +++ b/tests/session.spec.ts @@ -57,7 +57,7 @@ test('check that session includes multiple tool calls', async ({ startClient, se arguments: { url: server.HELLO_WORLD }, }); - // Take a snapshot + // Take a snapshot await client.callTool({ name: 'browser_snapshot', arguments: {}, @@ -71,8 +71,8 @@ test('check that session includes multiple tool calls', async ({ startClient, se const sessionContent = fs.readFileSync(path.join(outputDir, sessionFiles[0]), 'utf8'); expect(sessionContent).toContain('- browser_navigate:'); expect(sessionContent).toContain('- browser_snapshot:'); - + // Check that snapshot files exist const snapshotFiles = files.filter(f => f.includes('snapshot.yaml')); expect(snapshotFiles.length).toBeGreaterThan(0); -}); \ No newline at end of file +});