diff --git a/src/context.ts b/src/context.ts index 7bbc69a..b0db3cf 100644 --- a/src/context.ts +++ b/src/context.ts @@ -42,6 +42,7 @@ export class Context { readonly options: ContextOptions; private _browser: playwright.Browser | undefined; private _browserContext: playwright.BrowserContext | undefined; + private _persistentContext: playwright.BrowserContext | null = null; private _tabs: Tab[] = []; private _currentTab: Tab | undefined; private _modalStates: (ModalState & { tab: Tab })[] = []; @@ -259,19 +260,29 @@ ${code.join('\n')} return; const browserContext = this._browserContext; const browser = this._browser; + const persistentContext = this._persistentContext; this._browserContext = undefined; this._browser = undefined; + this._persistentContext = null; - await browserContext?.close().then(async () => { - await browser?.close(); - }).catch(() => {}); + await Promise.all([ + browserContext?.close(), + browser?.close(), + persistentContext?.close() + ]).catch(() => {}); } private async _ensureBrowserContext() { if (!this._browserContext) { - const context = await this._createBrowserContext(); - this._browser = context.browser; - this._browserContext = context.browserContext; + if (this._persistentContext) { + this._browserContext = this._persistentContext; + } else { + const context = await this._createBrowserContext(); + this._browser = context.browser; + this._browserContext = context.browserContext; + if (!this.options.remoteEndpoint && !this.options.cdpEndpoint) + this._persistentContext = this._browserContext; + } for (const page of this._browserContext.pages()) this._onPageCreated(page); this._browserContext.on('page', page => this._onPageCreated(page)); @@ -297,14 +308,10 @@ ${code.join('\n')} return { browser, browserContext }; } - const browserContext = await this._launchPersistentContext(); - return { browserContext }; - } - - private async _launchPersistentContext(): Promise { try { const browserType = this.options.browserName ? playwright[this.options.browserName] : playwright.chromium; - return await browserType.launchPersistentContext(this.options.userDataDir, this.options.launchOptions); + const browserContext = await browserType.launchPersistentContext(this.options.userDataDir, this.options.launchOptions); + return { browserContext }; } catch (error: any) { if (error.message.includes('Executable doesn\'t exist')) throw new Error(`Browser specified in your config is not installed. Either install it (likely) or change the config.`); @@ -413,7 +420,7 @@ class PageSnapshot { private async _snapshotFrame(frame: playwright.Page | playwright.FrameLocator) { const frameIndex = this._frameLocators.push(frame) - 1; - const snapshotString = await frame.locator('body').ariaSnapshot({ ref: true, emitGeneric: true }); + const snapshotString = await frame.locator('body').ariaSnapshot({ ref: true }); const snapshot = yaml.parseDocument(snapshotString); const visit = async (node: any): Promise => {