refactor: clean up more of the context interface (#2335)

- removed redundant page getters
This commit is contained in:
Alex Rudenko
2026-07-09 15:50:48 +02:00
committed by GitHub
parent 16db01f79c
commit 9cd734b0a3
20 changed files with 177 additions and 192 deletions
+14 -29
View File
@@ -390,7 +390,7 @@ export class McpContext implements Context {
async restoreEmulation(page: McpPage) {
const currentSetting = page.emulationSettings;
await this.emulate(currentSetting, page.pptrPage);
await this.emulate(currentSetting, page);
}
get #hasNetworkBlockOrAllowlist(): boolean {
@@ -407,10 +407,10 @@ export class McpContext implements Context {
viewport?: Viewport;
extraHttpHeaders?: Record<string, string> | undefined;
},
targetPage?: Page,
targetMcpPage?: McpPage,
): Promise<void> {
const page = targetPage ?? this.getSelectedPptrPage();
const mcpPage = this.#getMcpPage(page);
const mcpPage = targetMcpPage ?? this.getSelectedMcpPage();
const page = mcpPage.pptrPage;
const newSettings: EmulationSettings = {...mcpPage.emulationSettings};
// Skip network emulation if blocklist/allowlist is configured, as it conflicts with blocking rules in Puppeteer.
@@ -540,7 +540,7 @@ export class McpContext implements Context {
return this.#options.performanceCrux;
}
getSelectedPptrPage(): Page {
getSelectedMcpPage(): McpPage {
const page = this.#selectedPage;
if (!page) {
throw new Error('No page selected');
@@ -550,12 +550,7 @@ export class McpContext implements Context {
`The selected page has been closed. Call ${listPages().name} to see open pages.`,
);
}
return page.pptrPage;
}
getSelectedMcpPage(): McpPage {
const page = this.getSelectedPptrPage();
return this.#getMcpPage(page);
return page;
}
getPageById(pageId: number): McpPage {
@@ -568,20 +563,8 @@ export class McpContext implements Context {
return page;
}
#getMcpPage(page: Page): McpPage {
const mcpPage = this.#mcpPages.get(page);
if (!mcpPage) {
throw new Error('No McpPage found for the given page.');
}
return mcpPage;
}
#getSelectedMcpPage(): McpPage {
return this.#getMcpPage(this.getSelectedPptrPage());
}
isPageSelected(page: Page): boolean {
return this.#selectedPage?.pptrPage === page;
isPageSelected(page: McpPage): boolean {
return this.#selectedPage === page;
}
selectPage(newPage: McpPage): void {
@@ -600,7 +583,7 @@ export class McpContext implements Context {
}
#updateSelectedPageTimeouts() {
const page = this.#getSelectedMcpPage();
const page = this.getSelectedMcpPage();
// For waiters 5sec timeout should be sufficient.
// Increased in case we throttle the CPU
const cpuMultiplier = page.cpuThrottlingRate;
@@ -891,9 +874,11 @@ export class McpContext implements Context {
waitForTextOnPage(
text: string[],
timeout?: number,
targetPage?: Page,
mcpPage?: McpPage,
): Promise<Element> {
const page = targetPage ?? this.getSelectedPptrPage();
const page = mcpPage
? mcpPage.pptrPage
: this.getSelectedMcpPage().pptrPage;
const frames = page.frames();
let locator = this.#locatorClass.race(
@@ -949,7 +934,7 @@ export class McpContext implements Context {
if (!extension) {
throw new Error(`Extension with ID ${id} not found.`);
}
const page = this.getSelectedPptrPage();
const page = this.getSelectedMcpPage().pptrPage;
await extension.triggerAction(page);
}
+3 -3
View File
@@ -1033,7 +1033,7 @@ Call ${handleDialog.name} to handle it before continuing.`);
? `${truncateTitle(title)} (${mcpPage.pptrPage.url()})`
: mcpPage.pptrPage.url();
parts.push(
`${mcpPage.id}: ${pageLabel}${context.isPageSelected(mcpPage.pptrPage) ? ' [selected]' : ''}${contextLabel}`,
`${mcpPage.id}: ${pageLabel}${context.isPageSelected(mcpPage) ? ' [selected]' : ''}${contextLabel}`,
);
structuredPages.push(createStructuredPage(mcpPage, context, title));
}
@@ -1055,7 +1055,7 @@ Call ${handleDialog.name} to handle it before continuing.`);
? `${truncateTitle(title)} (${mcpPage.pptrPage.url()})`
: mcpPage.pptrPage.url();
response.push(
`${mcpPage.id}: ${pageLabel}${context.isPageSelected(mcpPage.pptrPage) ? ' [selected]' : ''}${contextLabel}`,
`${mcpPage.id}: ${pageLabel}${context.isPageSelected(mcpPage) ? ' [selected]' : ''}${contextLabel}`,
);
structuredExtensionPages.push(
createStructuredPage(mcpPage, context, title),
@@ -1515,7 +1515,7 @@ function createStructuredPage(
id: mcpPage.id,
url: mcpPage.pptrPage.url(),
title,
selected: context.isPageSelected(mcpPage.pptrPage),
selected: context.isPageSelected(mcpPage),
};
if (isolatedContextName) {
entry.isolatedContext = isolatedContextName;
+2 -2
View File
@@ -215,7 +215,7 @@ export type Context = Readonly<{
colorScheme?: 'dark' | 'light' | 'auto';
viewport?: Viewport;
},
targetPage?: Page,
mcpPage?: ContextPage,
): Promise<void>;
saveTemporaryFile(
data: Uint8Array<ArrayBufferLike>,
@@ -229,7 +229,7 @@ export type Context = Readonly<{
waitForTextOnPage(
text: string[],
timeout?: number,
page?: Page,
mcpPage?: ContextPage,
): Promise<Element>;
/**
* Returns a reqid for a cdpRequestId.
+1 -1
View File
@@ -103,7 +103,7 @@ export const emulate = definePageTool({
verifyFilesSchema: [],
handler: async (request, response, context) => {
const page = request.page;
await context.emulate(request.params, page.pptrPage);
await context.emulate(request.params, page);
response.appendResponseLine('Emulation configured successfully');
},
});
+1 -1
View File
@@ -66,7 +66,7 @@ export const waitFor = definePageTool({
await context.waitForTextOnPage(
request.params.text,
request.params.timeout,
page.pptrPage,
page,
);
response.appendResponseLine(
+4 -4
View File
@@ -138,14 +138,14 @@ describe('McpContext', () => {
it('reports the fallback when the selected page is closed', async () => {
await withMcpContext(async (_response, context) => {
const page = await context.newPage();
assert.ok(context.isPageSelected(page.pptrPage));
assert.ok(context.isPageSelected(page));
await page.pptrPage.close();
await context.createPagesSnapshot();
const [firstPage] = context.getPages();
assert.ok(firstPage);
assert.ok(context.isPageSelected(firstPage.pptrPage));
assert.ok(context.isPageSelected(firstPage));
const fallback = context.getSelectedPageFallback();
assert.ok(fallback, 'fallback should be reported');
@@ -178,7 +178,7 @@ describe('McpContext', () => {
it('keeps a still-open selected page that is missing from the list', async () => {
await withMcpContext(async (_response, context) => {
const page = await context.newPage();
assert.ok(context.isPageSelected(page.pptrPage));
assert.ok(context.isPageSelected(page));
// A live page that is temporarily missing from the pages list must keep
// its selection — only a genuinely closed page is replaced.
@@ -193,7 +193,7 @@ describe('McpContext', () => {
}
assert.ok(
context.isPageSelected(page.pptrPage),
context.isPageSelected(page),
'a still-open page should keep its selection',
);
assert.strictEqual(context.getSelectedPageFallback(), undefined);
+8 -8
View File
@@ -81,7 +81,7 @@ describe('McpResponse', () => {
it('does not include anything in response if snapshot is null', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
page.accessibility.snapshot = async () => null;
const {content, structuredContent} = await response.handle(
'test',
@@ -96,7 +96,7 @@ describe('McpResponse', () => {
it('returns correctly formatted snapshot for a simple tree', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button>Click me</button>
<input
@@ -119,7 +119,7 @@ describe('McpResponse', () => {
it('returns values for textboxes', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<label
>username<input
@@ -143,7 +143,7 @@ describe('McpResponse', () => {
it('returns verbose snapshot and structured content', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<aside>test</aside>`);
response.includeSnapshot({
verbose: true,
@@ -162,7 +162,7 @@ describe('McpResponse', () => {
const filePath = join(tmpdir(), 'test-snapshot.txt');
try {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<aside>test</aside>`);
response.includeSnapshot({
verbose: true,
@@ -191,7 +191,7 @@ describe('McpResponse', () => {
it('preserves mapping ids across multiple snapshots', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`
<div>
<button id="btn1">Button 1</button>
@@ -266,7 +266,7 @@ describe('McpResponse', () => {
</div>
`,
);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/page.html'));
response.includeSnapshot();
@@ -556,7 +556,7 @@ describe('McpResponse', () => {
it('adds console messages when the setting is true', async t => {
await withMcpContext(async (response, context) => {
response.setIncludeConsoleData(true);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const consoleMessagePromise = new Promise<void>(resolve => {
page.on('console', () => {
resolve();
+2 -2
View File
@@ -284,7 +284,7 @@ describe('console', () => {
it('when dialog is open', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
'<script>console.log("Pre-dialog message")</script>',
);
@@ -627,7 +627,7 @@ describe('console', () => {
it('when dialog is open', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
'<script>console.error("This is an error")</script>',
);
+14 -14
View File
@@ -372,7 +372,7 @@ describe('emulation', () => {
it('emulates viewport', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.baseUrl + '/viewport');
await emulate.handler(
{
@@ -412,7 +412,7 @@ describe('emulation', () => {
it('clears viewport override when viewport is set to null', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
// First set a viewport
await emulate.handler(
{
@@ -453,7 +453,7 @@ describe('emulation', () => {
assert.strictEqual(context.getSelectedMcpPage().viewport, null);
// Somehow reset of the viewport seems to be async.
await context.getSelectedPptrPage().waitForFunction(() => {
await context.getSelectedMcpPage().pptrPage.waitForFunction(() => {
return window.innerWidth !== 400 && window.innerHeight !== 400;
});
});
@@ -482,7 +482,7 @@ describe('emulation', () => {
assert.strictEqual(context.getSelectedMcpPage().viewport, null);
assert.ok(
await context.getSelectedPptrPage().evaluate(() => {
await context.getSelectedMcpPage().pptrPage.evaluate(() => {
return window.innerWidth !== 400 && window.innerHeight !== 400;
}),
);
@@ -505,7 +505,7 @@ describe('emulation', () => {
);
assert.strictEqual(context.getSelectedMcpPage().userAgent, 'MyUA');
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const ua = await page.evaluate(() => navigator.userAgent);
assert.strictEqual(ua, 'MyUA');
});
@@ -536,7 +536,7 @@ describe('emulation', () => {
context,
);
assert.strictEqual(context.getSelectedMcpPage().userAgent, 'UA2');
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const ua = await page.evaluate(() => navigator.userAgent);
assert.strictEqual(ua, 'UA2');
});
@@ -567,7 +567,7 @@ describe('emulation', () => {
);
assert.strictEqual(context.getSelectedMcpPage().userAgent, null);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const ua = await page.evaluate(() => navigator.userAgent);
assert.notStrictEqual(ua, 'MyUA');
assert.ok(ua.length > 0);
@@ -594,7 +594,7 @@ describe('emulation', () => {
assert.strictEqual(context.getSelectedMcpPage().userAgent, null);
assert.ok(
await context.getSelectedPptrPage().evaluate(() => {
await context.getSelectedMcpPage().pptrPage.evaluate(() => {
return navigator.userAgent !== 'MyUA';
}),
);
@@ -612,7 +612,7 @@ describe('emulation', () => {
});
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await emulate.handler(
{
params: {
@@ -638,7 +638,7 @@ describe('emulation', () => {
});
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
// Set headers first
await emulate.handler(
{
@@ -686,7 +686,7 @@ describe('emulation', () => {
});
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await emulate.handler(
{
params: {
@@ -783,7 +783,7 @@ describe('emulation', () => {
);
assert.strictEqual(context.getSelectedMcpPage().colorScheme, 'dark');
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const scheme = await page.evaluate(() =>
window.matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
@@ -818,7 +818,7 @@ describe('emulation', () => {
context,
);
assert.strictEqual(context.getSelectedMcpPage().colorScheme, 'light');
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const scheme = await page.evaluate(() =>
window.matchMedia('(prefers-color-scheme: light)').matches
? 'light'
@@ -830,7 +830,7 @@ describe('emulation', () => {
it('resets color scheme when set to auto', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const initial = await page.evaluate(
() => window.matchMedia('(prefers-color-scheme: dark)').matches,
+1 -1
View File
@@ -58,7 +58,7 @@ describe('extension', () => {
);
const extensionId = extractExtensionId(response);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto('chrome://extensions');
const element = await page.waitForSelector(
+32 -32
View File
@@ -33,7 +33,7 @@ describe('input', () => {
describe('click', () => {
it('clicks', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button onclick="this.innerText = 'clicked';">test</button>`,
);
@@ -60,7 +60,7 @@ describe('input', () => {
});
it('double clicks', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button ondblclick="this.innerText = 'dblclicked';"
>test</button
@@ -101,7 +101,7 @@ describe('input', () => {
});
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/link'));
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -138,7 +138,7 @@ describe('input', () => {
server.addHtmlRoute('/after-click', html`<main>arrived</main>`);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/start'));
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -165,7 +165,7 @@ describe('input', () => {
it('does not report navigation when click does not navigate', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button onclick="this.innerText = 'clicked';">test</button>`,
);
@@ -207,7 +207,7 @@ describe('input', () => {
`,
);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/unstable'));
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -235,7 +235,7 @@ describe('input', () => {
it('does not include snapshot by default', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button onclick="this.innerText = 'clicked';">test</button>`,
);
@@ -262,7 +262,7 @@ describe('input', () => {
it('includes snapshot if includeSnapshot is true', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button onclick="this.innerText = 'clicked';">test</button>`,
);
@@ -290,7 +290,7 @@ describe('input', () => {
it('selects a collapsed native select option by option uid', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<select onchange="document.body.dataset.selected = this.value">
<option value="v1">one</option>
@@ -337,7 +337,7 @@ describe('input', () => {
it('selects a collapsed native optgroup option by option uid', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<select onchange="document.body.dataset.selected = this.value">
<optgroup label="Numbers">
@@ -386,7 +386,7 @@ describe('input', () => {
it('clicks custom ARIA option elements through the normal click path', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<div role="listbox">
<div
@@ -431,7 +431,7 @@ describe('input', () => {
describe('hover', () => {
it('hovers', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button onmouseover="this.innerText = 'hovered';">test</button>`,
);
@@ -461,7 +461,7 @@ describe('input', () => {
describe('click_at', () => {
it('clicks at coordinates', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<div
style="width: 100px; height: 100px; background: red;"
@@ -493,7 +493,7 @@ describe('input', () => {
it('double clicks at coordinates', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<div
style="width: 100px; height: 100px; background: red;"
@@ -528,7 +528,7 @@ describe('input', () => {
describe('fill', () => {
it('fills out an input', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<input />`);
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -555,7 +555,7 @@ describe('input', () => {
it('fills out a select by text', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<select
><option value="v1">one</option
@@ -590,7 +590,7 @@ describe('input', () => {
it('fills out a textarea marked as combobox', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<textarea role="combobox"></textarea>`);
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -621,7 +621,7 @@ describe('input', () => {
it('fills out a textarea with long text', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<textarea></textarea>`);
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -655,7 +655,7 @@ describe('input', () => {
it('types text', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<textarea></textarea>`);
await page.click('textarea');
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
@@ -683,7 +683,7 @@ describe('input', () => {
it('types text with submit key', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<textarea></textarea>`);
await page.click('textarea');
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
@@ -722,7 +722,7 @@ describe('input', () => {
it('errors on invalid submit key', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<textarea></textarea>`);
await page.click('textarea');
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
@@ -748,7 +748,7 @@ describe('input', () => {
it('reproduction: fill isolation', async () => {
await withMcpContext(async (_response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<form>
<input
@@ -825,7 +825,7 @@ describe('input', () => {
it('toggles checkboxes', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<input
type="checkbox"
@@ -883,7 +883,7 @@ describe('input', () => {
it('toggles switches', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`
<div
role="switch"
@@ -941,7 +941,7 @@ describe('input', () => {
it('selects radio buttons', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`
<input
type="radio"
@@ -1001,7 +1001,7 @@ describe('input', () => {
describe('drags', () => {
it('drags one element onto another', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<div
role="button"
@@ -1058,7 +1058,7 @@ describe('input', () => {
describe('fill form', () => {
it('successfully fills out the form', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<form>
<label
@@ -1120,7 +1120,7 @@ describe('input', () => {
it('fill_form handles checkboxes', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<input
name="username"
@@ -1176,7 +1176,7 @@ describe('input', () => {
await fs.writeFile(testFilePath, 'test file content');
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<form>
<input
@@ -1214,7 +1214,7 @@ describe('input', () => {
await fs.writeFile(testFilePath, 'test file content');
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<button id="file-chooser-button">Upload file</button>
<input
@@ -1264,7 +1264,7 @@ describe('input', () => {
await fs.writeFile(testFilePath, 'test file content');
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<div>Not a file input</div>`);
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -1326,7 +1326,7 @@ describe('input', () => {
it('processes press_key', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<script>
logs = [];
+4 -4
View File
@@ -21,7 +21,7 @@ describe('lighthouse', () => {
server.addHtmlRoute('/test', html`<div>Test</div>`);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/test'));
await lighthouseAudit.handler(
@@ -56,7 +56,7 @@ describe('lighthouse', () => {
server.addHtmlRoute('/test-mobile', html`<div>Test Mobile</div>`);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/test-mobile'));
await context.emulate({
viewport: {
@@ -121,7 +121,7 @@ describe('lighthouse', () => {
server.addHtmlRoute('/test-mobile', html`<div>Test Mobile</div>`);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/test-mobile'));
await lighthouseAudit.handler(
@@ -156,7 +156,7 @@ describe('lighthouse', () => {
try {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/test-mobile'));
await lighthouseAudit.handler(
+6 -6
View File
@@ -41,7 +41,7 @@ describe('network', () => {
await withMcpContext(async (response, context) => {
await context.setUpNetworkCollectorForTesting();
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/one'));
await page.goto(server.getRoute('/two'));
await page.goto(server.getRoute('/three'));
@@ -68,7 +68,7 @@ describe('network', () => {
await withMcpContext(async (response, context) => {
await context.setUpNetworkCollectorForTesting();
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/one'));
await page.goto(server.getRoute('/two'));
await page.goto(server.getRoute('/three'));
@@ -111,7 +111,7 @@ describe('network', () => {
await withMcpContext(async (response, context) => {
await context.setUpNetworkCollectorForTesting();
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/redirect'), {
waitUntil: 'networkidle0',
});
@@ -135,7 +135,7 @@ describe('network', () => {
describe('network_get_request', () => {
it('attaches request', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto('data:text/html,<div>Hello MCP</div>');
await getNetworkRequest.handler(
{params: {reqid: 1}, page: context.getSelectedMcpPage()},
@@ -148,7 +148,7 @@ describe('network', () => {
});
it('should not add the request list', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto('data:text/html,<div>Hello MCP</div>');
await getNetworkRequest.handler(
{params: {reqid: 1}, page: context.getSelectedMcpPage()},
@@ -165,7 +165,7 @@ describe('network', () => {
await withMcpContext(async (response, context) => {
await context.setUpNetworkCollectorForTesting();
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/one'));
await page.goto(server.getRoute('/two'));
await page.goto(server.getRoute('/three'));
+35 -35
View File
@@ -208,7 +208,7 @@ describe('pages', () => {
it('when dialog is open', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<Dialog>(resolve => {
page.on('dialog', dialog => {
@@ -285,7 +285,7 @@ describe('pages', () => {
response,
context,
);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
assert.strictEqual(context.getIsolatedContextName(page), 'session-a');
assert.ok(response.includePages);
});
@@ -298,13 +298,13 @@ describe('pages', () => {
response,
context,
);
const page1 = context.getSelectedPptrPage();
const page1 = context.getSelectedMcpPage().pptrPage;
await newPage().handler(
{params: {url: 'about:blank', isolatedContext: 'session-a'}},
response,
context,
);
const page2 = context.getSelectedPptrPage();
const page2 = context.getSelectedMcpPage().pptrPage;
assert.notStrictEqual(page1, page2);
assert.strictEqual(context.getIsolatedContextName(page1), 'session-a');
assert.strictEqual(context.getIsolatedContextName(page2), 'session-a');
@@ -319,13 +319,13 @@ describe('pages', () => {
response,
context,
);
const pageA = context.getSelectedPptrPage();
const pageA = context.getSelectedMcpPage().pptrPage;
await newPage().handler(
{params: {url: 'about:blank', isolatedContext: 'session-b'}},
response,
context,
);
const pageB = context.getSelectedPptrPage();
const pageB = context.getSelectedMcpPage().pptrPage;
assert.strictEqual(context.getIsolatedContextName(pageA), 'session-a');
assert.strictEqual(context.getIsolatedContextName(pageB), 'session-b');
assert.notStrictEqual(pageA.browserContext(), pageB.browserContext());
@@ -350,7 +350,7 @@ describe('pages', () => {
it('does not set isolatedContext for pages in the default context', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
assert.strictEqual(context.getIsolatedContextName(page), undefined);
await newPage().handler(
{params: {url: 'about:blank'}},
@@ -358,7 +358,7 @@ describe('pages', () => {
context,
);
assert.strictEqual(
context.getIsolatedContextName(context.getSelectedPptrPage()),
context.getIsolatedContextName(context.getSelectedMcpPage().pptrPage),
undefined,
);
});
@@ -371,7 +371,7 @@ describe('pages', () => {
response,
context,
);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const pageId = context.getSelectedMcpPage().id;
assert.ok(!page.isClosed());
await closePage.handler({params: {pageId}}, response, context);
@@ -381,7 +381,7 @@ describe('pages', () => {
it('when dialog is open', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<Dialog>(resolve => {
page.on('dialog', dialog => {
@@ -446,8 +446,8 @@ describe('pages', () => {
// Verify the default page was NOT affected.
const defaultContent = await context
.getSelectedPptrPage()
.evaluate(() => document.querySelector('h1')?.textContent);
.getSelectedMcpPage()
.pptrPage.evaluate(() => document.querySelector('h1')?.textContent);
assert.notStrictEqual(defaultContent, 'Navigated');
});
});
@@ -468,7 +468,7 @@ describe('pages', () => {
});
it('cannot close the last page', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await closePage.handler({params: {pageId: 1}}, response, context);
assert.deepStrictEqual(
response.responseLines[0],
@@ -559,7 +559,7 @@ describe('pages', () => {
response,
context,
);
const pageA = context.getSelectedPptrPage();
const pageA = context.getSelectedMcpPage().pptrPage;
const pageAId = context.getSelectedMcpPage().id;
await newPage().handler(
@@ -567,7 +567,7 @@ describe('pages', () => {
response,
context,
);
const pageB = context.getSelectedPptrPage();
const pageB = context.getSelectedMcpPage().pptrPage;
// Selecting pageB (ctx-b) should not defocus pageA (ctx-a).
assert.strictEqual(
@@ -598,7 +598,7 @@ describe('pages', () => {
it('when dialog is open', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<Dialog>(resolve => {
page.on('dialog', dialog => {
@@ -631,7 +631,7 @@ describe('pages', () => {
response,
context,
);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
assert.equal(
await page.evaluate(() => document.querySelector('div')?.textContent),
'Hello MCP',
@@ -672,7 +672,7 @@ describe('pages', () => {
it('respects the timeout parameter', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const stub = sinon.stub(page, 'waitForNavigation').resolves(null);
try {
@@ -700,7 +700,7 @@ describe('pages', () => {
});
it('go back', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto('data:text/html,<div>Hello MCP</div>');
await navigatePage().handler(
{params: {type: 'back'}, page: context.getSelectedMcpPage()},
@@ -717,7 +717,7 @@ describe('pages', () => {
});
it('go forward', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto('data:text/html,<div>Hello MCP</div>');
await page.goBack();
await navigatePage().handler(
@@ -735,7 +735,7 @@ describe('pages', () => {
});
it('reload', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto('data:text/html,<div>Hello MCP</div>');
await navigatePage().handler(
{params: {type: 'reload'}, page: context.getSelectedMcpPage()},
@@ -753,7 +753,7 @@ describe('pages', () => {
it('reload with accpeting the beforeunload dialog', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html` <script>
window.addEventListener('beforeunload', e => {
@@ -780,7 +780,7 @@ describe('pages', () => {
it('reload with declining the beforeunload dialog', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html` <script>
window.addEventListener('beforeunload', e => {
@@ -857,7 +857,7 @@ describe('pages', () => {
response,
context,
);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
// wait for up to 1s for the global variable to set by the initScript to exist
await page.waitForFunction("window.initScript==='completed'", {
@@ -870,7 +870,7 @@ describe('pages', () => {
it('when dialog is open', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<void>(resolve => {
page.on('dialog', () => resolve());
});
@@ -901,7 +901,7 @@ describe('pages', () => {
describe('resize', () => {
it('resize the page', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const resizePromise = page.evaluate(() => {
return new Promise(resolve => {
window.addEventListener('resize', resolve, {once: true});
@@ -928,7 +928,7 @@ describe('pages', () => {
it('resize when window state is normal', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const browser = page.browser();
const windowId = await page.windowId();
await browser.setWindowBounds(windowId, {windowState: 'normal'});
@@ -962,7 +962,7 @@ describe('pages', () => {
it('resize when window state is minimized', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const browser = page.browser();
const windowId = await page.windowId();
await browser.setWindowBounds(windowId, {windowState: 'minimized'});
@@ -996,7 +996,7 @@ describe('pages', () => {
it('resize when window state is maximized', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const browser = page.browser();
const windowId = await page.windowId();
await browser.setWindowBounds(windowId, {windowState: 'maximized'});
@@ -1030,7 +1030,7 @@ describe('pages', () => {
it('resize when window state is fullscreen', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const browser = page.browser();
const windowId = await page.windowId();
await browser.setWindowBounds(windowId, {windowState: 'fullscreen'});
@@ -1064,7 +1064,7 @@ describe('pages', () => {
it('when dialog is open', async t => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<Dialog>(resolve => {
page.on('dialog', dialog => {
resolve(dialog);
@@ -1096,7 +1096,7 @@ describe('pages', () => {
describe('dialogs', () => {
it('can accept dialogs', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<void>(resolve => {
page.on('dialog', () => {
resolve();
@@ -1126,7 +1126,7 @@ describe('pages', () => {
});
it('can dismiss dialogs', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<void>(resolve => {
page.on('dialog', () => {
resolve();
@@ -1156,7 +1156,7 @@ describe('pages', () => {
});
it('can dismiss already dismissed dialog dialogs', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const dialogPromise = new Promise<Dialog>(resolve => {
page.on('dialog', dialog => {
resolve(dialog);
@@ -1276,7 +1276,7 @@ describe('pages', () => {
describe('get_tab_id', () => {
it('returns the tab id', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
// @ts-expect-error _tabId is internal.
assert.ok(typeof page._tabId === 'string');
// @ts-expect-error _tabId is internal.
+12 -12
View File
@@ -46,7 +46,7 @@ describe('performance', () => {
it('starts a trace recording', async () => {
await withMcpContext(async (response, context) => {
context.setIsRunningPerformanceTrace(false);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const startTracingStub = sinon.stub(selectedPage.tracing, 'start');
await startTrace.handler(
{
@@ -68,7 +68,7 @@ describe('performance', () => {
it('can navigate to about:blank and record a page reload', async () => {
await withMcpContext(async (response, context) => {
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
sinon.stub(selectedPage, 'url').callsFake(() => 'https://www.test.com');
const gotoStub = sinon.stub(selectedPage, 'goto');
const startTracingStub = sinon.stub(selectedPage.tracing, 'start');
@@ -100,7 +100,7 @@ describe('performance', () => {
const rawData = loadTraceAsBuffer('basic-trace.json.gz');
await withMcpContext(async (response, context) => {
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
sinon.stub(selectedPage, 'url').callsFake(() => 'https://www.test.com');
sinon.stub(selectedPage, 'goto').callsFake(() => Promise.resolve(null));
const startTracingStub = sinon.stub(selectedPage.tracing, 'start');
@@ -147,7 +147,7 @@ describe('performance', () => {
it('errors if a recording is already active', async () => {
await withMcpContext(async (response, context) => {
context.setIsRunningPerformanceTrace(true);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const startTracingStub = sinon.stub(selectedPage.tracing, 'start');
await startTrace.handler(
{
@@ -174,7 +174,7 @@ describe('performance', () => {
await withMcpContext(async (response, context) => {
const filePath = 'test-trace.json.gz';
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
sinon.stub(selectedPage, 'url').callsFake(() => 'https://www.test.com');
sinon.stub(selectedPage, 'goto').callsFake(() => Promise.resolve(null));
sinon.stub(selectedPage.tracing, 'start');
@@ -273,7 +273,7 @@ describe('performance', () => {
it('does nothing if the trace is not running and does not error', async () => {
await withMcpContext(async (response, context) => {
context.setIsRunningPerformanceTrace(false);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const stopTracingStub = sinon.stub(selectedPage.tracing, 'stop');
await stopTrace.handler(
{params: {}, page: context.getSelectedMcpPage()},
@@ -289,7 +289,7 @@ describe('performance', () => {
const rawData = loadTraceAsBuffer('basic-trace.json.gz');
await withMcpContext(async (response, context) => {
context.setIsRunningPerformanceTrace(true);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const stopTracingStub = sinon
.stub(selectedPage.tracing, 'stop')
.callsFake(async () => {
@@ -313,7 +313,7 @@ describe('performance', () => {
it('throws an error if parsing the trace buffer fails', async () => {
await withMcpContext(async (response, context) => {
context.setIsRunningPerformanceTrace(true);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
sinon
.stub(selectedPage.tracing, 'stop')
.returns(Promise.resolve(undefined));
@@ -334,7 +334,7 @@ describe('performance', () => {
await withMcpContext(async (response, context) => {
const filePath = 'test-trace.json';
context.setIsRunningPerformanceTrace(true);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const stopTracingStub = sinon
.stub(selectedPage.tracing, 'stop')
.resolves(rawData);
@@ -364,7 +364,7 @@ describe('performance', () => {
await withMcpContext(
async (response, context) => {
context.setIsRunningPerformanceTrace(true);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
sinon.stub(selectedPage.tracing, 'stop').resolves(rawData);
await stopTrace.handler(
@@ -392,7 +392,7 @@ describe('performance', () => {
const rawData = loadTraceAsBuffer('web-dev-with-commit.json.gz');
await withMcpContext(async (response, context) => {
context.setIsRunningPerformanceTrace(true);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
sinon.stub(selectedPage.tracing, 'stop').resolves(rawData);
const fetchStub = globalThis.fetch as sinon.SinonStub;
@@ -445,7 +445,7 @@ describe('performance', () => {
await withMcpContext(async (response, context) => {
context.setIsRunningPerformanceTrace(true);
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
sinon.stub(selectedPage.tracing, 'stop').resolves(modifiedData);
// Emulate mobile
+8 -8
View File
@@ -31,7 +31,7 @@ describe('screencast', () => {
it('starts a screencast recording with filePath', async () => {
await withMcpContext(async (response, context) => {
const mockRecorder = createMockRecorder();
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const screencastStub = sinon
.stub(selectedPage, 'screencast')
.resolves(mockRecorder as never);
@@ -62,7 +62,7 @@ describe('screencast', () => {
it('records WebM for an uppercase extension (case-insensitive)', async () => {
await withMcpContext(async (response, context) => {
const mockRecorder = createMockRecorder();
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const screencastStub = sinon
.stub(selectedPage, 'screencast')
.resolves(mockRecorder as never);
@@ -86,7 +86,7 @@ describe('screencast', () => {
it('rejects an unsupported extension instead of silently using mp4', async () => {
await withMcpContext(async (response, context) => {
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const screencastStub = sinon.stub(selectedPage, 'screencast');
await assert.rejects(
@@ -109,7 +109,7 @@ describe('screencast', () => {
it('starts a screencast recording with temp file when no filePath', async () => {
await withMcpContext(async (response, context) => {
const mockRecorder = createMockRecorder();
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const screencastStub = sinon
.stub(selectedPage, 'screencast')
.resolves(mockRecorder as never);
@@ -136,7 +136,7 @@ describe('screencast', () => {
filePath: path.join(os.tmpdir(), 'existing.mp4'),
});
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const screencastStub = sinon.stub(selectedPage, 'screencast');
await startScreencast().handler(
@@ -156,7 +156,7 @@ describe('screencast', () => {
it('provides a clear error when ffmpeg is not found', async () => {
await withMcpContext(async (response, context) => {
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const error = new Error('spawn ffmpeg ENOENT');
sinon.stub(selectedPage, 'screencast').rejects(error);
@@ -178,7 +178,7 @@ describe('screencast', () => {
it('cleans up the generated temp directory if recording fails to start', async () => {
await withMcpContext(async (response, context) => {
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const screencastStub = sinon
.stub(selectedPage, 'screencast')
.rejects(new Error('spawn ffmpeg ENOENT'));
@@ -203,7 +203,7 @@ describe('screencast', () => {
it('passes ffmpegPath from args to puppeteer', async () => {
await withMcpContext(async (response, context) => {
const mockRecorder = createMockRecorder();
const selectedPage = context.getSelectedPptrPage();
const selectedPage = context.getSelectedMcpPage().pptrPage;
const screencastStub = sinon
.stub(selectedPage, 'screencast')
.resolves(mockRecorder as never);
+14 -14
View File
@@ -37,7 +37,7 @@ describe('screenshot', () => {
it('with default options', async () => {
await withMcpContext(async (response, context) => {
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await screenshotTool.handler(
{params: {format: 'png'}, page: context.getSelectedMcpPage()},
@@ -56,7 +56,7 @@ describe('screenshot', () => {
it('ignores quality', async () => {
await withMcpContext(async (response, context) => {
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await screenshotTool.handler(
{
@@ -110,7 +110,7 @@ describe('screenshot', () => {
it('with full page', async () => {
await withMcpContext(async (response, context) => {
const fixture = screenshots.viewportOverflow;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await screenshotTool.handler(
{
@@ -132,7 +132,7 @@ describe('screenshot', () => {
it('with full page resulting in a large screenshot', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`${`<div style="color:blue;">test</div>`.repeat(6500)}
@@ -171,7 +171,7 @@ describe('screenshot', () => {
await withMcpContext(async (response, context) => {
const fixture = screenshots.button;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
@@ -202,7 +202,7 @@ describe('screenshot', () => {
const filePath = join(tmpdir(), 'test-screenshot.png');
try {
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await screenshotTool.handler(
{
@@ -245,7 +245,7 @@ describe('screenshot', () => {
try {
await withMcpContext(async (response, context) => {
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await assert.rejects(
screenshotTool.handler(
@@ -272,7 +272,7 @@ describe('screenshot', () => {
try {
await withMcpContext(async (response, context) => {
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await assert.rejects(
screenshotTool.handler(
@@ -298,7 +298,7 @@ describe('screenshot', () => {
} as ParsedArguments);
await withMcpContext(async (response, context) => {
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
// No explicit format passed: zod should apply the CLI-driven default.
await tool.handler(
@@ -325,7 +325,7 @@ describe('screenshot', () => {
screenshotMaxWidth: 100,
} as ParsedArguments);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setViewport({width: 800, height: 600});
await page.setContent(
html`<div style="width:100vw;height:100vh;background:red"></div>`,
@@ -351,7 +351,7 @@ describe('screenshot', () => {
screenshotMaxHeight: 60,
} as ParsedArguments);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setViewport({width: 800, height: 600});
await page.setContent(
html`<div style="width:100vw;height:100vh"></div>`,
@@ -376,7 +376,7 @@ describe('screenshot', () => {
screenshotMaxHeight: 4000,
} as ParsedArguments);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setViewport({width: 800, height: 600});
await page.setContent(html`<div></div>`);
@@ -397,7 +397,7 @@ describe('screenshot', () => {
screenshotMaxWidth: 200,
} as ParsedArguments);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setViewport({width: 800, height: 600});
await page.setContent(
html`<style>
@@ -435,7 +435,7 @@ describe('screenshot', () => {
const invalidChar = process.platform === 'win32' ? '>' : '\0';
const filePath = `malformed${invalidChar}path.png`;
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await assert.rejects(
screenshotTool.handler(
+8 -8
View File
@@ -78,7 +78,7 @@ describe('script', () => {
it('work for complex objects', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<script src="./scripts.js"></script> `);
@@ -106,7 +106,7 @@ describe('script', () => {
it('work for scripts that trigger dialogs', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<button id="test">test</button>`);
@@ -129,7 +129,7 @@ describe('script', () => {
it('work for scripts that trigger dialogs and dismiss them', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<button id="test">test</button>`);
@@ -152,7 +152,7 @@ describe('script', () => {
it('work for scripts that trigger prompts and fill them', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<button id="test">test</button>`);
@@ -175,7 +175,7 @@ describe('script', () => {
it('work for async functions', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<script src="./scripts.js"></script> `);
@@ -198,7 +198,7 @@ describe('script', () => {
it('work with one argument', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<button id="test">test</button>`);
@@ -225,7 +225,7 @@ describe('script', () => {
it('work with multiple args', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(html`<button id="test">test</button>`);
@@ -258,7 +258,7 @@ describe('script', () => {
server.addHtmlRoute('/main', html`<iframe src="/iframe"></iframe>`);
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.goto(server.getRoute('/main'));
context.getSelectedMcpPage().textSnapshot = await TextSnapshot.create(
context.getSelectedMcpPage(),
+2 -2
View File
@@ -56,7 +56,7 @@ describe('slim', () => {
response,
context,
);
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
assert.equal(
await page.evaluate(() => document.querySelector('div')?.textContent),
'Hello MCP',
@@ -69,7 +69,7 @@ describe('slim', () => {
it('with default options', async () => {
await withMcpContext(async (response, context) => {
const fixture = screenshots.basic;
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(fixture.html);
await screenshot.handler(
{params: {format: 'png'}, page: context.getSelectedMcpPage()},
+6 -6
View File
@@ -26,7 +26,7 @@ describe('snapshot', () => {
describe('browser_wait_for', () => {
it('should work', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<main><span>Hello</span><span> </span><div>World</div></main>`,
@@ -52,7 +52,7 @@ describe('snapshot', () => {
it('should work with any-match array', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<main><span>Status</span><div>Error</div></main>`,
@@ -78,7 +78,7 @@ describe('snapshot', () => {
it('should work with any-match array when element shows up later', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const handlePromise = waitFor.handler(
{
@@ -109,7 +109,7 @@ describe('snapshot', () => {
it('should work with element that show up later', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
const handlePromise = waitFor.handler(
{
@@ -137,7 +137,7 @@ describe('snapshot', () => {
});
it('should work with aria elements', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<main><h1>Header</h1><div>Text</div></main>`,
@@ -164,7 +164,7 @@ describe('snapshot', () => {
it('should work with iframe content', async () => {
await withMcpContext(async (response, context) => {
const page = context.getSelectedPptrPage();
const page = context.getSelectedMcpPage().pptrPage;
await page.setContent(
html`<h1>Top level</h1>