UNPKG

@xtest-cli/cli

Version:

CLI for xtest.ing - AI-powered test generation platform

305 lines • 12.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.dual2Command = void 0; const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const axios_1 = __importDefault(require("axios")); const config_1 = require("../utils/config"); const playwright_1 = require("playwright"); let localBrowser = null; let localPage = null; let cloudSessionId = null; let config = null; async function ensureAuthenticated() { config = await (0, config_1.getConfig)(); if (!config.apiKey) { console.log(chalk_1.default.red('āŒ Not authenticated. Run: xtest auth')); process.exit(1); } } async function ensureSession() { if (!localBrowser || !cloudSessionId) { console.log(chalk_1.default.red('āŒ No active dual browser session. Run: xtest dual2 start')); process.exit(1); } } exports.dual2Command = new commander_1.Command('dual2') .description('Control both local and cloud browsers independently (v2)') .action(async () => { console.log('\n' + chalk_1.default.cyan.bold('šŸŽ­ Dual Browser Control v2')); console.log(chalk_1.default.gray('Control local and cloud browsers independently\n')); console.log(chalk_1.default.yellow('Commands:')); console.log(chalk_1.default.gray(' xtest dual2 start - Start both browsers')); console.log(chalk_1.default.gray(' xtest dual2 local - Control local browser')); console.log(chalk_1.default.gray(' xtest dual2 cloud - Control cloud browser')); console.log(chalk_1.default.gray(' xtest dual2 both - Control both browsers')); console.log(chalk_1.default.gray(' xtest dual2 stop - Stop both browsers\n')); }); // Start command exports.dual2Command .command('start') .description('Start both local and cloud browser sessions') .action(async () => { await ensureAuthenticated(); const spinner = (0, ora_1.default)('Starting dual browser control...').start(); try { // Start local browser spinner.text = 'Starting local browser...'; localBrowser = await playwright_1.chromium.launch({ headless: false, args: ['--start-maximized'], }); const context = await localBrowser.newContext({ viewport: null, }); localPage = await context.newPage(); // Start cloud browser spinner.text = 'Starting cloud browser...'; const response = await axios_1.default.post(`${config.serverUrl}/api/enhanced-browser/inspector/create`, { sessionId: `cloud-dual-${Date.now()}`, headless: false, devtools: false, }, { headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json', }, }); if (!response.data.success) { throw new Error('Failed to create cloud browser'); } cloudSessionId = response.data.sessionId; // Start streaming await axios_1.default.post(`${config.serverUrl}/api/enhanced-browser/start-stream`, { sessionId: cloudSessionId }, { headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json', }, }); spinner.succeed('Dual browser control started'); console.log('\n' + chalk_1.default.green('āœ… Both browsers ready!')); console.log(chalk_1.default.gray('šŸ“ Local browser: Open on your screen')); console.log(chalk_1.default.gray(`ā˜ļø Cloud browser: ${cloudSessionId}`)); console.log(chalk_1.default.gray('šŸŽ„ Cloud browser streaming to dashboard\n')); console.log(chalk_1.default.yellow('Quick commands:')); console.log(chalk_1.default.gray(' xtest dual2 local navigate https://example.com')); console.log(chalk_1.default.gray(' xtest dual2 cloud navigate https://google.com')); console.log(chalk_1.default.gray(' xtest dual2 both screenshot\n')); } catch (error) { spinner.fail('Failed to start dual browser control'); console.error(chalk_1.default.red(error.message)); process.exit(1); } }); // Local browser commands const localCommand = exports.dual2Command .command('local') .description('Control local browser'); localCommand .command('navigate <url>') .description('Navigate local browser to URL') .action(async (url) => { await ensureSession(); try { console.log(chalk_1.default.cyan(`[Local] Navigating to ${url}...`)); await localPage.goto(url); console.log(chalk_1.default.green('āœ… Local browser navigated')); } catch (error) { console.error(chalk_1.default.red('āŒ Failed:'), error.message); } }); localCommand .command('screenshot [filename]') .description('Take screenshot of local browser') .action(async (filename) => { await ensureSession(); try { const path = filename || `local-screenshot-${Date.now()}.png`; await localPage.screenshot({ path }); console.log(chalk_1.default.green(`āœ… Screenshot saved: ${path}`)); } catch (error) { console.error(chalk_1.default.red('āŒ Failed:'), error.message); } }); localCommand .command('click <selector>') .description('Click element in local browser') .action(async (selector) => { await ensureSession(); try { await localPage.click(selector); console.log(chalk_1.default.green(`āœ… Clicked ${selector} in local browser`)); } catch (error) { console.error(chalk_1.default.red('āŒ Failed:'), error.message); } }); // Cloud browser commands const cloudCommand = exports.dual2Command .command('cloud') .description('Control cloud browser'); cloudCommand .command('navigate <url>') .description('Navigate cloud browser to URL') .action(async (url) => { await ensureAuthenticated(); await ensureSession(); try { console.log(chalk_1.default.cyan(`[Cloud] Navigating to ${url}...`)); await axios_1.default.post(`${config.serverUrl}/api/enhanced-browser/inspector/navigate`, { sessionId: cloudSessionId, url }, { headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json', }, }); console.log(chalk_1.default.green('āœ… Cloud browser navigated')); } catch (error) { console.error(chalk_1.default.red('āŒ Failed:'), error.message); } }); cloudCommand .command('screenshot [filename]') .description('Take screenshot of cloud browser') .action(async (_filename) => { await ensureAuthenticated(); await ensureSession(); try { const response = await axios_1.default.post(`${config.serverUrl}/api/enhanced-browser/inspector/screenshot`, { sessionId: cloudSessionId }, { headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json', }, }); console.log(chalk_1.default.green('āœ… Cloud screenshot taken')); if (response.data.screenshot) { console.log(chalk_1.default.gray(`View at: ${config.serverUrl}${response.data.screenshot}`)); } } catch (error) { console.error(chalk_1.default.red('āŒ Failed:'), error.message); } }); // Both browsers commands const bothCommand = exports.dual2Command .command('both') .description('Control both browsers'); bothCommand .command('navigate <url>') .description('Navigate both browsers to URL') .action(async (url) => { await ensureAuthenticated(); await ensureSession(); console.log(chalk_1.default.cyan(`Navigating both browsers to ${url}...`)); // Navigate local try { await localPage.goto(url); console.log(chalk_1.default.green('āœ… Local browser navigated')); } catch (error) { console.error(chalk_1.default.red('āŒ Local failed:'), error.message); } // Navigate cloud try { await axios_1.default.post(`${config.serverUrl}/api/enhanced-browser/inspector/navigate`, { sessionId: cloudSessionId, url }, { headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json', }, }); console.log(chalk_1.default.green('āœ… Cloud browser navigated')); } catch (error) { console.error(chalk_1.default.red('āŒ Cloud failed:'), error.message); } }); bothCommand .command('screenshot') .description('Take screenshots from both browsers') .action(async () => { await ensureAuthenticated(); await ensureSession(); console.log(chalk_1.default.cyan('Taking screenshots from both browsers...')); // Local screenshot try { const localPath = `local-screenshot-${Date.now()}.png`; await localPage.screenshot({ path: localPath }); console.log(chalk_1.default.green(`āœ… Local screenshot: ${localPath}`)); } catch (error) { console.error(chalk_1.default.red('āŒ Local failed:'), error.message); } // Cloud screenshot try { await axios_1.default.post(`${config.serverUrl}/api/enhanced-browser/inspector/screenshot`, { sessionId: cloudSessionId }, { headers: { 'Authorization': `Bearer ${config.apiKey}`, 'Content-Type': 'application/json', }, }); console.log(chalk_1.default.green('āœ… Cloud screenshot taken')); } catch (error) { console.error(chalk_1.default.red('āŒ Cloud failed:'), error.message); } }); // Stop command exports.dual2Command .command('stop') .description('Stop both browsers') .action(async () => { await ensureAuthenticated(); console.log(chalk_1.default.yellow('Stopping dual browser control...')); // Close local browser if (localBrowser) { try { await localBrowser.close(); console.log(chalk_1.default.green('āœ… Local browser closed')); localBrowser = null; localPage = null; } catch (error) { console.error(chalk_1.default.red('Failed to close local browser')); } } // Close cloud browser if (cloudSessionId) { try { await axios_1.default.delete(`${config.serverUrl}/api/enhanced-browser/inspector/${cloudSessionId}`, { headers: { 'Authorization': `Bearer ${config.apiKey}`, }, }); console.log(chalk_1.default.green('āœ… Cloud browser closed')); cloudSessionId = null; } catch (error) { console.error(chalk_1.default.red('Failed to close cloud browser')); } } console.log(chalk_1.default.green('\nāœ… Dual browser control stopped')); }); // Demo command exports.dual2Command .command('demo') .description('Run a demo showing independent control') .action(async () => { console.log(chalk_1.default.cyan('\nšŸŽ¬ Dual Browser Demo\n')); console.log(chalk_1.default.yellow('1. Start both browsers:')); console.log(chalk_1.default.gray(' xtest dual2 start\n')); console.log(chalk_1.default.yellow('2. Navigate to different sites:')); console.log(chalk_1.default.gray(' xtest dual2 local navigate https://example.com')); console.log(chalk_1.default.gray(' xtest dual2 cloud navigate https://google.com\n')); console.log(chalk_1.default.yellow('3. Take screenshots:')); console.log(chalk_1.default.gray(' xtest dual2 both screenshot\n')); console.log(chalk_1.default.yellow('4. Stop when done:')); console.log(chalk_1.default.gray(' xtest dual2 stop\n')); }); //# sourceMappingURL=dual-v2.js.map