@xtest-cli/cli
Version:
CLI for xtest.ing - AI-powered test generation platform
221 lines ⢠9.55 kB
JavaScript
;
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