From c7a28ac7e9eab63b40ce22fe96597410dbd08ed7 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 10 Jun 2022 14:11:34 -0700 Subject: [PATCH] fix(test runner): collect artifacts when calling `browser.close()` (#14797) Previously, we only collected artifacts on context closure. However, in serial mode it is possible to close the browser instead. --- .../playwright-core/src/client/browser.ts | 2 ++ .../playwright-test/playwright.trace.spec.ts | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/packages/playwright-core/src/client/browser.ts b/packages/playwright-core/src/client/browser.ts index 077f8c1902..0c5599e660 100644 --- a/packages/playwright-core/src/client/browser.ts +++ b/packages/playwright-core/src/client/browser.ts @@ -104,6 +104,8 @@ export class Browser extends ChannelOwner implements ap async close(): Promise { try { + for (const context of this.contexts()) + await this._browserType?._onWillCloseContext?.(context); if (this._shouldCloseConnectionOnClose) this._connection.close(kBrowserClosedError); else diff --git a/tests/playwright-test/playwright.trace.spec.ts b/tests/playwright-test/playwright.trace.spec.ts index adcc69deb3..27a713a63d 100644 --- a/tests/playwright-test/playwright.trace.spec.ts +++ b/tests/playwright-test/playwright.trace.spec.ts @@ -241,6 +241,27 @@ test('should not override trace file in afterAll', async ({ runInlineTest, serve expect(fs.existsSync(testInfo.outputPath('test-results', 'a-test-1', 'trace-1.zip'))).toBeTruthy(); }); +test('should record trace on manual browser closure', async ({ runInlineTest }, testInfo) => { + const result = await runInlineTest({ + 'a.spec.ts': ` + const { test } = pwt; + + test.use({ trace: 'on' }); + + test.afterAll(async ({ browser }) => { + await browser.close(); + }); + + test('test 1', async ({ page }) => { + await page.goto('about:blank'); + }); + `, + }, { workers: 1 }); + + expect(result.exitCode).toBe(0); + expect(result.passed).toBe(1); + expect(fs.existsSync(testInfo.outputPath('test-results', 'a-test-1', 'trace.zip'))).toBeTruthy(); +}); async function parseTrace(file: string): Promise> { const zipFS = new ZipFileSystem(file);