UNPKG

playwright-test-generator

Version:

Automated Page Object and Functional Test Generator for Playwright

178 lines โ€ข 8.85 kB
#!/usr/bin/env node "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateFunctionalTestsCLI = generateFunctionalTestsCLI; const commander_1 = require("commander"); const inquirer_1 = __importDefault(require("inquirer")); const chalk_1 = __importDefault(require("chalk")); const test_1 = require("@playwright/test"); const path = __importStar(require("path")); // Added missing import const PageObjectGenerator_1 = require("../generators/PageObjectGenerator"); const TestScenarioGenerator_1 = require("../generators/TestScenarioGenerator"); // Fixed case - capital T const NavigationHelper_1 = require("../generators/NavigationHelper"); // Added missing import const TestSetup_1 = require("../utils/TestSetup"); // Added missing import const EnvironmentConfig_1 = require("../utils/EnvironmentConfig"); // Added missing import const program = new commander_1.Command(); program .name('generate-functional-tests') .description('Generate comprehensive functional tests for Playwright') .version('1.0.0') .option('-e, --env <environment>', 'Environment (dev, qa, prod)', 'qa') .option('-h, --headless', 'Run in headless mode', false) .option('-d, --depth <number>', 'Test depth (1 or 2)', '1') .option('-o, --output <path>', 'Output directory') .action(async (options) => { await generateFunctionalTestsCLI(options); }); async function generateFunctionalTestsCLI(options = {}) { console.log(chalk_1.default.blue('๐Ÿงช Playwright Functional Test Generator')); console.log(chalk_1.default.gray('========================================\n')); try { // Load environment configuration const envConfig = new EnvironmentConfig_1.EnvironmentConfig(options.env); const config = await envConfig.load(); if (!envConfig.validateConfig(config)) { console.log(chalk_1.default.yellow('\n๐Ÿ’ก Please ensure your environment variables are set correctly.')); console.log(chalk_1.default.gray(`Example .env.${options.env} file:`)); console.log(chalk_1.default.gray(`${options.env.toUpperCase()}_APP_URL=https://your-app.com`)); console.log(chalk_1.default.gray(`${options.env.toUpperCase()}_USERNAME=testuser`)); console.log(chalk_1.default.gray(`${options.env.toUpperCase()}_PASSWORD=testpass`)); return; } // Interactive prompts const answers = await inquirer_1.default.prompt([ { type: 'input', name: 'pageName', message: 'Enter the page name to test (e.g., "User Management"):', validate: (input) => input.length > 0 || 'Page name is required' }, { type: 'list', name: 'navigationPath', message: 'Select navigation path:', choices: [ ...Object.keys(NavigationHelper_1.NavigationHelper.getNavigationPaths()), 'custom' ] }, { type: 'input', name: 'outputDir', message: 'Output directory:', default: options.output || './tests', when: !options.output } ]); console.log(chalk_1.default.yellow('\n๐Ÿš€ Launching browser...')); const browser = await test_1.chromium.launch({ headless: options.headless }); const context = await browser.newContext(); const page = await browser.newPage(); try { // Setup and navigate const testSetup = new TestSetup_1.TestSetup(page, context); await testSetup.setup({ baseUrl: config.baseUrl, username: config.username, password: config.password, clearStorage: true, waitForNetworkIdle: true }); // Navigate to target page if (answers.navigationPath !== 'custom') { console.log(chalk_1.default.yellow(`๐Ÿงญ Navigating to target page via: ${answers.navigationPath}`)); try { await NavigationHelper_1.NavigationHelper.navigateToPath(page, answers.navigationPath); } catch (error) { console.log(chalk_1.default.yellow('โš ๏ธ Navigation failed, please navigate manually')); await inquirer_1.default.prompt([{ type: 'input', name: 'continue', message: 'Press Enter when you\'re on the target page...' }]); } } else { console.log(chalk_1.default.yellow('\nโณ Please manually navigate to the target page...')); await inquirer_1.default.prompt([{ type: 'input', name: 'continue', message: 'Press Enter when you\'re on the target page...' }]); } // Show current page info const currentUrl = page.url(); const pageTitle = await page.title(); console.log(chalk_1.default.blue(`\n๐Ÿ“„ Current Page:`)); console.log(chalk_1.default.gray(` URL: ${currentUrl}`)); console.log(chalk_1.default.gray(` Title: ${pageTitle}`)); // Generate page object and analyze elements console.log(chalk_1.default.yellow('\n๐Ÿ” Analyzing page and generating page object...')); const outputDir = answers.outputDir || options.output || './tests'; const pageObjectGenerator = new PageObjectGenerator_1.PageObjectGenerator(page); await pageObjectGenerator.generatePageObject(answers.pageName, path.join(outputDir, 'pageObjects')); const elements = await pageObjectGenerator.analyzePage(); // Generate test scenarios console.log(chalk_1.default.yellow('\n๐Ÿงช Generating test scenarios...')); const testGenerator = new TestScenarioGenerator_1.TestScenarioGenerator(page, outputDir); const scenarios = await testGenerator.generateTestScenarios(answers.pageName, elements); // Generate test file console.log(chalk_1.default.yellow('\n๐Ÿ“ Generating test file...')); const testFilePath = await testGenerator.saveTestFile(scenarios, answers.pageName); // Summary console.log(chalk_1.default.green('\n๐ŸŽ‰ Functional test generation completed!')); console.log(chalk_1.default.gray(`๐Ÿ“ Test file: ${testFilePath}`)); console.log(chalk_1.default.gray(`๐Ÿงช Test scenarios: ${scenarios.length}`)); console.log(chalk_1.default.gray(` โœ… Positive: ${scenarios.filter(s => s.type === 'positive').length}`)); console.log(chalk_1.default.gray(` โŒ Negative: ${scenarios.filter(s => s.type === 'negative').length}`)); } finally { await browser.close(); } } catch (error) { console.error(chalk_1.default.red('โŒ Error:'), error); process.exit(1); } } if (require.main === module) { program.parse(); } //# sourceMappingURL=generateFunctionalTests.js.map