@executeautomation/playwright-mcp-server
Version:
Model Context Protocol servers for Playwright
68 lines (67 loc) • 2.65 kB
JavaScript
import { BrowserToolBase } from './base.js';
import { createSuccessResponse, createErrorResponse } from '../common/types.js';
const responsePromises = new Map();
/**
* Tool for setting up response wait operations
*/
export class ExpectResponseTool extends BrowserToolBase {
/**
* Execute the expect response tool
*/
async execute(args, context) {
return this.safeExecute(context, async (page) => {
if (!args.id || !args.url) {
return createErrorResponse("Missing required parameters: id and url must be provided");
}
const responsePromise = page.waitForResponse(args.url);
responsePromises.set(args.id, responsePromise);
return createSuccessResponse(`Started waiting for response with ID ${args.id}`);
});
}
}
/**
* Tool for asserting and validating responses
*/
export class AssertResponseTool extends BrowserToolBase {
/**
* Execute the assert response tool
*/
async execute(args, context) {
return this.safeExecute(context, async () => {
if (!args.id) {
return createErrorResponse("Missing required parameter: id must be provided");
}
const responsePromise = responsePromises.get(args.id);
if (!responsePromise) {
return createErrorResponse(`No response wait operation found with ID: ${args.id}`);
}
try {
const response = await responsePromise;
const body = await response.json();
if (args.value) {
const bodyStr = JSON.stringify(body);
if (!bodyStr.includes(args.value)) {
const messages = [
`Response body does not contain expected value: ${args.value}`,
`Actual body: ${bodyStr}`
];
return createErrorResponse(messages.join('\n'));
}
}
const messages = [
`Response assertion for ID ${args.id} successful`,
`URL: ${response.url()}`,
`Status: ${response.status()}`,
`Body: ${JSON.stringify(body, null, 2)}`
];
return createSuccessResponse(messages.join('\n'));
}
catch (error) {
return createErrorResponse(`Failed to assert response: ${error.message}`);
}
finally {
responsePromises.delete(args.id);
}
});
}
}