@democratize-quality/mcp-server
Version:
MCP Server for democratizing quality through browser automation and comprehensive API testing capabilities
114 lines (95 loc) • 5.05 kB
JavaScript
// browserControl.js
const CDP = require('chrome-remote-interface');
const fs = require('fs');
const path = require('path'); // We need path for resolving userDataDir
async function automateBrowser() {
let chrome;
let client;
const { launch: launchChrome } = await import('chrome-launcher');
// Define your user data directory path
// IMPORTANT: Create this directory if it doesn't exist before running the script
const myUserDataDir = path.resolve(__dirname, './my_test_profile'); // This will create it in your project folder
try {
// Ensure the directory exists
if (!fs.existsSync(myUserDataDir)) {
fs.mkdirSync(myUserDataDir, { recursive: true });
console.log(`Created user data directory: ${myUserDataDir}`);
} else {
console.log(`Using existing user data directory: ${myUserDataDir}`);
}
console.log('Launching Chrome with remote debugging...');
chrome = await launchChrome({
port: 9222,
userDataDir: myUserDataDir, // <--- THE KEY CHANGE HERE
chromeFlags: [
// Set to false to see the browser UI
// For initial login, it's highly recommended to use false so you can interact
//'--headless=false', // Set this to 'new' or '' for headless mode once logged in
'--disable-gpu',
'--disable-setuid-sandbox',
'--no-sandbox'
]
});
console.log(`Chrome launched on port ${chrome.port} using profile: ${myUserDataDir}`);
client = await CDP({ port: chrome.port });
console.log('Connected to Chrome DevTools Protocol.');
const { Page, Runtime, DOM, Network } = client; // Also enable Network for potential cookie inspection later
await Page.enable();
await Runtime.enable();
await DOM.enable();
await Network.enable(); // Enable Network domain
console.log('Page, Runtime, DOM, and Network domains enabled.');
const url = 'https://www.saucedemo.com'; // You can change this to your company login page
console.log(`Navigating to: ${url}`);
await Page.navigate({ url: url });
await Page.loadEventFired();
console.log('Page loaded.');
// --- Authentication Step ---
// FIRST RUN:
// When you run this for the first time with `--headless=false`,
// a Chrome window will open. Manually navigate to your company's login page
// and sign in. Complete all login steps (username, password, MFA, SSO etc.).
// Once logged in, DO NOT close the browser manually.
// Let the script finish, or press Ctrl+C to trigger the finally block.
// The script will then close Chrome, and the session state will be saved
// in 'my_test_profile' directory.
// SUBSEQUENT RUNS:
// For subsequent runs, you can change `--headless=false` to `--headless=new`
// (or just remove it if you prefer `chrome-launcher`'s default headless behavior).
// Chrome will launch, load the saved profile, and you should be logged in automatically.
// You can then add your actual UI automation steps here, e.g., navigating to
// internal dashboards, filling forms, etc.
// Example: Wait for a few seconds so you can see the login happen
console.log('Waiting for 10 seconds (for manual login/observation)...');
await new Promise(resolve => setTimeout(resolve, 10000));
// After the wait, take a screenshot to verify login state
console.log('Taking screenshot after wait...');
const screenshot = await Page.captureScreenshot({ format: 'png', quality: 80 });
const screenshotBuffer = Buffer.from(screenshot.data, 'base64');
fs.writeFileSync('example_screenshot_after_login.png', screenshotBuffer);
console.log('Screenshot saved as example_screenshot_after_login.png');
console.log('Getting page title...');
const result = await Runtime.evaluate({ expression: 'document.title' });
const pageTitle = result.result.value;
console.log(`Page Title: "${pageTitle}"`);
console.log('Getting outer HTML...');
const documentNode = await DOM.getDocument({ depth: -1 });
const outerHTML = await DOM.getOuterHTML({ nodeId: documentNode.root.nodeId });
fs.writeFileSync('example_dom_after_login.html', outerHTML.outerHTML);
console.log('DOM saved as example_dom_after_login.html');
} catch (err) {
console.error('CRITICAL ERROR during browser automation:', err.message);
console.error('Details:', err);
} finally {
if (client) {
console.log('Disconnecting CDP client...');
client.close();
}
if (chrome) {
console.log('Closing launched Chrome instance...');
await chrome.kill();
console.log('Chrome instance closed.');
}
}
}
automateBrowser();