@executeautomation/playwright-mcp-server
Version:
Model Context Protocol servers for Playwright
73 lines (72 loc) • 2.94 kB
JavaScript
import { createErrorResponse } from '../common/types.js';
/**
* Base class for all browser-based tools
* Provides common functionality and error handling
*/
export class BrowserToolBase {
constructor(server) {
this.server = server;
}
/**
* Ensures a page is available and returns it
* @param context The tool context containing browser and page
* @returns The page or null if not available
*/
ensurePage(context) {
if (!context.page) {
return null;
}
return context.page;
}
/**
* Validates that a page is available and returns an error response if not
* @param context The tool context
* @returns Either null if page is available, or an error response
*/
validatePageAvailable(context) {
if (!this.ensurePage(context)) {
return createErrorResponse("Browser page not initialized!");
}
return null;
}
/**
* Safely executes a browser operation with proper error handling
* @param context The tool context
* @param operation The async operation to perform
* @returns The tool response
*/
async safeExecute(context, operation) {
const pageError = this.validatePageAvailable(context);
if (pageError)
return pageError;
try {
// Verify browser is connected before proceeding
if (context.browser && !context.browser.isConnected()) {
// If browser exists but is disconnected, reset state
const { resetBrowserState } = await import('../../toolHandler.js');
resetBrowserState();
return createErrorResponse("Browser is disconnected. Please retry the operation.");
}
// Check if page is closed
if (context.page.isClosed()) {
return createErrorResponse("Page is closed. Please retry the operation.");
}
return await operation(context.page);
}
catch (error) {
const errorMessage = error.message;
// Check for common browser disconnection errors
if (errorMessage.includes("Target page, context or browser has been closed") ||
errorMessage.includes("Target closed") ||
errorMessage.includes("Browser has been disconnected") ||
errorMessage.includes("Protocol error") ||
errorMessage.includes("Connection closed")) {
// Reset browser state on connection issues
const { resetBrowserState } = await import('../../toolHandler.js');
resetBrowserState();
return createErrorResponse(`Browser connection error: ${errorMessage}. Connection has been reset - please retry the operation.`);
}
return createErrorResponse(`Operation failed: ${errorMessage}`);
}
}
}