playwright-test-generator
Version:
Automated Page Object and Functional Test Generator for Playwright
178 lines โข 8.85 kB
JavaScript
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
;