Skip to content

Commit fa03e2b

Browse files
authored
fix(cli): persist traces when CLI attaches to existing CDP browser (microsoft#40810)
1 parent 9416959 commit fa03e2b

13 files changed

Lines changed: 96 additions & 10 deletions

File tree

docs/src/api/class-browsertype.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,12 @@ emulation is not enabled, and media emulation options (such as [`option: Browser
236236
browser where these overrides would interfere with existing browser state. New contexts created via
237237
[`method: Browser.newContext`] are not affected. Defaults to `false`.
238238

239+
### option: BrowserType.connectOverCDP.artifactsDir
240+
* since: v1.61
241+
- `artifactsDir` <[path]>
242+
243+
If specified, browser artifacts (such as traces and downloads) are saved into this directory.
244+
239245

240246
## method: BrowserType.executablePath
241247
* since: v1.8

packages/playwright-client/types/types.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23531,6 +23531,11 @@ export interface LaunchOptions {
2353123531
}
2353223532

2353323533
export interface ConnectOverCDPOptions {
23534+
/**
23535+
* If specified, browser artifacts (such as traces and downloads) are saved into this directory.
23536+
*/
23537+
artifactsDir?: string;
23538+
2353423539
/**
2353523540
* @deprecated Use the first argument instead.
2353623541
*/

packages/playwright-core/src/client/browserType.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ export class BrowserType extends ChannelOwner<channels.BrowserTypeChannel> imple
157157
timeout: new TimeoutSettings(this._platform).timeout(params),
158158
isLocal: params.isLocal,
159159
noDefaults: params.noDefaults,
160+
artifactsDir: params.artifactsDir,
160161
});
161162
const browser = Browser.from(result.browser);
162163
browser._connectToBrowserType(this, {}, undefined);

packages/playwright-core/src/protocol/validator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,6 +1059,7 @@ scheme.BrowserTypeConnectOverCDPParams = tObject({
10591059
timeout: tFloat,
10601060
isLocal: tOptional(tBoolean),
10611061
noDefaults: tOptional(tBoolean),
1062+
artifactsDir: tOptional(tString),
10621063
});
10631064
scheme.BrowserTypeConnectOverCDPResult = tObject({
10641065
browser: tChannel(['Browser']),

packages/playwright-core/src/server/browserType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ export abstract class BrowserType extends SdkObject {
286286
}
287287
}
288288

289-
async connectOverCDP(progress: Progress, endpointURL: string, options: { slowMo?: number, timeout?: number, headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean }): Promise<Browser> {
289+
async connectOverCDP(progress: Progress, endpointURL: string, options: { slowMo?: number, timeout?: number, headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean, artifactsDir?: string }): Promise<Browser> {
290290
throw new Error('CDP connections are only supported by Chromium');
291291
}
292292

packages/playwright-core/src/server/chromium/chromium.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ export class Chromium extends BrowserType {
8181
return super.launchPersistentContext(progress, userDataDir, options);
8282
}
8383

84-
override async connectOverCDP(progress: Progress, endpointURL: string, options: { slowMo?: number, headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean }) {
84+
override async connectOverCDP(progress: Progress, endpointURL: string, options: { slowMo?: number, headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean, artifactsDir?: string }) {
8585
return await this._connectOverCDPInternal(progress, endpointURL, options);
8686
}
8787

88-
async _connectOverCDPInternal(progress: Progress, endpointURL: string, options: types.LaunchOptions & { headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean }, onClose?: () => Promise<void>) {
88+
async _connectOverCDPInternal(progress: Progress, endpointURL: string, options: types.LaunchOptions & { headers?: types.HeadersArray, isLocal?: boolean, noDefaults?: boolean, artifactsDir?: string }, onClose?: () => Promise<void>) {
8989
let headersMap: { [key: string]: string; } | undefined;
9090
if (options.headers)
9191
headersMap = headersArrayToObject(options.headers, false);
@@ -113,10 +113,17 @@ export class Chromium extends BrowserType {
113113
return this._connectOverCDPImpl(progress, chromeTransport, closeAndWait, options, onClose);
114114
}
115115

116-
private async _connectOverCDPImpl(progress: Progress, transport: ConnectionTransport, closeAndWait: () => Promise<void>, options: types.LaunchOptions & { isLocal?: boolean, noDefaults?: boolean }, onClose?: () => Promise<void>) {
117-
const artifactsDir = await progress.race(fs.promises.mkdtemp(ARTIFACTS_FOLDER));
116+
private async _connectOverCDPImpl(progress: Progress, transport: ConnectionTransport, closeAndWait: () => Promise<void>, options: types.LaunchOptions & { isLocal?: boolean, noDefaults?: boolean, artifactsDir?: string }, onClose?: () => Promise<void>) {
117+
let artifactsDir: string;
118+
const tempDirectories: string[] = [];
119+
if (options.artifactsDir) {
120+
artifactsDir = options.artifactsDir;
121+
} else {
122+
artifactsDir = await progress.race(fs.promises.mkdtemp(ARTIFACTS_FOLDER));
123+
tempDirectories.push(artifactsDir);
124+
}
118125
const doCleanup = async () => {
119-
await removeFolders([artifactsDir]);
126+
await removeFolders(tempDirectories);
120127
const cb = onClose;
121128
onClose = undefined; // Make sure to only call onClose once.
122129
await cb?.();

packages/playwright-core/src/tools/mcp/browserFactory.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export async function createBrowserWithInfo(config: FullConfig, clientInfo: Clie
5151
let canBind = false;
5252
let ownership: 'attached' | 'own' = 'own';
5353
if (config.browser.cdpEndpoint) {
54-
browser = await createCDPBrowser(config);
54+
browser = await createCDPBrowser(config, clientInfo);
5555
canBind = true;
5656
ownership = 'attached';
5757
} else if (config.browser.isolated) {
@@ -103,11 +103,13 @@ async function createIsolatedBrowser(config: FullConfig, clientInfo: ClientInfo)
103103
return browser;
104104
}
105105

106-
async function createCDPBrowser(config: FullConfig): Promise<playwrightTypes.Browser> {
106+
async function createCDPBrowser(config: FullConfig, clientInfo: ClientInfo): Promise<playwrightTypes.Browser> {
107107
testDebug('create browser (cdp)');
108+
const artifactsDir = await computeTracesDir(config, clientInfo);
108109
const browser = await playwright.chromium.connectOverCDP(config.browser.cdpEndpoint!, {
109110
headers: config.browser.cdpHeaders,
110-
timeout: config.browser.cdpTimeout
111+
timeout: config.browser.cdpTimeout,
112+
artifactsDir,
111113
});
112114
return browser;
113115
}

packages/playwright-core/types/types.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23531,6 +23531,11 @@ export interface LaunchOptions {
2353123531
}
2353223532

2353323533
export interface ConnectOverCDPOptions {
23534+
/**
23535+
* If specified, browser artifacts (such as traces and downloads) are saved into this directory.
23536+
*/
23537+
artifactsDir?: string;
23538+
2353423539
/**
2353523540
* @deprecated Use the first argument instead.
2353623541
*/

packages/protocol/spec/browserType.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ BrowserType:
5151
timeout: float
5252
isLocal: boolean?
5353
noDefaults: boolean?
54+
artifactsDir: string?
5455
returns:
5556
browser: Browser
5657
defaultContext: BrowserContext?

packages/protocol/src/channels.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2005,12 +2005,14 @@ export type BrowserTypeConnectOverCDPParams = {
20052005
timeout: number,
20062006
isLocal?: boolean,
20072007
noDefaults?: boolean,
2008+
artifactsDir?: string,
20082009
};
20092010
export type BrowserTypeConnectOverCDPOptions = {
20102011
headers?: NameValue[],
20112012
slowMo?: number,
20122013
isLocal?: boolean,
20132014
noDefaults?: boolean,
2015+
artifactsDir?: string,
20142016
};
20152017
export type BrowserTypeConnectOverCDPResult = {
20162018
browser: BrowserChannel,

0 commit comments

Comments
 (0)