fix(connectOverCDP): ensure cleanup when remote ws closes (#9873)
This commit is contained in:
parent
59a406a586
commit
cea61691fa
|
|
@ -25,7 +25,7 @@ import { rewriteErrorMessage } from '../../utils/stackTrace';
|
||||||
import { BrowserType } from '../browserType';
|
import { BrowserType } from '../browserType';
|
||||||
import { ConnectionTransport, ProtocolRequest, WebSocketTransport } from '../transport';
|
import { ConnectionTransport, ProtocolRequest, WebSocketTransport } from '../transport';
|
||||||
import { CRDevTools } from './crDevTools';
|
import { CRDevTools } from './crDevTools';
|
||||||
import { BrowserOptions, BrowserProcess, PlaywrightOptions } from '../browser';
|
import { Browser, BrowserOptions, BrowserProcess, PlaywrightOptions } from '../browser';
|
||||||
import * as types from '../types';
|
import * as types from '../types';
|
||||||
import { debugMode, fetchData, headersArrayToObject, removeFolders, streamToString } from '../../utils/utils';
|
import { debugMode, fetchData, headersArrayToObject, removeFolders, streamToString } from '../../utils/utils';
|
||||||
import { RecentLogsCollector } from '../../utils/debugLogger';
|
import { RecentLogsCollector } from '../../utils/debugLogger';
|
||||||
|
|
@ -36,6 +36,7 @@ import { CallMetadata } from '../instrumentation';
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
import https from 'https';
|
import https from 'https';
|
||||||
import { registry } from '../../utils/registry';
|
import { registry } from '../../utils/registry';
|
||||||
|
import { ManualPromise } from 'playwright-core/lib/utils/async';
|
||||||
|
|
||||||
const ARTIFACTS_FOLDER = path.join(os.tmpdir(), 'playwright-artifacts-');
|
const ARTIFACTS_FOLDER = path.join(os.tmpdir(), 'playwright-artifacts-');
|
||||||
|
|
||||||
|
|
@ -68,10 +69,15 @@ export class Chromium extends BrowserType {
|
||||||
progress.throwIfAborted();
|
progress.throwIfAborted();
|
||||||
|
|
||||||
const chromeTransport = await WebSocketTransport.connect(progress, wsEndpoint, headersMap);
|
const chromeTransport = await WebSocketTransport.connect(progress, wsEndpoint, headersMap);
|
||||||
const doClose = async () => {
|
const cleanedUp = new ManualPromise<void>();
|
||||||
|
const doCleanup = async () => {
|
||||||
await removeFolders([ artifactsDir ]);
|
await removeFolders([ artifactsDir ]);
|
||||||
await chromeTransport.closeAndWait();
|
|
||||||
await onClose?.();
|
await onClose?.();
|
||||||
|
cleanedUp.resolve();
|
||||||
|
};
|
||||||
|
const doClose = async () => {
|
||||||
|
await chromeTransport.closeAndWait();
|
||||||
|
await cleanedUp;
|
||||||
};
|
};
|
||||||
const browserProcess: BrowserProcess = { close: doClose, kill: doClose };
|
const browserProcess: BrowserProcess = { close: doClose, kill: doClose };
|
||||||
const browserOptions: BrowserOptions = {
|
const browserOptions: BrowserOptions = {
|
||||||
|
|
@ -88,7 +94,9 @@ export class Chromium extends BrowserType {
|
||||||
tracesDir: artifactsDir
|
tracesDir: artifactsDir
|
||||||
};
|
};
|
||||||
progress.throwIfAborted();
|
progress.throwIfAborted();
|
||||||
return await CRBrowser.connect(chromeTransport, browserOptions);
|
const browser = await CRBrowser.connect(chromeTransport, browserOptions);
|
||||||
|
browser.on(Browser.Events.Disconnected, doCleanup);
|
||||||
|
return browser;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _createDevTools() {
|
private _createDevTools() {
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
import { contextTest as test, expect } from '../config/browserTest';
|
import { contextTest as test, expect } from '../config/browserTest';
|
||||||
import { playwrightTest } from '../config/browserTest';
|
import { playwrightTest } from '../config/browserTest';
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
|
import fs from 'fs';
|
||||||
import { getUserAgent } from 'playwright-core/lib/utils/utils';
|
import { getUserAgent } from 'playwright-core/lib/utils/utils';
|
||||||
import { suppressCertificateWarning } from '../config/utils';
|
import { suppressCertificateWarning } from '../config/utils';
|
||||||
|
|
||||||
|
|
@ -111,6 +112,27 @@ playwrightTest('should connect to an existing cdp session', async ({ browserType
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
playwrightTest('should cleanup artifacts dir after connectOverCDP disconnects due to ws close', async ({ browserType, toImpl, mode }, testInfo) => {
|
||||||
|
playwrightTest.skip(mode !== 'default');
|
||||||
|
|
||||||
|
const port = 9339 + testInfo.workerIndex;
|
||||||
|
const browserServer = await browserType.launch({
|
||||||
|
args: ['--remote-debugging-port=' + port]
|
||||||
|
});
|
||||||
|
const cdpBrowser = await browserType.connectOverCDP({
|
||||||
|
endpointURL: `http://localhost:${port}/`,
|
||||||
|
});
|
||||||
|
const dir = toImpl(cdpBrowser).options.artifactsDir;
|
||||||
|
const exists1 = fs.existsSync(dir);
|
||||||
|
await Promise.all([
|
||||||
|
new Promise(f => cdpBrowser.on('disconnected', f)),
|
||||||
|
browserServer.close()
|
||||||
|
]);
|
||||||
|
const exists2 = fs.existsSync(dir);
|
||||||
|
expect(exists1).toBe(true);
|
||||||
|
expect(exists2).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
playwrightTest('should connect to an existing cdp session twice', async ({ browserType, server }, testInfo) => {
|
playwrightTest('should connect to an existing cdp session twice', async ({ browserType, server }, testInfo) => {
|
||||||
const port = 9339 + testInfo.workerIndex;
|
const port = 9339 + testInfo.workerIndex;
|
||||||
const browserServer = await browserType.launch({
|
const browserServer = await browserType.launch({
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue