diff --git a/packages/playwright-core/src/server/index.ts b/packages/playwright-core/src/server/index.ts index 3f127cb9158a9..c15944f0ae208 100644 --- a/packages/playwright-core/src/server/index.ts +++ b/packages/playwright-core/src/server/index.ts @@ -28,4 +28,4 @@ export { createPlaywright } from './playwright'; export type { DispatcherScope } from './dispatchers/dispatcher'; export type { Playwright } from './playwright'; -export { installRootRedirect, openTraceInBrowser, openTraceViewerApp, startTraceViewerServer } from './trace/viewer/traceViewer'; +export { installRootRedirect, openTraceInBrowser, openTraceViewerApp, runTraceViewerApp, startTraceViewerServer } from './trace/viewer/traceViewer'; diff --git a/tests/config/traceViewerFixtures.ts b/tests/config/traceViewerFixtures.ts index 38bde5972cb4f..1da0058fc4182 100644 --- a/tests/config/traceViewerFixtures.ts +++ b/tests/config/traceViewerFixtures.ts @@ -16,10 +16,9 @@ import type { Fixtures, FrameLocator, Locator, Page, Browser, BrowserContext } from '@playwright/test'; import { step } from './baseTest'; -import path from 'path'; -import { CommonFixtures, TestChildProcess } from './commonFixtures'; +import { runTraceViewerApp } from '../../packages/playwright-core/lib/server'; -type BaseTestFixtures = CommonFixtures & { +type BaseTestFixtures = { context: BrowserContext; }; @@ -31,7 +30,7 @@ type BaseWorkerFixtures = { }; export type TraceViewerFixtures = { - showTraceViewer: (trace: string | undefined, options?: {host?: string, port?: number, stdin?: boolean}) => Promise; + showTraceViewer: (trace: string | undefined, options?: {host?: string, port?: number}) => Promise; runAndTrace: (body: () => Promise, optsOverrides?: Parameters[0]) => Promise; }; @@ -54,7 +53,7 @@ class TraceViewerPage { themeSetting: Locator; displayCanvasContentSetting: Locator; - constructor(public page: Page, public process: TestChildProcess) { + constructor(public page: Page) { this.actionTitles = page.locator('.action-title'); this.actionsTree = page.getByTestId('actions-tree'); this.callLines = page.locator('.call-tab .call-line'); @@ -153,32 +152,21 @@ class TraceViewerPage { } export const traceViewerFixtures: Fixtures = { - showTraceViewer: async ({ playwright, childProcess }, use) => { + showTraceViewer: async ({ playwright, browserName, headless }, use, testInfo) => { const browsers: Browser[] = []; - await use(async (trace: string | undefined, { host, port, stdin } = {}) => { - const command = [ - 'node', - path.join(__dirname, '../../packages/playwright-core/cli.js'), - 'show-trace', - '--port', '' + (port ?? '0'), - ]; - if (host) - command.push('--host', host); - if (stdin) - command.push('--stdin'); - if (trace) - command.push(trace); - const cp = childProcess({ command }); - await cp.waitForOutput('Listening on'); - const browser = await playwright.chromium.launch(); + const contextImpls: any[] = []; + await use(async (trace: string | undefined, { host, port } = {}) => { + const pageImpl = await runTraceViewerApp(trace, browserName, { headless, host, port }); + const contextImpl = pageImpl.browserContext; + const browser = await playwright.chromium.connectOverCDP(contextImpl._browser.options.wsEndpoint); browsers.push(browser); - const page = await browser.newPage(); - const url = cp.output.match(/Listening on (http:\/\/[^\s]+)/)![1]; - await page.goto(url); - return new TraceViewerPage(page, cp); + contextImpls.push(contextImpl); + return new TraceViewerPage(browser.contexts()[0].pages()[0]); }); for (const browser of browsers) await browser.close(); + for (const contextImpl of contextImpls) + await contextImpl._browser.close({ reason: 'Trace viewer closed' }); }, runAndTrace: async ({ context, showTraceViewer }, use, testInfo) => { diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index fdb1b0aff3925..706197fb0e1d6 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -32,7 +32,6 @@ const test = playwrightTest.extend(traceViewerFixtures); test.skip(({ trace }) => trace === 'on'); test.skip(({ mode }) => mode.startsWith('service')); -test.skip(process.env.PW_CLOCK === 'frozen'); test.slow(); let traceFile: string; @@ -2250,11 +2249,15 @@ test('should capture iframe with srcdoc', async ({ page, server, runAndTrace }) await expect(frame.frameLocator('iframe').getByRole('button')).toHaveText('Hello iframe'); }); -test('take trace paths via stdin', async ({ showTraceViewer }) => { - const traceViewer = await showTraceViewer(undefined, { stdin: true }); - await expect(traceViewer.page).toHaveTitle('Playwright Trace Viewer'); - traceViewer.process.write(traceFile); - await expect(traceViewer.actionTitles).toContainText([ +test('take trace paths via stdin', async ({ childProcess, page }) => { + const cliEntrypoint = path.join(__dirname, '../../packages/playwright-core/cli.js'); + const cp = childProcess({ command: ['node', cliEntrypoint, 'show-trace', '--port', '0', '--stdin'] }); + await cp.waitForOutput('Listening on'); + const url = cp.output.match(/Listening on (http:\/\/[^\s]+)/)![1]; + await page.goto(url); + await expect(page).toHaveTitle('Playwright Trace Viewer'); + cp.write(traceFile); + await expect(page.locator('.action-title')).toContainText([ /Create page/, ]); });