From 9b180e39b5667c3686407a44a15efd899491c1e2 Mon Sep 17 00:00:00 2001 From: Wolfgang Beyer Date: Wed, 1 Apr 2026 11:34:54 +0000 Subject: [PATCH 1/3] make in-page tools work with pageId routing --- src/McpContext.ts | 10 ---------- src/McpPage.ts | 7 +++++++ src/McpResponse.ts | 5 +++-- src/tools/ToolDefinition.ts | 3 ++- src/tools/inPage.ts | 7 +++---- tests/tools/inPage.test.ts | 5 +++++ 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/McpContext.ts b/src/McpContext.ts index e5a6c6bcf..3ebbeae95 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -31,7 +31,6 @@ import type { } from './third_party/index.js'; import {Locator} from './third_party/index.js'; import {PredefinedNetworkConditions} from './third_party/index.js'; -import type {ToolGroup, ToolDefinition} from './tools/inPage.js'; import {listPages} from './tools/pages.js'; import {CLOSE_PAGE_ERROR} from './tools/ToolDefinition.js'; import type {Context, DevToolsData} from './tools/ToolDefinition.js'; @@ -102,7 +101,6 @@ export class McpContext implements Context { #screenRecorderData: {recorder: ScreenRecorder; filePath: string} | null = null; - #inPageTools?: ToolGroup; #nextPageId = 1; #extensionPages = new WeakMap(); @@ -466,14 +464,6 @@ export class McpContext implements Context { this.#updateSelectedPageTimeouts(); } - setInPageTools(toolGroup?: ToolGroup) { - this.#inPageTools = toolGroup; - } - - getInPageTools(): ToolGroup | undefined { - return this.#inPageTools; - } - #updateSelectedPageTimeouts() { const page = this.#getSelectedMcpPage(); // For waiters 5sec timeout should be sufficient. diff --git a/src/McpPage.ts b/src/McpPage.ts index 73717464b..f7f89d868 100644 --- a/src/McpPage.ts +++ b/src/McpPage.ts @@ -10,6 +10,7 @@ import type { Page, Viewport, } from './third_party/index.js'; +import type {ToolGroup, ToolDefinition} from './tools/inPage.js'; import {takeSnapshot} from './tools/snapshot.js'; import type {ContextPage} from './tools/ToolDefinition.js'; import type { @@ -46,6 +47,8 @@ export class McpPage implements ContextPage { #dialog?: Dialog; #dialogHandler: (dialog: Dialog) => void; + inPageTools: ToolGroup | undefined; + constructor(page: Page, id: number) { this.pptrPage = page; this.id = id; @@ -67,6 +70,10 @@ export class McpPage implements ContextPage { this.#dialog = undefined; } + getInPageTools(): ToolGroup | undefined { + return this.inPageTools; + } + get networkConditions(): string | null { return this.emulationSettings.networkConditions ?? null; } diff --git a/src/McpResponse.ts b/src/McpResponse.ts index 98bf25082..ed20e4c4f 100644 --- a/src/McpResponse.ts +++ b/src/McpResponse.ts @@ -421,8 +421,9 @@ export class McpResponse implements Response { let inPageTools: ToolGroup | undefined; if (this.#listInPageTools) { - inPageTools = await getToolGroup(context.getSelectedMcpPage()); - context.setInPageTools(inPageTools); + const page = this.#page ?? context.getSelectedMcpPage(); + inPageTools = await getToolGroup(page); + page.inPageTools = inPageTools; } let consoleMessages: Array | undefined; diff --git a/src/tools/ToolDefinition.ts b/src/tools/ToolDefinition.ts index 503516ec0..f0e677c84 100644 --- a/src/tools/ToolDefinition.ts +++ b/src/tools/ToolDefinition.ts @@ -198,7 +198,6 @@ export type Context = Readonly<{ triggerExtensionAction(id: string): Promise; listExtensions(): InstalledExtension[]; getExtension(id: string): InstalledExtension | undefined; - getInPageTools(): ToolGroup | undefined; getSelectedMcpPage(): McpPage; getExtensionServiceWorkers(): ExtensionServiceWorker[]; getExtensionServiceWorkerId( @@ -213,6 +212,8 @@ export type ContextPage = Readonly<{ getDialog(): Dialog | undefined; clearDialog(): void; + + getInPageTools(): ToolGroup | undefined; }>; export function defineTool( diff --git a/src/tools/inPage.ts b/src/tools/inPage.ts index f4a3d034b..5b0031f62 100644 --- a/src/tools/inPage.ts +++ b/src/tools/inPage.ts @@ -70,8 +70,7 @@ export const executeInPageTool = definePageTool({ .optional() .describe('The JSON-stringified parameters to pass to the tool'), }, - handler: async (request, response, context) => { - const page = context.getSelectedMcpPage(); + handler: async (request, response) => { const toolName = request.params.toolName; let params: Record = {}; if (request.params.params) { @@ -88,7 +87,7 @@ export const executeInPageTool = definePageTool({ } } - const toolGroup = context.getInPageTools(); + const toolGroup = request.page.getInPageTools(); const tool = toolGroup?.tools.find(t => t.name === toolName); if (!tool) { throw new Error(`Tool ${toolName} not found`); @@ -102,7 +101,7 @@ export const executeInPageTool = definePageTool({ ); } - const result = await page.pptrPage.evaluate( + const result = await request.page.pptrPage.evaluate( async (name, args) => { if (!window.__dtmcp?.executeTool) { throw new Error('No tools found on the page'); diff --git a/tests/tools/inPage.test.ts b/tests/tools/inPage.test.ts index cc1ceb876..622da9034 100644 --- a/tests/tools/inPage.test.ts +++ b/tests/tools/inPage.test.ts @@ -20,6 +20,7 @@ describe('inPage', () => { await withMcpContext( async (response, context) => { const page = await context.newPage(); + response.setPage(page); await page.pptrPage.evaluate(() => { window.__dtmcp = { @@ -76,6 +77,7 @@ describe('inPage', () => { await withMcpContext( async (response, context) => { const page = await context.newPage(); + response.setPage(page); await page.pptrPage.evaluate(() => { window.addEventListener('devtoolstooldiscovery', (e: Event) => { // @ts-expect-error Event has `respondWith` @@ -105,6 +107,7 @@ describe('inPage', () => { await withMcpContext( async (response, context) => { const page = await context.newPage(); + response.setPage(page); await page.pptrPage.evaluate(() => { window.addEventListener('devtoolstooldiscovery', () => { // do nothing @@ -133,6 +136,7 @@ describe('inPage', () => { await withMcpContext( async (response, context) => { const page = await context.newPage(); + response.setPage(page); await listInPageTools.handler({params: {}, page}, response, context); const result = await response.handle('list_in_page_tools', context); @@ -155,6 +159,7 @@ describe('inPage', () => { evaluateFn: () => void, ) { const page = await context.newPage(); + response.setPage(page); await page.pptrPage.evaluate(evaluateFn); await listInPageTools.handler({params: {}, page}, response, context); await response.handle('list_in_page_tools', context); From a2d55578621a8ca0161a922e964092a2e352aac5 Mon Sep 17 00:00:00 2001 From: browser-automation-bot <133232582+browser-automation-bot@users.noreply.github.com> Date: Wed, 1 Apr 2026 10:35:18 +0200 Subject: [PATCH 2/3] chore(main): release chrome-devtools-mcp 0.21.0 (#1215) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* --- ## [0.21.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.20.3...chrome-devtools-mcp-v0.21.0) (2026-04-01) ### 🎉 Features * add a skill for detecting memory leaks using take_memory_snapshot tool ([#1162](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1162)) ([d19a235](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/d19a2350f975ec2fbf8ee61b35163a48c0146c32)) ### 🛠️ Fixes * **cli:** avoid defaulting to isolated when userDataDir is provided ([#1258](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1258)) ([73e1e24](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/73e1e24b26f9e42a83116b586e34d47276a6a2fa)) * list_pages should work after selected page is closed ([#1145](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1145)) ([2664455](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/26644553028d8404fd65a005ea9c19a278671f4d)) * mark lighthouse and memory as non-read-only ([#1769](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1769)) ([bec9dae](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/bec9dae2d26b728feedcd660189f386e6228f3ae)) * **telemetry:** record client name ([9a47b65](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/9a47b657d7b17b9bc64508530c93d55e8033e2a6)) * versioning for Claude Code plugin ([#1233](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1233)) ([966b86f](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/966b86f3aaa9f87c2599b954c4e7f990c2a697ea)) * wrap .mcp.json config in mcpServers key ([#1246](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1246)) ([c7948cf](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/c7948cf0621d80b080220d4cfd36b62bef2790b9)) ### 📄 Documentation * Command Code CLI instructions for MCP server ([0a7c0a7](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0a7c0a74b471935a3e2f5ca0fd93556e8e5165ec)) * provide disclaimer about supported browsers ([#1237](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1237)) ([8676b72](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/8676b7216c66dfd323c2f6c272544a75dbab4dba)) ### 🏗️ Refactor * set process titles for easier debugging ([#1770](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1770)) ([0fe3896](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0fe3896d85c74ce8b2dc189fe8a310727f795344)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: Alex Rudenko --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .release-please-manifest.json | 2 +- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- server.json | 4 ++-- src/version.ts | 2 +- 8 files changed, 37 insertions(+), 9 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index e347b4058..389f843ee 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,6 +1,6 @@ { "name": "chrome-devtools-plugins", - "version": "0.20.3", + "version": "0.21.0", "description": "Bundled plugins for actuating and debugging the Chrome browser.", "repository": "https://github.com/ChromeDevTools/chrome-devtools-mcp", "owner": { diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 51464ff4a..2ec27bb81 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "chrome-devtools-mcp", - "version": "0.20.3", + "version": "0.21.0", "description": "Reliable automation, in-depth debugging, and performance analysis in Chrome using Chrome DevTools and Puppeteer", "mcpServers": { "chrome-devtools": { diff --git a/.release-please-manifest.json b/.release-please-manifest.json index c128dfab5..d3535156f 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.20.3" + ".": "0.21.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 479c38125..cc8678ffa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## [0.21.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.20.3...chrome-devtools-mcp-v0.21.0) (2026-04-01) + + +### 🎉 Features + +* add a skill for detecting memory leaks using take_memory_snapshot tool ([#1162](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1162)) ([d19a235](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/d19a2350f975ec2fbf8ee61b35163a48c0146c32)) + + +### 🛠️ Fixes + +* **cli:** avoid defaulting to isolated when userDataDir is provided ([#1258](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1258)) ([73e1e24](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/73e1e24b26f9e42a83116b586e34d47276a6a2fa)) +* list_pages should work after selected page is closed ([#1145](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1145)) ([2664455](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/26644553028d8404fd65a005ea9c19a278671f4d)) +* mark lighthouse and memory as non-read-only ([#1769](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1769)) ([bec9dae](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/bec9dae2d26b728feedcd660189f386e6228f3ae)) +* **telemetry:** record client name ([9a47b65](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/9a47b657d7b17b9bc64508530c93d55e8033e2a6)) +* versioning for Claude Code plugin ([#1233](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1233)) ([966b86f](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/966b86f3aaa9f87c2599b954c4e7f990c2a697ea)) +* wrap .mcp.json config in mcpServers key ([#1246](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1246)) ([c7948cf](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/c7948cf0621d80b080220d4cfd36b62bef2790b9)) + + +### 📄 Documentation + +* Command Code CLI instructions for MCP server ([0a7c0a7](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0a7c0a74b471935a3e2f5ca0fd93556e8e5165ec)) +* provide disclaimer about supported browsers ([#1237](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1237)) ([8676b72](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/8676b7216c66dfd323c2f6c272544a75dbab4dba)) + + +### 🏗️ Refactor + +* set process titles for easier debugging ([#1770](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1770)) ([0fe3896](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0fe3896d85c74ce8b2dc189fe8a310727f795344)) + ## [0.20.3](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.20.2...chrome-devtools-mcp-v0.20.3) (2026-03-20) diff --git a/package-lock.json b/package-lock.json index 389b5f6ce..085c46de4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "chrome-devtools-mcp", - "version": "0.20.3", + "version": "0.21.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "chrome-devtools-mcp", - "version": "0.20.3", + "version": "0.21.0", "license": "Apache-2.0", "bin": { "chrome-devtools": "build/src/bin/chrome-devtools.js", diff --git a/package.json b/package.json index eb201707d..693eaf53e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chrome-devtools-mcp", - "version": "0.20.3", + "version": "0.21.0", "description": "MCP server for Chrome DevTools", "type": "module", "bin": { diff --git a/server.json b/server.json index fa2698867..edee394ae 100644 --- a/server.json +++ b/server.json @@ -7,13 +7,13 @@ "url": "https://github.com/ChromeDevTools/chrome-devtools-mcp", "source": "github" }, - "version": "0.20.3", + "version": "0.21.0", "packages": [ { "registryType": "npm", "registryBaseUrl": "https://registry.npmjs.org", "identifier": "chrome-devtools-mcp", - "version": "0.20.3", + "version": "0.21.0", "transport": { "type": "stdio" }, diff --git a/src/version.ts b/src/version.ts index 90c9af519..1691b1174 100644 --- a/src/version.ts +++ b/src/version.ts @@ -6,5 +6,5 @@ // If moved update release-please config // x-release-please-start-version -export const VERSION = '0.20.3'; +export const VERSION = '0.21.0'; // x-release-please-end From f5831b504a83152e1b1eb03407670846eab3f0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tolgahan=20Demirba=C5=9F?= <49946947+bcfmtolgahan@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:02:34 +0300 Subject: [PATCH 3/3] refactor: move waitForEventsAfterAction to McpPage (#1780) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Splits out from #1244 per review feedback. 'waitForEventsAfterAction' previously lived in 'McpContext' and always used the selected page's CPU/network throttling settings. With pageId routing, a tool can target a different page than the selected one, meaning wrong throttling multipliers were applied. Moving the method to 'McpPage' fixes this: each tool now calls 'page.waitForEventsAfterAction(...)' and gets the correct page's emulation settings. 'getNetworkMultiplierFromString' is extracted to 'WaitForHelper.ts' to avoid a circular import (McpContext → McpPage already exists). Unblocks #1777. --- src/McpContext.ts | 44 +------------------------------------ src/McpPage.ts | 23 +++++++++++++++++++ src/WaitForHelper.ts | 20 +++++++++++++++++ src/tools/ToolDefinition.ts | 9 ++++---- src/tools/input.ts | 29 ++++++++++++------------ src/tools/pages.ts | 6 ++--- src/tools/script.ts | 37 +++++++++++++++++-------------- tests/McpContext.test.ts | 6 ++--- 8 files changed, 88 insertions(+), 86 deletions(-) diff --git a/src/McpContext.ts b/src/McpContext.ts index 3ebbeae95..32b7413e6 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -47,7 +47,7 @@ import { type InstalledExtension, } from './utils/ExtensionRegistry.js'; import {saveTemporaryFile} from './utils/files.js'; -import {WaitForHelper} from './WaitForHelper.js'; +import {getNetworkMultiplierFromString} from './WaitForHelper.js'; interface McpContextOptions { // Whether the DevTools windows are exposed as pages for debugging of DevTools. @@ -61,23 +61,6 @@ interface McpContextOptions { const DEFAULT_TIMEOUT = 5_000; const NAVIGATION_TIMEOUT = 10_000; -function getNetworkMultiplierFromString(condition: string | null): number { - const puppeteerCondition = - condition as keyof typeof PredefinedNetworkConditions; - - switch (puppeteerCondition) { - case 'Fast 4G': - return 1; - case 'Slow 4G': - return 2.5; - case 'Fast 3G': - return 5; - case 'Slow 3G': - return 10; - } - return 1; -} - export class McpContext implements Context { browser: Browser; logger: Debugger; @@ -841,31 +824,6 @@ export class McpContext implements Context { return this.#traceResults; } - getWaitForHelper( - page: Page, - cpuMultiplier: number, - networkMultiplier: number, - ) { - return new WaitForHelper(page, cpuMultiplier, networkMultiplier); - } - - waitForEventsAfterAction( - action: () => Promise, - options?: {timeout?: number}, - ): Promise { - const page = this.#getSelectedMcpPage(); - const cpuMultiplier = page.cpuThrottlingRate; - const networkMultiplier = getNetworkMultiplierFromString( - page.networkConditions, - ); - const waitForHelper = this.getWaitForHelper( - page.pptrPage, - cpuMultiplier, - networkMultiplier, - ); - return waitForHelper.waitForEventsAfterAction(action, options); - } - getNetworkRequestStableId(request: HTTPRequest): number { return this.#networkCollector.getIdForResource(request); } diff --git a/src/McpPage.ts b/src/McpPage.ts index f7f89d868..1e311bc62 100644 --- a/src/McpPage.ts +++ b/src/McpPage.ts @@ -19,6 +19,10 @@ import type { TextSnapshot, TextSnapshotNode, } from './types.js'; +import { + getNetworkMultiplierFromString, + WaitForHelper, +} from './WaitForHelper.js'; /** * Per-page state wrapper. Consolidates dialog, snapshot, emulation, @@ -98,6 +102,25 @@ export class McpPage implements ContextPage { return this.emulationSettings.colorScheme ?? null; } + // Public for testability: tests spy on this method to verify throttle multipliers. + createWaitForHelper( + cpuMultiplier: number, + networkMultiplier: number, + ): WaitForHelper { + return new WaitForHelper(this.pptrPage, cpuMultiplier, networkMultiplier); + } + + waitForEventsAfterAction( + action: () => Promise, + options?: {timeout?: number}, + ): Promise { + const helper = this.createWaitForHelper( + this.cpuThrottlingRate, + getNetworkMultiplierFromString(this.networkConditions), + ); + return helper.waitForEventsAfterAction(action, options); + } + dispose(): void { this.pptrPage.off('dialog', this.#dialogHandler); } diff --git a/src/WaitForHelper.ts b/src/WaitForHelper.ts index 6c84daf12..2dd0f48c1 100644 --- a/src/WaitForHelper.ts +++ b/src/WaitForHelper.ts @@ -6,6 +6,7 @@ import {logger} from './logger.js'; import type {Page, Protocol, CdpPage} from './third_party/index.js'; +import type {PredefinedNetworkConditions} from './third_party/index.js'; export class WaitForHelper { #abortController = new AbortController(); @@ -160,3 +161,22 @@ export class WaitForHelper { } } } + +export function getNetworkMultiplierFromString( + condition: string | null, +): number { + const puppeteerCondition = + condition as keyof typeof PredefinedNetworkConditions; + + switch (puppeteerCondition) { + case 'Fast 4G': + return 1; + case 'Slow 4G': + return 2.5; + case 'Fast 3G': + return 5; + case 'Slow 3G': + return 10; + } + return 1; +} diff --git a/src/tools/ToolDefinition.ts b/src/tools/ToolDefinition.ts index f0e677c84..8001e18c7 100644 --- a/src/tools/ToolDefinition.ts +++ b/src/tools/ToolDefinition.ts @@ -172,10 +172,6 @@ export type Context = Readonly<{ data: Uint8Array, filename: string, ): Promise<{filename: string}>; - waitForEventsAfterAction( - action: () => Promise, - options?: {timeout?: number}, - ): Promise; waitForTextOnPage( text: string[], timeout?: number, @@ -212,7 +208,10 @@ export type ContextPage = Readonly<{ getDialog(): Dialog | undefined; clearDialog(): void; - + waitForEventsAfterAction( + action: () => Promise, + options?: {timeout?: number}, + ): Promise; getInPageTools(): ToolGroup | undefined; }>; diff --git a/src/tools/input.ts b/src/tools/input.ts index 1ddbcacd9..59227ca67 100644 --- a/src/tools/input.ts +++ b/src/tools/input.ts @@ -58,11 +58,11 @@ export const click = definePageTool({ dblClick: dblClickSchema, includeSnapshot: includeSnapshotSchema, }, - handler: async (request, response, context) => { + handler: async (request, response) => { const uid = request.params.uid; const handle = await request.page.getElementByUid(uid); try { - await context.waitForEventsAfterAction(async () => { + await request.page.waitForEventsAfterAction(async () => { await handle.asLocator().click({ count: request.params.dblClick ? 2 : 1, }); @@ -97,9 +97,9 @@ export const clickAt = definePageTool({ dblClick: dblClickSchema, includeSnapshot: includeSnapshotSchema, }, - handler: async (request, response, context) => { + handler: async (request, response) => { const page = request.page; - await context.waitForEventsAfterAction(async () => { + await page.waitForEventsAfterAction(async () => { await page.pptrPage.mouse.click(request.params.x, request.params.y, { clickCount: request.params.dblClick ? 2 : 1, }); @@ -130,11 +130,11 @@ export const hover = definePageTool({ ), includeSnapshot: includeSnapshotSchema, }, - handler: async (request, response, context) => { + handler: async (request, response) => { const uid = request.params.uid; const handle = await request.page.getElementByUid(uid); try { - await context.waitForEventsAfterAction(async () => { + await request.page.waitForEventsAfterAction(async () => { await handle.asLocator().hover(); }); response.appendResponseLine(`Successfully hovered over the element`); @@ -217,7 +217,6 @@ async function fillFormElement( } } -// here export const fill = definePageTool({ name: 'fill', description: `Type text into a input, text area or select an option from a