From 30ccfb816d415a8bee17b61f8a83429eaf34a4f2 Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Tue, 7 May 2019 16:07:08 -0500 Subject: [PATCH 1/4] feat: resetBrowser --- .../src/PuppeteerEnvironment.js | 68 ++++++++++++------- .../tests/resetBrowser.test.js | 11 +++ 2 files changed, 55 insertions(+), 24 deletions(-) create mode 100644 packages/jest-environment-puppeteer/tests/resetBrowser.test.js 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..0da41af0 --- /dev/null +++ b/packages/jest-environment-puppeteer/tests/resetBrowser.test.js @@ -0,0 +1,11 @@ +describe('resetBrowser', () => { + test('should reset browser', async () => { + const oldBrowser = browser + await jestPuppeteer.resetBrowser() + expect(browser).not.toBe(oldBrowser) + // eslint-disable-next-line no-underscore-dangle + expect(browser._connection._closed).toBe(false) + // eslint-disable-next-line no-underscore-dangle + expect(oldBrowser._connection._closed).toBe(true) + }) +}) From c89b2ddb0805c9289008fd841ca30d3e8ca97483 Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Tue, 14 May 2019 14:46:54 -0500 Subject: [PATCH 2/4] update puppeteer to v1.16.0 --- .../jest-environment-puppeteer/tests/resetBrowser.test.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/jest-environment-puppeteer/tests/resetBrowser.test.js b/packages/jest-environment-puppeteer/tests/resetBrowser.test.js index 0da41af0..2ab21901 100644 --- a/packages/jest-environment-puppeteer/tests/resetBrowser.test.js +++ b/packages/jest-environment-puppeteer/tests/resetBrowser.test.js @@ -3,9 +3,7 @@ describe('resetBrowser', () => { const oldBrowser = browser await jestPuppeteer.resetBrowser() expect(browser).not.toBe(oldBrowser) - // eslint-disable-next-line no-underscore-dangle - expect(browser._connection._closed).toBe(false) - // eslint-disable-next-line no-underscore-dangle - expect(oldBrowser._connection._closed).toBe(true) + expect(browser.isConnected()).toBe(true) + expect(oldBrowser.isConnected()).toBe(false) }) }) From 6a19ae3164f3c25ce81d923f5514cc7107aef306 Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Tue, 14 May 2019 15:00:20 -0500 Subject: [PATCH 3/4] update readme --- README.md | 20 +++++++++++++++++++ packages/jest-environment-puppeteer/README.md | 10 ++++++++++ 2 files changed, 30 insertions(+) diff --git a/README.md b/README.md index 041296a0..5424ab48 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, gllobal.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..5f9680e9 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, gllobal.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. From e6fc1cb26524dca257b1324a679019832753fece Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Mon, 17 Jun 2019 17:49:27 -0500 Subject: [PATCH 4/4] fix spelling --- README.md | 2 +- packages/jest-environment-puppeteer/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5424ab48..6215d648 100644 --- a/README.md +++ b/README.md @@ -333,7 +333,7 @@ beforeEach(async () => { ### `global.jestPuppeteer.resetBrowser()` -Reset global.browser, gllobal.context, and global.page +Reset global.browser, global.context, and global.page ```js beforeEach(async () => { diff --git a/packages/jest-environment-puppeteer/README.md b/packages/jest-environment-puppeteer/README.md index 5f9680e9..d0bb0108 100644 --- a/packages/jest-environment-puppeteer/README.md +++ b/packages/jest-environment-puppeteer/README.md @@ -89,7 +89,7 @@ beforeEach(async () => { ### `global.jestPuppeteer.resetBrowser()` -Reset global.browser, gllobal.context, and global.page +Reset global.browser, global.context, and global.page ```js beforeEach(async () => {