Skip to main content
Glama
test-stealth-browser.js9.33 kB
#!/usr/bin/env node /** * Stealth Browser Test - More realistic browser automation */ import { chromium } from 'playwright'; async function testStealthBrowser() { console.log('🥷 Testing with stealth browser configuration...'); const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImFkbWluLmRlc2Vudm9sdmltZW50b0BldWNvbnF1aXN0by5jb20iLCJuYW1lIjoiQWRtaW4gRGV2Iiwib2lkIjoiNWZiM2RlYzYtYzQ5NC1lYzExLWEyMmEtZGM5ODQwNDFjOTVkIiwiZGlyZWN0b3J5IjoiYjBmZWY4NjAtYzQ5NC1lYzExLWEyMmEtZGM5ODQwNDFjOTVkIiwiYXBpbSI6IkVFQzUzQTI0LUVDMEUtNDFCOS05NDA1LTg2QTE3NTAwREIzNCIsImRpcm4iOiJEZXNlbnZvbHZpbWVudG8iLCJyb2xlIjpbIlJldmlld0NvbnRyaWJ1dG9yIiwiQ29udHJpYnV0b3JHbG9iYWwiLCJBZG1pbmlzdHJhdG9yR2xvYmFsIl0sImRjbiI6WyJINHNJQUFBQUFBQUFBMkptWUdBd1pRQ0JaQXVqRkdNREM0dFYyMXRTRS1vZHA5NElpMnVVYTNqMXNxRXl6YWhrN3ZxWlN5MG5sLV94c3cyb0xEN05jT2ppRThWelhyZDBEamF3XzQyVW1fZmxrT1loZzlVN0ZKOGx5N1dWQVFBQUFQX18iLCJINHNJQUFBQUFBQUFBMkptWUdBd1pRQ0JaQXVqRkdNREM0c2xCWS0zTjB5WkU1S1NNSFhKTzhjcm0wNS1remgtYVBzTXhtMnZvOTBxYzhXTjktX08wRzRMbmo5dDRqb2R4bnZNdVkycHJEd1NrYlkyamJOMnpuNXJvemJmR3dBQUFQX18iLCJINHNJQUFBQUFBQUFBMkptWUdBd1pRQ0JaQXVqRkdNREM0dnpkMWU1SDFGTzVhenRyR1RuZXZ6emx0U0djM3VFT1IteHExWXZNVHF5NEstaThXR0gwd292cC1ka3FjNm82d2xSZkM0d3k5MVcxSHFqOFU4aEMtRWZMa0pSQUFBQUFQX18iLCJINHNJQUFBQUFBQUFBMkptWUdBd1pRQ0JaQXVqRkdNREM0dU5XMnUyS3A5dXZhUGhkOFNpOE9KNV8yTmRmZnNTSC0temZHTXVmX084Wm5GbXFXRE5qeE1ubnBWelRkVTBPVF9mUldtNVVhTkxlV2oyTjY5Y3JRS0x1SmJQQUFBQUFQX18iLCJINHNJQUFBQUFBQUFBMkptWUdBd1pRQ0JaQXVqRkdNREM0czY2NE5odVhwck52S3FiV1RuUEtGNTU2UzRycXdXNDJ1SnkzbjNGVkxFVjZ4VlljdU9kTnVrZXliMjdKbjRlOS1GaGNNdW1iOTZ1cUx0aEptSDJrX0h0U29MQUFBQUFQX18iLCJINHNJQUFBQUFBQUFBMkptWUdBd1pRQ0JaQXVqRkdNREN3dWpCWjhyQW81RUxEaHRvQ2ZUdmVQcTVET2hpd1dtM3A2eFktTDdIYkpTb2RFU2I2SUVWQ3BQcXpETTJ2WlR6VzlsMXBrWlBFb3Zkbl8tV3R2LWY0bkt3dmEtU0FBQUFBRF9fdyJdLCJzY3AiOlsiSDRzSUFBQUFBQUFBQTJKbVlHRHdZQUFCMDZRMDA5VFU1RlNKTmZzV1NKNDRWWGZBeHZYeDVEc3lzaFhPNmllVGk0cWVYbTZaVVN2QzZ2djNST0hNRDBkVHBDVHUzekFfVUMtWVVIOHIyMzNlS29mQ0hZR3UwWG83aWswWGROWVVxdmotV0hfclhiU3VVYnJZM1VZQUFBQUFfXzgiLCJINHNJQUFBQUFBQUFBd0RTQWkzOUF3QUFBck1BQUFBQUFHRTVaalF6TkRsa2E0TWozbjdQejY0dmpPSWl5LVlNb3dhRDdlMWpqcDZJakE2SVFZMi14TFNOTWFSZWNrTTdzWEJKamR2SkpoeUF5TnZJVHQ5aUFFWHcybVVzM3lIbGc2UHNtSld1Mm1EU2UwbXlrYnQ0OGl1NTlkYTIxMVBNdkxyRzdxOV9teDlhYWI0SjdZbWlNODg2OTVUclk3WFY1Nmlsb3UwdnQ4VmdBMWptbkdYd0paa0ZDTXhYaUlhcGl5S01TVGlfa3BnREdQdlRlYUNNdE5GSXlIU0gwUTZ3bTFwRkJBYzRMQ1dqRThMeWtnc1ZtbEJxRG9aek1oZTVnY21sZHl0VW1FVFltakIyakVaUHdvd0M2NFRZb1JudDJOWkpmRDdDZXg1T3FqY1ptVU5tNjMtVlRYOFh0UEtza1BpSnpIb3kzcHF5dXVycnVrTndZenducHpwak51OEdKZXQ4V2RoMl85ckNoVnpPUnR4N1N5UXEyb2prUmJfWEphenFtTnEwMEVTcTNSZUVSX0pQZmhGOGg4bGlxcGVWeE1FSG5RUGFmMXp2N3FVQ3JzTWtrVjd3NU5sOURWYU9DMnNLV2Q1TDdBNDYxUlFRSjVUNU5MMGQ2UGZqVWV4dkZTR0RQdW5jcHAxeDA0TlBOM2ttTmdMSlF3eDZLZjRxLVBZbDVXWmFQUTlXU0NLNHBmeHY3ZTJRZEw0X1IwQ1c3NUdQRHh1bEZQZG1tcmRrc0k2RVhqUTFkQTdkZlNFUnJoZHdvOUhCN0xGMzRYSENnMWg3Z2I4UWVKdmhMTXRjUmtlUzVpQkctOGNfNkdCQU9YUDdQR2ptQ1NUZzV2WGVyX0Rud3FkektCOFdtY1p0OXFjMXZpU0ROV1JHZVN0bHc3d250UzFSSXlBN205cS01YU9FLUx0ODB3bE1HTkxOTi1TVFN3OWVDN2dxVmQtSUZZWlhYQ2NZcWNfcWc1dDhodFdSLVJ2cUJsX3Fjbkt2N2xhaHk5elRTaHJfX1BTRWJqdTg0SkhDV3I5SXhGd2lzYVd1eVZiMUp0ZUQzcDk0WnpWZDhnTEJQRGFRVUJMZHc1SVEzWkJIc3daTXExRjJqVGdEcF92RDJLQzZzVnd1dVhaa3RzYWlrc3pMZW5NcTFUVjRUMmF5QUdyVHB3UlUzMFMwc3hfQ3pCRVlLREV0b2s4eDI5TGlnUnlHMnVfZDVpOHRyVEJ1WTNjVFdzSXVIdzRibXNVV1lkTXNwblRMMXpwNE1LWUFBQURfX3ciXSwibmJmIjoxNzQ4ODc2OTU1LCJleHAiOjE3NTE0Njg5NTUsImlhdCI6MTc0ODg3Njk1NSwiaXNzIjoiaHR0cHM6Ly9hcGkuZGlnaXRhbHBhZ2VzLmNvbS5iciIsImF1ZCI6IkV1Q29ucXVpc3RvIn0.iTUfl6-mwLwFaxYYPf6PufRSYbSJlw3tKejmbc5G42g"; const url = `https://composer.euconquisto.com/#/embed/auth-with-token/pt_br/home/36c92686-c494-ec11-a22a-dc984041c95d/${token}`; let browser, page; try { console.log('1️⃣ Launching stealth browser...'); browser = await chromium.launch({ headless: false, args: [ '--disable-blink-features=AutomationControlled', '--disable-features=VizDisplayCompositor', '--disable-web-security', '--disable-features=TranslateUI', '--disable-extensions', '--no-first-run', '--no-default-browser-check', '--disable-default-apps', '--disable-popup-blocking', '--disable-background-networking', '--disable-background-timer-throttling', '--disable-backgrounding-occluded-windows', '--disable-renderer-backgrounding', '--disable-dev-shm-usage', '--no-sandbox' ] }); const context = await browser.newContext({ viewport: { width: 1366, height: 768 }, userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' }); // Add script to remove webdriver property await context.addInitScript(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined, }); // Mock chrome property window.chrome = { runtime: {}, }; // Mock plugins Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5], }); // Mock languages Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'], }); }); page = await context.newPage(); // Page event logging page.on('console', msg => console.log(`CONSOLE: ${msg.text()}`)); page.on('pageerror', error => console.error(`PAGE ERROR: ${error.message}`)); console.log('2️⃣ Navigating to Composer...'); const response = await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 }); console.log(`✅ Navigation complete. Status: ${response?.status()}`); // Wait for content to load console.log('3️⃣ Waiting for page content...'); // Try multiple waiting strategies try { // Wait for any button to appear await page.waitForSelector('button', { timeout: 10000 }); console.log('✅ Button found'); } catch (e) { console.log('⚠️ No buttons found yet'); } try { // Wait for specific composer content await page.waitForSelector('[data-testid*="composer"], [class*="composer"], [id*="composer"]', { timeout: 5000 }); console.log('✅ Composer content found'); } catch (e) { console.log('⚠️ No composer-specific content found'); } // Check for NOVA COMPOSIÇÃO try { await page.waitForSelector('text=NOVA COMPOSIÇÃO', { timeout: 5000 }); console.log('🎉 SUCCESS: NOVA COMPOSIÇÃO button found!'); } catch (e) { console.log('❌ NOVA COMPOSIÇÃO button not found'); } // Page analysis const analysis = await page.evaluate(() => { const body = document.body; const buttons = document.querySelectorAll('button'); const links = document.querySelectorAll('a'); const inputs = document.querySelectorAll('input'); return { title: document.title, bodyText: body.textContent?.slice(0, 500) || '', buttonCount: buttons.length, linkCount: links.length, inputCount: inputs.length, hasAngular: !!window.angular, hasReact: !!window.React, hasVue: !!window.Vue, buttonTexts: Array.from(buttons).slice(0, 5).map(btn => btn.textContent?.trim()).filter(text => text) }; }); console.log('4️⃣ Page Analysis:'); console.log(` - Title: ${analysis.title}`); console.log(` - Buttons: ${analysis.buttonCount}`); console.log(` - Links: ${analysis.linkCount}`); console.log(` - Inputs: ${analysis.inputCount}`); console.log(` - Framework: Angular=${analysis.hasAngular}, React=${analysis.hasReact}, Vue=${analysis.hasVue}`); console.log(` - Button texts: [${analysis.buttonTexts.join(', ')}]`); console.log(` - Body preview: ${analysis.bodyText}`); // Screenshot const timestamp = Date.now(); await page.screenshot({ path: `stealth-test-${timestamp}.png`, fullPage: true }); console.log(`📸 Screenshot: stealth-test-${timestamp}.png`); // Keep browser open for observation console.log('5️⃣ Keeping browser open for 10 seconds for manual observation...'); await page.waitForTimeout(10000); } catch (error) { console.error('❌ Test failed:', error.message); } finally { if (browser) { await browser.close(); console.log('🔒 Browser closed'); } } } testStealthBrowser().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rkm097git/euconquisto-composer-mcp-poc'

If you have feedback or need assistance with the MCP directory API, please join our Discord server