From c562ef5bb702b7df8c3ae9df3af15ecf24634718 Mon Sep 17 00:00:00 2001 From: mikewong23571 Date: Fri, 13 Mar 2026 02:55:55 +0800 Subject: [PATCH] fix: allow newTab() in persistent context (--extension/--profile) mode (#731) When launched with --extension or --profile, launchPersistentContext() is used which sets isPersistentContext=true but leaves this.browser as null. The guard in newTab() checked !this.browser, causing a false "Browser not launched" error even though the browser was running. Replace !this.browser with !this.isLaunched(), which already accounts for both launch paths (browser !== null || isPersistentContext). Also improve the error message in newWindow() to clarify that it is not supported in persistent context mode, since it requires a Browser object to create a new context. Fixes #411 --- src/browser.test.ts | 26 ++++++++++++++++++++++++++ src/browser.ts | 8 ++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/browser.test.ts b/src/browser.test.ts index b56ae38..e0cbabf 100644 --- a/src/browser.test.ts +++ b/src/browser.test.ts @@ -1243,6 +1243,32 @@ describe('BrowserManager', () => { }); }); +describe('BrowserManager (persistent context / --profile mode)', () => { + let profileBrowser: BrowserManager; + let tmpProfileDir: string; + + beforeAll(async () => { + tmpProfileDir = path.join(os.tmpdir(), `agent-browser-test-profile-${Date.now()}`); + profileBrowser = new BrowserManager(); + await profileBrowser.launch({ headless: true, profile: tmpProfileDir }); + }); + + afterAll(async () => { + await profileBrowser.close(); + rmSync(tmpProfileDir, { recursive: true, force: true }); + }); + + it('should report as launched in persistent context mode', () => { + expect(profileBrowser.isLaunched()).toBe(true); + }); + + it('should create new tab in persistent context mode without throwing', async () => { + const result = await profileBrowser.newTab(); + expect(result.index).toBe(1); + expect(result.total).toBe(2); + }); +}); + describe('getDefaultTimeout', () => { const originalEnv = { ...process.env }; diff --git a/src/browser.ts b/src/browser.ts index c3450af..0e9eb3a 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -1829,7 +1829,7 @@ export class BrowserManager { * Create a new tab in the current context */ async newTab(): Promise<{ index: number; total: number }> { - if (!this.browser || this.contexts.length === 0) { + if (!this.isLaunched() || this.contexts.length === 0) { throw new Error('Browser not launched'); } @@ -1856,7 +1856,11 @@ export class BrowserManager { total: number; }> { if (!this.browser) { - throw new Error('Browser not launched'); + throw new Error( + this.isPersistentContext + ? 'newWindow is not supported in extension (persistent context) mode' + : 'Browser not launched' + ); } const context = await this.browser.newContext({