From 998e566b31728be4edb79e106fa30e53ae282b57 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 6 Aug 2026 16:03:24 +0200 Subject: [PATCH] fix(cli): hide Windows daemon consoles Hide detached CLI and dashboard daemon windows, and prevent taskkill from flashing a console while replacing or closing sessions. Browser process launches remain unchanged so headed mode, Inspector, and UI mode stay visible.\n\nFixes: https://github.com/microsoft/playwright/issues/42152\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 37896276-261f-4ff0-9664-06aa7dfc471b --- packages/playwright-core/src/tools/backend/devtools.ts | 2 +- packages/playwright-core/src/tools/cli-client/program.ts | 1 + packages/playwright-core/src/tools/cli-client/session.ts | 1 + packages/utils/processLauncher.ts | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/tools/backend/devtools.ts b/packages/playwright-core/src/tools/backend/devtools.ts index 56fe53258ef88..ee35a90b20ddb 100644 --- a/packages/playwright-core/src/tools/backend/devtools.ts +++ b/packages/playwright-core/src/tools/backend/devtools.ts @@ -135,7 +135,7 @@ const annotate = defineTabTool({ const daemonArgs = [daemonScript, `--pageId=${pageId}`]; // Spawn the dashboard daemon (idempotent — the singleton socket guards against duplicates). - const daemon = spawn(process.execPath, daemonArgs, { detached: true, stdio: 'ignore' }); + const daemon = spawn(process.execPath, daemonArgs, { detached: true, stdio: 'ignore', windowsHide: true }); daemon.unref(); // Spawn the annotate client in JSON mode to capture the raw payload over stdout. diff --git a/packages/playwright-core/src/tools/cli-client/program.ts b/packages/playwright-core/src/tools/cli-client/program.ts index ef0e82a34fb8b..3ac0efd0417f4 100644 --- a/packages/playwright-core/src/tools/cli-client/program.ts +++ b/packages/playwright-core/src/tools/cli-client/program.ts @@ -248,6 +248,7 @@ export async function program(options?: { embedderVersion?: string}) { const child = spawn(process.execPath, daemonArgs, { detached: !foreground, stdio: foreground ? 'inherit' : ['pipe', 'pipe', 'ignore'], + windowsHide: true, }); if (foreground) { await new Promise(resolve => child.on('exit', () => resolve())); diff --git a/packages/playwright-core/src/tools/cli-client/session.ts b/packages/playwright-core/src/tools/cli-client/session.ts index 2db6a105e222b..290d8cbff8c14 100644 --- a/packages/playwright-core/src/tools/cli-client/session.ts +++ b/packages/playwright-core/src/tools/cli-client/session.ts @@ -148,6 +148,7 @@ export class Session { detached: true, stdio: ['ignore', 'pipe', err], cwd: process.cwd(), // Will be used as root. + windowsHide: true, }); let signalled = false; diff --git a/packages/utils/processLauncher.ts b/packages/utils/processLauncher.ts index 9c77c7a0ce3ad..f865dda5aae60 100644 --- a/packages/utils/processLauncher.ts +++ b/packages/utils/processLauncher.ts @@ -233,7 +233,7 @@ export async function launchProcess(options: LaunchProcessOptions): Promise