UNPKG

moizkhan-data-driven-test

Version:

A comprehensive data-driven test automation framework for Playwright with universal field detection, intelligent error validation, and bundled source code protection

297 lines (228 loc) 8.08 kB
# Data-Driven Test Framework for Playwright A comprehensive data-driven test automation framework for Playwright with universal field detection, intelligent error validation, and clean architectural separation. ## � Version 1.3.1 - Clean Architecture + Webpack Bundle This version introduces a clean separation of concerns and webpack bundling: - **BaseTestPage**: Handles field validation logic only - **Individual Page Classes**: Handle page-specific navigation - **Zero Hardcoded Values**: Complete genericization with JSON-driven configuration - **Webpack Bundle**: Minified and optimized for production use ## 📦 Installation ```bash npm install moizkhan-data-driven-test ``` ## 🎯 Key Features ### ✅ **Clean Architecture** - **Separation of Concerns**: Validation logic separated from navigation logic - **Page-Specific Navigation**: Each page handles its own next button selectors - **Generic Framework**: Zero hardcoded selectors, completely JSON-driven ### ✅ **Advanced Field Detection** - **Universal Field Detection**: Automatically detects input fields, dropdowns, textareas - **Label-Based Approach**: Finds fields by their associated labels - **Multiple Selector Strategies**: Handles various HTML structures and frameworks ### ✅ **Comprehensive Validation** - **Field-by-Field Testing**: Invalid → Valid approach for each field individually - **Enhanced Error Validation**: Intelligent error message matching and validation - **Visual Test Indicators**: Clear pass/fail indicators with detailed logging ### ✅ **Flexible Testing Modes** - **Full Validation Mode**: Complete invalid and valid input testing - **Positive-Only Mode**: Quick valid data filling for flow testing - **Custom Validation**: Targeted testing of specific fields or scenarios ## 📦 Installation ```bash npm install moizkhan-data-driven-test ``` ## 🚀 Quick Start ### 1. Import the Framework ```javascript const { BaseTestPage, DataDrivenTestPage } = require('moizkhan-data-driven-test'); ``` ### 2. Create Test Data ```json { "pageInfo": { "pageName": "Login", "url": "https://example.com/login" }, "selectors": { "userIdInput": "input[name='userId']", "passwordInput": "input[name='password']", "loginButton": "button[type='submit']" }, "credentials": { "admin": { "userId": "admin", "password": "password123", "description": "Admin account" } }, "fieldData": [ { "labelName": "User ID", "selector": "input[name='userId']", "validInputs": [ { "value": "admin", "description": "Valid admin user" } ], "invalidInputs": [ { "value": "", "description": "Empty user ID", "expectedError": "User ID is required" } ] } ] } ``` ### 3. Create Page Class ```javascript const { BaseTestPage } = require('moizkhan-data-driven-test'); class LoginPage extends BaseTestPage { constructor(page, testData) { super(page, testData, testData.pageInfo.pageName); this.loginUrl = testData.pageInfo.url; this.selectors = testData.selectors; this.credentials = testData.credentials; } async navigate() { await this.page.goto(this.loginUrl); } getNextButtonSelector() { return this.selectors.loginButton; } getSubmitButtonSelector() { return this.selectors.loginButton; } } ``` ### 4. Write Tests ```javascript const { test } = require('@playwright/test'); const loginTestData = require('./testData/loginTestData.json'); test('data-driven login test', async ({ page }) => { const loginPage = new LoginPage(page, loginTestData); // Run comprehensive validation tests await loginPage.runValidationTests(); // Run positive tests only await loginPage.runPositiveTestsOnly(); }); ``` ## 📋 API Reference ### BaseTestPage Main base class for page objects with data-driven capabilities. **Constructor:** - `constructor(page, testData, pageName)` **Abstract Methods:** - `getNextButtonSelector()` - Must return next button selector - `getSubmitButtonSelector()` - Must return submit button selector **Main Methods:** - `runValidationTests()` - Run invalid then valid input tests - `runPositiveTestsOnly()` - Fill all fields with valid data - `clickNext()` - Click next button using generic approach ### DataDrivenTestPage Core test execution engine with universal field handling. **Constructor:** - `constructor(page, testData)` **Methods:** - `testOneValidInput(field)` - Test single field with valid input - `applyBlurAndValidate(field, invalidInput)` - Test field validation - `clickNextButton(selector)` - Click button using provided selector - `compareErrorMessages(expected, actual)` - Advanced error comparison ### Utils Utility functions for the framework. **Methods:** - `validateTestData(testData)` - Validate test data structure - `mergeTestData(...testData)` - Merge multiple test data objects - `formatErrorMessage(error, context)` - Format error messages ## 🎯 Advanced Usage ### Generic Login Implementation ```javascript class GenericLoginPage extends BaseTestPage { constructor(page, testData) { super(page, testData, testData.pageInfo.pageName); this.loginUrl = testData.pageInfo.url; this.selectors = testData.selectors; this.credentials = testData.credentials; } async loginWithCredentials(credentialKey = 'admin') { const credential = this.credentials[credentialKey]; await this.page.goto(this.loginUrl); await this.page.fill(this.selectors.userIdInput, credential.userId); await this.page.fill(this.selectors.passwordInput, credential.password); await this.page.click(this.selectors.loginButton); } getNextButtonSelector() { return this.selectors.loginButton; } getSubmitButtonSelector() { return this.selectors.loginButton; } } ``` ### Multi-Page Flow Testing ```javascript const { mergeTestData } = require('moizkhan-data-driven-test'); // Merge test data from multiple pages const combinedTestData = mergeTestData( loginTestData, basicInfoTestData, businessDetailsTestData ); // Use in comprehensive flow tests test('complete user flow', async ({ page }) => { const flow = new UserFlow(page, combinedTestData); await flow.completeFullWorkflow(); }); ``` ## 🔧 Configuration ### Test Data Structure The framework expects test data in a specific JSON structure: ```typescript interface TestData { pageInfo?: { pageName?: string; url?: string; description?: string; }; selectors?: { [key: string]: string; }; credentials?: { [key: string]: { userId: string; password: string; description?: string; role?: string; }; }; fieldData: FieldData[]; } ``` ## 🎨 Benefits ### ✅ **Bundled Source Protection** - Source code is bundled and minified - Intellectual property protection - Clean distribution without exposing implementation ### ✅ **Complete Framework** - No hardcoded values anywhere - Fully configurable through JSON - Works with any web application ### ✅ **Advanced Features** - Intelligent error message comparison - Universal field detection - Visual pass/fail indicators - Comprehensive validation testing ### ✅ **Easy Integration** - Simple NPM installation - Clear API and documentation - TypeScript definitions included ## 📄 License MIT ## 🔗 Repository [GitHub Repository](https://github.com/moizkhan/data-driven-test) ## 🐛 Issues [Report Issues](https://github.com/moizkhan/data-driven-test/issues) --- **Note**: This is a bundled package with minified source code for intellectual property protection. The framework provides comprehensive testing capabilities while keeping the implementation details secure.