Skip to content

Commit ae01916

Browse files
committed
test: add integration test with crashed renderer tab
Launches Chrome, crashes a tab via chrome://crash, disconnects and reconnects to verify page enumeration skips the dead target.
1 parent 31a1d7c commit ae01916

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

tests/McpContext.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
import assert from 'node:assert';
88
import {afterEach, describe, it} from 'node:test';
99

10+
import logger from 'debug';
11+
import puppeteer, {Locator} from 'puppeteer';
1012
import type {Target} from 'puppeteer-core';
1113
import sinon from 'sinon';
1214

15+
import {McpContext} from '../src/McpContext.js';
1316
import {NetworkFormatter} from '../src/formatters/NetworkFormatter.js';
1417
import type {HTTPResponse} from '../src/third_party/index.js';
1518
import type {TraceResult} from '../src/trace-processing/parse.js';
@@ -234,4 +237,67 @@ describe('McpContext', () => {
234237
assert.ok(pages.length > 0, 'Should still enumerate healthy pages');
235238
});
236239
});
240+
241+
it('should enumerate pages when a tab has a crashed renderer', async () => {
242+
const browser = await puppeteer.launch({
243+
headless: true,
244+
args: ['--remote-debugging-port=0'],
245+
enableExtensions: true,
246+
handleDevToolsAsPage: true,
247+
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
248+
});
249+
250+
try {
251+
const wsEndpoint = browser.wsEndpoint();
252+
253+
const activePage = await browser.newPage();
254+
await activePage.goto('data:text/html,<h1>Active</h1>');
255+
256+
const crashPage = await browser.newPage();
257+
await crashPage.goto('data:text/html,<h1>Will crash</h1>');
258+
try {
259+
await crashPage.goto('chrome://crash');
260+
} catch {}
261+
262+
browser.disconnect();
263+
264+
const reconnected = await puppeteer.connect({
265+
browserWSEndpoint: wsEndpoint,
266+
handleDevToolsAsPage: true,
267+
});
268+
269+
try {
270+
const start = Date.now();
271+
const ctx = await McpContext.from(
272+
reconnected,
273+
logger('test'),
274+
{
275+
experimentalDevToolsDebugging: false,
276+
performanceCrux: false,
277+
},
278+
Locator,
279+
);
280+
const elapsed = Date.now() - start;
281+
282+
assert.ok(
283+
elapsed < 20_000,
284+
`Took ${elapsed}ms, expected < 20s`,
285+
);
286+
const pages = ctx.getPages();
287+
assert.ok(
288+
pages.length >= 1,
289+
`Expected at least 1 page, got ${pages.length}`,
290+
);
291+
292+
ctx.dispose();
293+
} finally {
294+
await reconnected.close();
295+
}
296+
} catch (e) {
297+
if (browser.connected) {
298+
await browser.close();
299+
}
300+
throw e;
301+
}
302+
});
237303
});

0 commit comments

Comments
 (0)