diff --git a/README.md b/README.md index 041296a0..6215d648 100644 --- a/README.md +++ b/README.md @@ -321,6 +321,26 @@ it('should put test in debug mode', async () => { }) ``` +### `global.jestPuppeteer.resetPage()` + +Reset global.page + +```js +beforeEach(async () => { + await jestPuppeteer.resetPage() +}) +``` + +### `global.jestPuppeteer.resetBrowser()` + +Reset global.browser, global.context, and global.page + +```js +beforeEach(async () => { + await jestPuppeteer.resetBrowser() +}) +``` + ### `jest-puppeteer.config.js` You can specify a `jest-puppeteer.config.js` at the root of the project or define a custom path using `JEST_PUPPETEER_CONFIG` environment variable. diff --git a/packages/jest-environment-puppeteer/README.md b/packages/jest-environment-puppeteer/README.md index b7f89c1d..d0bb0108 100644 --- a/packages/jest-environment-puppeteer/README.md +++ b/packages/jest-environment-puppeteer/README.md @@ -87,6 +87,16 @@ beforeEach(async () => { }) ``` +### `global.jestPuppeteer.resetBrowser()` + +Reset global.browser, global.context, and global.page + +```js +beforeEach(async () => { + await jestPuppeteer.resetBrowser() +}) +``` + ### `jest-puppeteer.config.js` You can specify a `jest-puppeteer.config.js` at the root of the project or define a custom path using `JEST_PUPPETEER_CONFIG` environment variable. It should export a config object or a Promise for a config object. diff --git a/packages/jest-environment-puppeteer/src/PuppeteerEnvironment.js b/packages/jest-environment-puppeteer/src/PuppeteerEnvironment.js index 3ca92eaa..c39c0536 100644 --- a/packages/jest-environment-puppeteer/src/PuppeteerEnvironment.js +++ b/packages/jest-environment-puppeteer/src/PuppeteerEnvironment.js @@ -34,29 +34,6 @@ class PuppeteerEnvironment extends NodeEnvironment { if (!wsEndpoint) { throw new Error('wsEndpoint not found') } - this.global.browser = await puppeteer.connect({ - ...config.connect, - ...config.launch, - browserURL: undefined, - browserWSEndpoint: wsEndpoint, - }) - - if (config.browserContext === 'incognito') { - // Using this, pages will be created in a pristine context. - this.global.context = await this.global.browser.createIncognitoBrowserContext() - } else if (config.browserContext === 'default' || !config.browserContext) { - /** - * Since this is a new browser, browserContexts() will return only one instance - * https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#browserbrowsercontexts - */ - this.global.context = await this.global.browser.browserContexts()[0] - } else { - throw new Error( - `browserContext should be either 'incognito' or 'default'. Received '${ - config.browserContext - }'`, - ) - } this.global.jestPuppeteer = { debug: async () => { @@ -109,9 +86,52 @@ class PuppeteerEnvironment extends NodeEnvironment { this.global.page.addListener('pageerror', handleError) } }, + resetBrowser: async () => { + if (this.global.page) { + this.global.page.removeListener('pageerror', handleError) + } + if (config.browserContext === 'incognito' && this.global.context) { + await this.global.context.close() + } else if (this.global.page) { + await this.global.page.close() + } + this.global.page = null + + if (this.global.browser) { + await this.global.browser.disconnect() + } + + this.global.browser = await puppeteer.connect({ + ...config.connect, + ...config.launch, + browserURL: undefined, + browserWSEndpoint: wsEndpoint, + }) + + if (config.browserContext === 'incognito') { + // Using this, pages will be created in a pristine context. + this.global.context = await this.global.browser.createIncognitoBrowserContext() + } else if ( + config.browserContext === 'default' || + !config.browserContext + ) { + /** + * Since this is a new browser, browserContexts() will return only one instance + * https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#browserbrowsercontexts + */ + this.global.context = await this.global.browser.browserContexts()[0] + } else { + throw new Error( + `browserContext should be either 'incognito' or 'default'. Received '${ + config.browserContext + }'`, + ) + } + await this.global.jestPuppeteer.resetPage() + }, } - await this.global.jestPuppeteer.resetPage() + await this.global.jestPuppeteer.resetBrowser() } async teardown() { diff --git a/packages/jest-environment-puppeteer/tests/resetBrowser.test.js b/packages/jest-environment-puppeteer/tests/resetBrowser.test.js new file mode 100644 index 00000000..2ab21901 --- /dev/null +++ b/packages/jest-environment-puppeteer/tests/resetBrowser.test.js @@ -0,0 +1,9 @@ +describe('resetBrowser', () => { + test('should reset browser', async () => { + const oldBrowser = browser + await jestPuppeteer.resetBrowser() + expect(browser).not.toBe(oldBrowser) + expect(browser.isConnected()).toBe(true) + expect(oldBrowser.isConnected()).toBe(false) + }) +})