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