Files
MCP-Browser/browser.js
T

122 lines
2.1 KiB
JavaScript

const { chromium } = require('playwright');
let browser = null;
let context = null;
let page = null;
async function start() {
if (browser) return;
if (page) return;
browser = await chromium.launch({
headless: false,
args: ['--disable-blink-features=AutomationControlled']
});
context = await browser.newContext({
viewport: { width: 1280, height: 720 },
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
page = await context.newPage();
browser.on('disconnected', () => {
browser = null;
context = null;
page = null;
});
}
async function ensurePage() {
if (!browser) {
await start();
return page;
}
if (!page || page.isClosed()) {
page = await context.newPage();
}
return page;
}
async function goto(url) {
const p = await ensurePage();
await p.goto(url, {
waitUntil: 'domcontentloaded',
timeout: 30000
});
await p.waitForTimeout(1500);
}
async function click(selector) {
const p = await ensurePage();
await p.waitForSelector(selector, { state: 'visible', timeout: 10000 });
await p.click(selector);
}
async function type(selector, text) {
const p = await ensurePage();
await p.waitForSelector(selector, { state: 'visible', timeout: 10000 });
await p.fill(selector, text);
}
async function content() {
const p = await ensurePage();
return await p.content();
}
async function title() {
const p = await ensurePage();
return await p.title();
}
async function screenshot(path, fullPage = true) {
const p = await ensurePage();
await p.screenshot({ path, fullPage });
}
async function newTab() {
const p = await context.newPage();
page = p;
return p;
}
async function close() {
if (browser) {
try {
await browser.close();
} catch (e) {
}
browser = null;
context = null;
page = null;
}
}
module.exports = {
start,
goto,
click,
type,
content,
title,
screenshot,
close,
newTab,
ensurePage,
get page() {
return page;
},
get browser() {
return browser;
},
get context() {
return context;
}
};