Skip to content

Commit fb151ec

Browse files
gernbergOrKoN
authored andcommitted
Update formatting
1 parent 1ed8829 commit fb151ec

3 files changed

Lines changed: 75 additions & 3 deletions

File tree

docs/tool-reference.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@
160160
- **timeout** (integer) _(optional)_: Maximum wait time in milliseconds. If set to 0, the default timeout will be used.
161161
- **type** (enum: "url", "back", "forward", "reload") _(optional)_: Navigate the page by URL, back or forward in history, or reload.
162162
- **url** (string) _(optional)_: Target URL (only type=url)
163+
- **initScript** (string) _(optional)_: Script to execute whenever a page is navigated to.
163164

164165
---
165166

src/tools/pages.ts

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ export const navigatePage = defineTool({
136136
initScript: zod.string().optional().describe(
137137
`(optional) A JavaScript function to be executed by the tool on new document for every page load before any other scripts.
138138
`),
139+
initScript: zod
140+
.string()
141+
.optional()
142+
.describe(
143+
'(optional) A JavaScript function to be executed by the tool on new document for every page load before any other scripts.',
144+
),
139145
...timeoutSchema,
140146
},
141147
handler: async (request, response, context) => {
@@ -164,8 +170,66 @@ export const navigatePage = defineTool({
164170
}
165171
// We are not going to report the dialog like regular dialogs.
166172
context.clearDialog();
173+
if (request.params.initScript) {
174+
await page.evaluateOnNewDocument(request.params.initScript);
175+
}
176+
177+
await context.waitForEventsAfterAction(async () => {
178+
switch (request.params.type) {
179+
case 'url':
180+
if (!request.params.url) {
181+
throw new Error('A URL is required for navigation of type=url.');
182+
}
183+
try {
184+
await page.goto(request.params.url, options);
185+
response.appendResponseLine(
186+
`Successfully navigated to ${request.params.url}.`,
187+
);
188+
} catch (error) {
189+
response.appendResponseLine(
190+
`Unable to navigate in the selected page: ${error.message}.`,
191+
);
192+
}
193+
break;
194+
case 'back':
195+
try {
196+
await page.goBack(options);
197+
response.appendResponseLine(
198+
`Successfully navigated back to ${page.url()}.`,
199+
);
200+
} catch (error) {
201+
response.appendResponseLine(
202+
`Unable to navigate back in the selected page: ${error.message}.`,
203+
);
204+
}
205+
break;
206+
case 'forward':
207+
try {
208+
await page.goForward(options);
209+
response.appendResponseLine(
210+
`Successfully navigated forward to ${page.url()}.`,
211+
);
212+
} catch (error) {
213+
response.appendResponseLine(
214+
`Unable to navigate forward in the selected page: ${error.message}.`,
215+
);
216+
}
217+
break;
218+
case 'reload':
219+
try {
220+
await page.reload({
221+
...options,
222+
ignoreCache: request.params.ignoreCache,
223+
});
224+
response.appendResponseLine(`Successfully reloaded the page.`);
225+
} catch (error) {
226+
response.appendResponseLine(
227+
`Unable to reload the selected page: ${error.message}.`,
228+
);
229+
}
230+
break;
167231
}
168-
};
232+
});
169233

170234
if (request.params.initScript) {
171235
await page.evaluateOnNewDocument(request.params.initScript);

tests/tools/pages.test.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,14 +300,21 @@ describe('pages', () => {
300300
it('navigates to correct page with initScript', async () => {
301301
await withBrowser(async (response, context) => {
302302
await navigatePage.handler(
303-
{params: {url: 'data:text/html,<div>Hello MCP</div>', initScript: 'window.initScript = "completed"'}},
303+
{
304+
params: {
305+
url: 'data:text/html,<div>Hello MCP</div>',
306+
initScript: 'window.initScript = "completed"',
307+
},
308+
},
304309
response,
305310
context,
306311
);
307312
const page = context.getSelectedPage();
308313

309314
// wait for up to 1s for the global variable to set by the initScript to exist
310-
await page.waitForFunction("window.initScript==='completed'", {timeout: 1000});
315+
await page.waitForFunction("window.initScript==='completed'", {
316+
timeout: 1000,
317+
});
311318

312319
assert.ok(response.includePages);
313320
});

0 commit comments

Comments
 (0)