UNPKG

@xtest-cli/cli

Version:

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

221 lines • 9.55 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.dualCommand = void 0; const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const dual_controller_1 = require("../browser/dual-controller"); const config_1 = require("../utils/config"); let controller = null; exports.dualCommand = new commander_1.Command('dual') .description('Control both local and cloud browsers independently') .action(async () => { console.log('\n' + chalk_1.default.cyan.bold('šŸŽ­ Dual Browser Control Mode')); console.log(chalk_1.default.gray('Control local and cloud browsers independently\n')); }); // Start dual browser session exports.dualCommand .command('start') .description('Start both local and cloud browser sessions') .option('-s, --session <id>', 'Session ID', `dual-${Date.now()}`) .option('-b, --browser <type>', 'Local browser type', 'chromium') .option('--headless', 'Run local browser in headless mode', false) .action(async (options) => { try { const config = await (0, config_1.getConfig)(); if (!config.apiKey) { console.log(chalk_1.default.red('āŒ Not authenticated. Run: xtest auth')); process.exit(1); } const spinner = (0, ora_1.default)('Starting dual browser control...').start(); controller = new dual_controller_1.DualBrowserController({ sessionId: options.session, serverUrl: config.serverUrl, apiKey: config.apiKey, localBrowserOptions: { browserType: options.browser, headless: options.headless, devtools: false, slowMo: 100, }, }); await controller.start(); spinner.succeed('Dual browser control started'); console.log('\n' + chalk_1.default.green('✨ Ready for commands!')); console.log(chalk_1.default.gray('Use "xtest dual <command>" to control browsers\n')); // Keep process alive process.on('SIGINT', async () => { console.log('\n' + chalk_1.default.yellow('Shutting down...')); if (controller) { await controller.stop(); } process.exit(0); }); } catch (error) { console.error(chalk_1.default.red('āŒ Failed to start:'), error.message); process.exit(1); } }); // Navigate command exports.dualCommand .command('navigate <url>') .description('Navigate browser(s) to a URL') .option('-t, --target <target>', 'Target browser: local, cloud, or both', 'both') .action(async (url, options) => { if (!controller) { console.log(chalk_1.default.red('āŒ No active session. Run: xtest dual start')); return; } try { const target = { type: options.target }; await controller.navigate(target, url); console.log(chalk_1.default.green(`āœ… Navigated ${options.target} browser(s) to ${url}`)); } catch (error) { console.error(chalk_1.default.red('āŒ Navigation failed:'), error.message); } }); // Click command exports.dualCommand .command('click <selector>') .description('Click an element in browser(s)') .option('-t, --target <target>', 'Target browser: local, cloud, or both', 'both') .action(async (selector, options) => { if (!controller) { console.log(chalk_1.default.red('āŒ No active session. Run: xtest dual start')); return; } try { const target = { type: options.target }; await controller.click(target, selector); console.log(chalk_1.default.green(`āœ… Clicked ${selector} in ${options.target} browser(s)`)); } catch (error) { console.error(chalk_1.default.red('āŒ Click failed:'), error.message); } }); // Type command exports.dualCommand .command('type <selector> <text>') .description('Type text in an input field') .option('-t, --target <target>', 'Target browser: local, cloud, or both', 'both') .action(async (selector, text, options) => { if (!controller) { console.log(chalk_1.default.red('āŒ No active session. Run: xtest dual start')); return; } try { const target = { type: options.target }; await controller.type(target, selector, text); console.log(chalk_1.default.green(`āœ… Typed in ${selector} in ${options.target} browser(s)`)); } catch (error) { console.error(chalk_1.default.red('āŒ Type failed:'), error.message); } }); // Screenshot command exports.dualCommand .command('screenshot [filename]') .description('Take screenshot(s)') .option('-t, --target <target>', 'Target browser: local, cloud, or both', 'both') .action(async (filename, options) => { if (!controller) { console.log(chalk_1.default.red('āŒ No active session. Run: xtest dual start')); return; } try { const target = { type: options.target }; await controller.screenshot(target, filename); console.log(chalk_1.default.green(`āœ… Screenshot(s) saved from ${options.target} browser(s)`)); } catch (error) { console.error(chalk_1.default.red('āŒ Screenshot failed:'), error.message); } }); // Info command exports.dualCommand .command('info') .description('Get page info from browser(s)') .option('-t, --target <target>', 'Target browser: local, cloud, or both', 'both') .action(async (options) => { if (!controller) { console.log(chalk_1.default.red('āŒ No active session. Run: xtest dual start')); return; } try { const target = { type: options.target }; const info = await controller.getPageInfo(target); if (info.local) { console.log(chalk_1.default.cyan('\nšŸ“ Local Browser:')); console.log(chalk_1.default.gray(` URL: ${info.local.url}`)); console.log(chalk_1.default.gray(` Title: ${info.local.title}`)); } if (info.cloud) { console.log(chalk_1.default.cyan('\nā˜ļø Cloud Browser:')); console.log(chalk_1.default.gray(` URL: ${info.cloud.url}`)); console.log(chalk_1.default.gray(` Title: ${info.cloud.title}`)); } } catch (error) { console.error(chalk_1.default.red('āŒ Info failed:'), error.message); } }); // Demo command exports.dualCommand .command('demo') .description('Run a demo showing independent control') .action(async () => { if (!controller) { console.log(chalk_1.default.red('āŒ No active session. Run: xtest dual start')); return; } console.log(chalk_1.default.cyan('\nšŸŽ¬ Running Dual Browser Demo...\n')); try { // Navigate to different sites console.log(chalk_1.default.yellow('1. Opening different websites...')); await controller.navigate({ type: 'local' }, 'https://example.com'); await controller.navigate({ type: 'cloud' }, 'https://google.com'); console.log(chalk_1.default.green('āœ… Local: example.com | Cloud: google.com')); await new Promise(resolve => setTimeout(resolve, 3000)); // Take screenshots console.log(chalk_1.default.yellow('\n2. Taking screenshots...')); await controller.screenshot({ type: 'both' }, 'demo.png'); console.log(chalk_1.default.green('āœ… Screenshots saved')); // Get info console.log(chalk_1.default.yellow('\n3. Getting page info...')); await controller.getPageInfo({ type: 'both' }); console.log(chalk_1.default.green('āœ… Page info retrieved')); console.log(chalk_1.default.cyan('\n✨ Demo complete! Both browsers are independently controlled.')); } catch (error) { console.error(chalk_1.default.red('āŒ Demo failed:'), error.message); } }); // Examples exports.dualCommand .command('examples') .description('Show usage examples') .action(() => { console.log(chalk_1.default.cyan('\nšŸ“š Dual Browser Control Examples:\n')); console.log(chalk_1.default.white('Start dual browser session:')); console.log(chalk_1.default.gray(' xtest dual start\n')); console.log(chalk_1.default.white('Navigate both browsers:')); console.log(chalk_1.default.gray(' xtest dual navigate https://example.com\n')); console.log(chalk_1.default.white('Navigate only local browser:')); console.log(chalk_1.default.gray(' xtest dual navigate https://example.com --target local\n')); console.log(chalk_1.default.white('Navigate only cloud browser:')); console.log(chalk_1.default.gray(' xtest dual navigate https://google.com --target cloud\n')); console.log(chalk_1.default.white('Click in both browsers:')); console.log(chalk_1.default.gray(' xtest dual click "button.submit"\n')); console.log(chalk_1.default.white('Type in cloud browser only:')); console.log(chalk_1.default.gray(' xtest dual type "input[name=search]" "test query" --target cloud\n')); console.log(chalk_1.default.white('Take screenshots from both:')); console.log(chalk_1.default.gray(' xtest dual screenshot\n')); console.log(chalk_1.default.white('Run the demo:')); console.log(chalk_1.default.gray(' xtest dual demo\n')); }); //# sourceMappingURL=dual.js.map