From 9a3e0967e69dc10110e4c4363ca8f7ef20bbbf5c Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Mon, 1 Jul 2024 19:19:38 +0200 Subject: [PATCH] fix(electron): tracing with @playwright/test (#31437) --- packages/playwright/src/index.ts | 2 +- .../playwright-electron-should-work.spec.ts | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/playwright/src/index.ts b/packages/playwright/src/index.ts index a258cbcad5..79184cc135 100644 --- a/packages/playwright/src/index.ts +++ b/packages/playwright/src/index.ts @@ -609,7 +609,7 @@ class ArtifactsRecorder { if ((tracing as any)[this._startedCollectingArtifacts]) return; (tracing as any)[this._startedCollectingArtifacts] = true; - if (this._testInfo._tracing.traceOptions()) + if (this._testInfo._tracing.traceOptions() && (tracing as any)[kTracingStarted]) await tracing.stopChunk({ path: this._testInfo._tracing.generateNextTraceRecordingPath() }); } } diff --git a/tests/installation/playwright-electron-should-work.spec.ts b/tests/installation/playwright-electron-should-work.spec.ts index 4de28e8b54..5c6ced0948 100755 --- a/tests/installation/playwright-electron-should-work.spec.ts +++ b/tests/installation/playwright-electron-should-work.spec.ts @@ -15,6 +15,7 @@ */ import { test } from './npmTest'; import fs from 'fs'; +import { expect } from 'packages/playwright-test'; import path from 'path'; test('electron should work', async ({ exec, tsc, writeFiles }) => { @@ -39,3 +40,46 @@ test('electron should work with special characters in path', async ({ exec, tmpW cwd: path.join(folderName) }); }); + +test('should work when wrapped inside @playwright/test and trace is enabled', async ({ exec, tmpWorkspace, writeFiles }) => { + await exec('npm i -D @playwright/test electron@31'); + await writeFiles({ + 'electron-with-tracing.spec.ts': ` + import { test, expect, _electron } from '@playwright/test'; + + test('should work', async ({ trace }) => { + const electronApp = await _electron.launch({ args: [${JSON.stringify(path.join(__dirname, '../electron/electron-window-app.js'))}] }); + + const window = await electronApp.firstWindow(); + if (trace) + await window.context().tracing.start({ screenshots: true, snapshots: true }); + + await window.goto('data:text/html,Playwright

Playwright

'); + await expect(window).toHaveTitle(/Playwright/); + await expect(window.getByRole('heading')).toHaveText('Playwright'); + + const path = test.info().outputPath('electron-trace.zip'); + if (trace) { + await window.context().tracing.stop({ path }); + test.info().attachments.push({ name: 'trace', path, contentType: 'application/zip' }); + } + await electronApp.close(); + }); + `, + }); + const jsonOutputName = test.info().outputPath('report.json'); + await exec('npx playwright test --trace=on --reporter=json electron-with-tracing.spec.ts', { + env: { PLAYWRIGHT_JSON_OUTPUT_NAME: jsonOutputName } + }); + const traces = [ + // our actual trace. + path.join(tmpWorkspace, 'test-results', 'electron-with-tracing-should-work', 'electron-trace.zip'), + // contains the expect() calls + path.join(tmpWorkspace, 'test-results', 'electron-with-tracing-should-work', 'trace.zip'), + ]; + for (const trace of traces) + expect(fs.existsSync(trace)).toBe(true); + const report = JSON.parse(fs.readFileSync(jsonOutputName, 'utf-8')); + expect(new Set(['trace'])).toEqual(new Set(report.suites[0].specs[0].tests[0].results[0].attachments.map(a => a.name))); + expect(new Set(traces.map(p => fs.realpathSync(p)))).toEqual(new Set(report.suites[0].specs[0].tests[0].results[0].attachments.map(a => a.path))); +});