Skip to content

Commit c00cf45

Browse files
chore: create a test helper for launching browser (#10152)
1 parent e313b05 commit c00cf45

File tree

3 files changed

+73
-9
lines changed

3 files changed

+73
-9
lines changed

test/.eslintrc.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,20 @@ module.exports = {
1010
},
1111
],
1212
},
13+
overrides: [
14+
{
15+
files: ['*.spec.ts'],
16+
rules: {
17+
'no-restricted-syntax': [
18+
'warn',
19+
{
20+
message:
21+
'Use helper command `launch` to make sure the browsers get cleaned',
22+
selector:
23+
'MemberExpression[object.name="puppeteer"][property.name="launch"]',
24+
},
25+
],
26+
},
27+
},
28+
],
1329
};

test/src/mocha-utils.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,10 @@ export const mochaHooks = {
242242
],
243243

244244
afterEach: (): void => {
245+
if (browserCleanups.length > 0) {
246+
throw new Error('A manually launched browser was not closed!');
247+
}
248+
245249
sinon.restore();
246250
},
247251
};
@@ -328,3 +332,53 @@ export const createTimeout = <T>(
328332
}, n);
329333
});
330334
};
335+
336+
const browserCleanups: Array<() => Promise<void>> = [];
337+
338+
export const launch = async (
339+
options: PuppeteerLaunchOptions
340+
): Promise<
341+
PuppeteerTestState & {
342+
close: () => Promise<void>;
343+
}
344+
> => {
345+
const close = async () => {
346+
let cleanup = browserCleanups.pop();
347+
while (cleanup) {
348+
await cleanup();
349+
cleanup = browserCleanups.pop();
350+
}
351+
};
352+
353+
try {
354+
const browser = await puppeteer.launch({
355+
...defaultBrowserOptions,
356+
...options,
357+
});
358+
browserCleanups.push(async () => {
359+
browser.close();
360+
});
361+
362+
const context = await browser.createIncognitoBrowserContext();
363+
browserCleanups.push(async () => {
364+
context.close();
365+
});
366+
367+
const page = await context.newPage();
368+
browserCleanups.push(async () => {
369+
page.close();
370+
});
371+
372+
return {
373+
...getTestState(),
374+
browser,
375+
context,
376+
page,
377+
close,
378+
};
379+
} catch (error) {
380+
await close();
381+
382+
throw error;
383+
}
384+
};

test/src/network.spec.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {HTTPResponse} from 'puppeteer-core/internal/api/HTTPResponse.js';
2424

2525
import {
2626
getTestState,
27+
launch,
2728
setupTestBrowserHooks,
2829
setupTestPageAndContextHooks,
2930
} from './mocha-utils.js';
@@ -823,15 +824,9 @@ describe('network', function () {
823824
});
824825

825826
it('Cross-origin set-cookie', async () => {
826-
const {httpsServer, puppeteer, defaultBrowserOptions} = getTestState();
827-
828-
const browser = await puppeteer.launch({
829-
...defaultBrowserOptions,
827+
const {page, httpsServer, close} = await launch({
830828
ignoreHTTPSErrors: true,
831829
});
832-
833-
const page = await browser.newPage();
834-
835830
try {
836831
await page.goto(httpsServer.PREFIX + '/empty.html');
837832

@@ -855,8 +850,7 @@ describe('network', function () {
855850
]);
856851
expect(response.headers()['set-cookie']).toBe(setCookieString);
857852
} finally {
858-
await page.close();
859-
await browser.close();
853+
await close();
860854
}
861855
});
862856
});

0 commit comments

Comments
 (0)