All files and folders in the Protractor Page Object Model project now follow industry-standard TypeScript/JavaScript naming conventions.
All folders use lowercase letters with hyphens to separate words.
Current Folder Structure:
Projects/Guru99BankTestAutomation/
├── config/ ✅ Configuration files
├── contracts/ ✅ Interface contracts (was: interfaces/)
├── exceptions/ ✅ Custom exceptions
├── exports/ ✅ Barrel export files
├── log-manager/ ✅ Logging utilities (was: LogManager/)
├── pages/ ✅ Page Object Model files
│ ├── actions/ ✅ Page action implementations
│ ├── base/ ✅ Base page classes
│ └── elements/ ✅ Element locators (was: locators/)
├── suites/ ✅ Test suites
├── test-cases/ ✅ Test specifications (was: TestCases/)
├── test-data/ ✅ Test data files (was: TestData/)
├── test-reports/ ✅ Generated reports (was: TestReports/)
└── utils/ ✅ Utility classes
Folder Renaming History:
Config/→config/Exception/→exceptions/Exports/→exports/Interface/→interfaces/→contracts/LogManager/→log-manager/Pages/→pages/Actions/→actions/BasePage/→base/Locators/→locators/→elements/
Suites/→suites/TestCases/→test-cases/TestData/→test-data/TestReports/→test-reports/Utils/→utils/
Files that export configuration objects or settings.
Examples:
config/config.ts(was:Config.ts)log-manager/log4jConfig.ts(was:ConfigLog4j.ts)suites/suites.ts(was:Suites.ts)
Pattern: Lowercase first letter, capitalize subsequent words Use Case: Configuration, settings, and suite definitions
Files that export test data objects or constants.
Examples:
test-data/testData.ts(was:Data.ts)
Pattern: Lowercase first letter, capitalize subsequent words Use Case: Test data, mock data, constants
Test specification files following Jasmine naming convention.
Examples:
test-cases/loginPage.spec.ts(was:LoginPageTest.ts)test-cases/homePage.spec.ts(was:HomePageTest.ts)test-cases/newCustomerPage.spec.ts(was:NewCustomerPageTest.ts)test-cases/editCustomerPage.spec.ts(was:EditCustomerPageTest.ts)test-cases/deleteCustomerPage.spec.ts(was:DeleteCustomerPageTest.ts)
Pattern: featureName.spec.ts
Use Case: All test files
Reason: .spec.ts is the standard Jasmine/Jest convention
TypeScript interfaces without the "I" prefix, using .contract.ts suffix.
Examples:
contracts/login.contract.ts(was:ILoginPage.ts)contracts/home.contract.ts(was:IHomePage.ts)contracts/newCustomer.contract.ts(was:INewCustomerPage.ts)contracts/editCustomer.contract.ts(was:IEditCustomerPage.ts)contracts/deleteCustomer.contract.ts(was:IDeleteCustomerPage.ts)contracts/testUtil.contract.ts(was:ITestUtil.ts)
Pattern: featureName.contract.ts
Use Case: All TypeScript interfaces
Reason: Modern TypeScript best practice, clearer file purpose
Migration: Removed Hungarian notation "I" prefix
Files containing element locators for pages.
Examples:
pages/elements/login.elements.ts(was:LoginPageLocators.ts)pages/elements/home.elements.ts(was:HomePageLocators.ts)pages/elements/newCustomer.elements.ts(was:NewCustomerPageLocators.ts)pages/elements/editCustomer.elements.ts(was:EditCustomerPageLocators.ts)pages/elements/deleteCustomer.elements.ts(was:DeleteCustomerPageLocators.ts)
Pattern: featureName.elements.ts
Use Case: Page element locators
Reason: More accurate than "locators" (they're Protractor ElementFinders)
Page Object Model implementation files.
Examples:
pages/actions/loginPage.page.ts(was:LoginPage.ts)pages/actions/homePage.page.ts(was:HomePage.ts)pages/actions/newCustomerPage.page.ts(was:NewCustomerPage.ts)pages/actions/editCustomerPage.page.ts(was:EditCustomerPage.ts)pages/actions/deleteCustomerPage.page.ts(was:DeleteCustomerPage.ts)pages/base/basePage.page.ts(was:Page.ts)
Pattern: pageName.page.ts
Use Case: All page object classes
Reason: Consistent with other suffixes (.spec.ts, .contract.ts, .elements.ts)
Utility classes that export singleton or static classes.
Examples:
utils/PageFactory.ts✅ (no change needed)utils/TestUtil.ts✅ (no change needed)log-manager/LogUtils.ts✅ (no change needed)
Pattern: ClassName.ts (PascalCase)
Use Case: Utility classes, helper classes
Reason: Classes should use PascalCase per TypeScript/JavaScript standard
Custom exception classes.
Examples:
exceptions/InvalidElementFinder.ts✅ (class name fixed fromInvaildElementFinder)
Pattern: ExceptionName.ts (PascalCase)
Use Case: Custom error/exception classes
Reason: Classes should use PascalCase per TypeScript/JavaScript standard
Re-export files that bundle exports from multiple modules.
Examples:
exports/interfaces.ts(was:ExportInterface.ts)exports/locators.ts(was:ExportLocators.ts)exports/pages.ts(was:ExportPages.ts)exports/utils.ts(was:ExportUtils.ts)
Pattern: pluralNoun.ts (camelCase, descriptive)
Use Case: Barrel/index files for re-exporting
Reason: Descriptive names, avoid "Export" prefix (redundant in exports/ folder)
| Old Name (Typo) | New Name (Fixed) |
|---|---|
INewCostumerPage.ts |
INewCustomerPage.ts |
IEditCostumerPage.ts |
IEditCustomerPage.ts |
NewCostumerPage.ts |
NewCustomerPage.ts |
EditCostumerPage.ts |
EditCustomerPage.ts |
NewCostumerPageLocators.ts |
NewCustomerPageLocators.ts |
EditCostumerPageLocators.ts |
EditCustomerPageLocators.ts |
NewCostumerPageTest.ts |
NewCustomerPageTest.ts |
EditCostumerPageTest.ts |
EditCustomerPageTest.ts |
All folders renamed from PascalCase to kebab-case (see Folder Structure above)
| Old Name | New Name |
|---|---|
Config.ts |
config.ts |
ConfigLog4j.ts |
log4jConfig.ts |
Suites.ts |
suites.ts |
Data.ts |
testData.ts |
| Old Name | New Name |
|---|---|
LoginPageTest.ts |
loginPage.spec.ts |
HomePageTest.ts |
homePage.spec.ts |
NewCustomerPageTest.ts |
newCustomerPage.spec.ts |
EditCustomerPageTest.ts |
editCustomerPage.spec.ts |
DeleteCustomerPageTest.ts |
deleteCustomerPage.spec.ts |
| Old Name | New Name |
|---|---|
ExportInterface.ts |
interfaces.ts |
ExportLocators.ts |
locators.ts |
ExportPages.ts |
pages.ts |
ExportUtils.ts |
utils.ts |
| Old Name | New Name |
|---|---|
ILoginPage.ts |
login.contract.ts |
IHomePage.ts |
home.contract.ts |
INewCustomerPage.ts |
newCustomer.contract.ts |
IEditCustomerPage.ts |
editCustomer.contract.ts |
IDeleteCustomerPage.ts |
deleteCustomer.contract.ts |
ITestUtil.ts |
testUtil.contract.ts |
Folder Rename: interfaces/ → contracts/
| Old Name | New Name |
|---|---|
LoginPageLocators.ts |
login.elements.ts |
HomePageLocators.ts |
home.elements.ts |
NewCustomerPageLocators.ts |
newCustomer.elements.ts |
EditCustomerPageLocators.ts |
editCustomer.elements.ts |
DeleteCustomerPageLocators.ts |
deleteCustomer.elements.ts |
Folder Rename: pages/locators/ → pages/elements/
| Old Name | New Name |
|---|---|
LoginPage.ts |
loginPage.page.ts |
HomePage.ts |
homePage.page.ts |
NewCustomerPage.ts |
newCustomerPage.page.ts |
EditCustomerPage.ts |
editCustomerPage.page.ts |
DeleteCustomerPage.ts |
deleteCustomerPage.page.ts |
Page.ts (base) |
basePage.page.ts |
Bug Fix: InvaildElementFinder → InvalidElementFinder (class name)
- Files Renamed: 38 files
- Folders Renamed: 14 folders
- Typos Fixed: 8 file names + 1 class name
- Import Statements Updated: 100+ references
- Git Commits Created: 10 commits
- TypeScript Errors: 0 ✅
- Test Files (.spec.ts): 5 files
- Contract Files (.contract.ts): 6 files
- Element Files (.elements.ts): 5 files
- Page Files (.page.ts): 6 files
- Config Files (camelCase.ts): 4 files
- Export Files (camelCase.ts): 4 files
- Utility Classes (PascalCase.ts): 3 files
- Exception Classes (PascalCase.ts): 1 file
- All folders use kebab-case
- Folder names are descriptive and meaningful
- No PascalCase or camelCase folders remain
- Folder names accurately reflect their contents
- Test files use
.spec.tssuffix - Interface files use
.contract.tssuffix - Element locator files use
.elements.tssuffix - Page class files use
.page.tssuffix - Config files use camelCase
- Utility classes use PascalCase (match class name)
- No Hungarian notation ("I" prefix) on interfaces
- File names accurately describe their purpose
- All imports updated after renames
- TypeScript compiles without errors
- No typos in file names or class names
- Consistent naming across entire project
- All changes committed to git with descriptive messages
- README.md updated with correct structure
- CONTRIBUTING.md includes naming conventions
- PROJECT_IMPROVEMENTS.md documents all changes
- This summary document created for reference
✅ Immediate file type recognition (via suffixes like .spec.ts, .page.ts) ✅ Faster file navigation (predictable naming patterns) ✅ Reduced cognitive load (consistent conventions) ✅ Better IDE support (standard file types)
✅ Industry-standard compliance (TypeScript/JavaScript best practices) ✅ Improved maintainability (clear file organization) ✅ Enhanced collaboration (familiar conventions for new contributors) ✅ Professional appearance (modern naming standards)
✅ Zero TypeScript errors (all references updated correctly) ✅ Complete git history (all renames tracked properly) ✅ Comprehensive documentation (this guide and others) ✅ Future-proof structure (follows evolving standards)
For more details on specific aspects:
- Project Setup: See README.md
- Contributing: See CONTRIBUTING.md
- All Improvements: See PROJECT_IMPROVEMENTS.md
- Coding Standards: See CONTRIBUTING.md
- Quick Fixes: See QUICK_FIX_GUIDE.md
Follow these patterns:
| File Type | Naming Pattern | Example |
|---|---|---|
| Test | featureName.spec.ts |
checkout.spec.ts |
| Interface | featureName.contract.ts |
checkout.contract.ts |
| Elements | featureName.elements.ts |
checkout.elements.ts |
| Page | featureName.page.ts |
checkoutPage.page.ts |
| Config | configName.ts |
environment.ts |
| Utility | UtilityName.ts |
DateHelper.ts |
| Exception | ExceptionName.ts |
TimeoutError.ts |
- Always use kebab-case:
new-feature,api-tests - Make names descriptive: Avoid abbreviations
- Keep structure flat: Avoid deep nesting (max 3-4 levels)
-
macOS File System: Case-insensitive but case-preserving. Git properly tracks case-only renames using
git mvor manual mv + git add. -
Compiled JavaScript: The compiled e2e_tests/ folder reflects all naming changes automatically via TypeScript compilation.
-
Import Statements: TypeScript can omit
.tsextension in imports, but the full file name (including suffix like.page.ts) is recommended for clarity. -
Class Names: Class names remain in PascalCase (e.g.,
LoginPage,HomePage) even though file names are camelCase. This follows TypeScript/JavaScript convention where classes use PascalCase. -
Export Statements: When importing, you don't need to specify the class name if it matches the export:
import { LoginPage } from "../pages/actions/loginPage.page"; // LoginPage class is exported from loginPage.page.ts
Project Status: 🎉 Fully Standardized and Production Ready
Last Updated: January 16, 2025 Maintained By: Project Contributors Version: 2.0 (Post-Standardization)