diff --git a/packages/playwright-core/src/cli/driver.ts b/packages/playwright-core/src/cli/driver.ts index 830f1f18ea..0007d1f72a 100644 --- a/packages/playwright-core/src/cli/driver.ts +++ b/packages/playwright-core/src/cli/driver.ts @@ -39,14 +39,10 @@ export function runDriver() { const transport = process.send ? new IpcTransport(process) : new PipeTransport(process.stdout, process.stdin); transport.onmessage = message => dispatcherConnection.dispatch(JSON.parse(message)); dispatcherConnection.onmessage = message => transport.send(JSON.stringify(message)); - transport.onclose = async () => { + transport.onclose = () => { // Drop any messages during shutdown on the floor. dispatcherConnection.onmessage = () => {}; - // Force exit after 30 seconds. - setTimeout(() => process.exit(0), 30000); - // Meanwhile, try to gracefully close all browsers. - await gracefullyCloseAll(); - process.exit(0); + selfDestruct(); }; } @@ -55,6 +51,11 @@ export async function runServer(port: number | undefined, path = '/', maxClients const wsEndpoint = await server.listen(port); process.on('exit', () => server.close().catch(console.error)); console.log('Listening on ' + wsEndpoint); // eslint-disable-line no-console + process.stdin.on('close', () => selfDestruct()); + process.stdin.on('data', data => { + if (data.toString() === '') + selfDestruct(); + }); } export async function launchBrowserServer(browserName: string, configFile?: string) { @@ -65,3 +66,12 @@ export async function launchBrowserServer(browserName: string, configFile?: stri const server = await browserType.launchServer(options); console.log(server.wsEndpoint()); } + +function selfDestruct() { + // Force exit after 30 seconds. + setTimeout(() => process.exit(0), 30000); + // Meanwhile, try to gracefully close all browsers. + gracefullyCloseAll().then(() => { + process.exit(0); + }); +} diff --git a/packages/playwright-core/src/remote/playwrightServer.ts b/packages/playwright-core/src/remote/playwrightServer.ts index 8ab507db30..01ca641aaa 100644 --- a/packages/playwright-core/src/remote/playwrightServer.ts +++ b/packages/playwright-core/src/remote/playwrightServer.ts @@ -22,6 +22,7 @@ import type { Playwright } from '../server/playwright'; import { createPlaywright } from '../server/playwright'; import { PlaywrightConnection } from './playwrightConnection'; import { assert } from '../utils'; +import { serverSideCallMetadata } from '../server/instrumentation'; const debugLog = debug('pw:server'); @@ -61,6 +62,27 @@ export class PlaywrightServer { } async listen(port: number = 0): Promise { + if (this._mode === 'reuse-browser') { + const callMetadata = serverSideCallMetadata(); + const browser = await this._preLaunchedPlaywright!.chromium.launch(callMetadata, { headless: false }); + const { context } = await browser.newContextForReuse({ viewport: { width: 800, height: 600 } }, callMetadata); + const page = await context.newPage(callMetadata); + await page.mainFrame().setContent(callMetadata, ` + +
Playwright will use this page to run tests
`); + } + const server = http.createServer((request, response) => { response.end('Running'); });