tests/ ├── test_login.py ├── test_checkout.py page_objects/ ├── base_page.py ├── login_page.py ├── checkout_page.py utilities/ ├── browser_factory.py ├── config_reader.py ├── logger.py reports/ ├── html_reports/ │ └── report_2024_06_01.html ├── logs/ │ └── test_log_2024_06_01.log configs/ ├── config.yaml ├── environments.yaml conftest.py pytest.ini
Why advanced patterns solve real challenges in Selenium Python - Framework Benefits
- Driver Layer: Manages browser setup and teardown using
browser_factory.py. - Page Objects: Encapsulate page elements and actions in classes like
login_page.py. This hides Selenium details from tests. - Tests: Test scripts in
tests/use page objects to perform user actions and assertions. - Utilities: Helpers for configuration reading, logging, and browser management.
- Configuration: YAML files store environment URLs, credentials, and browser choices.
Use YAML files to separate environment data from code. For example, environments.yaml holds URLs for dev, staging, and production.
config_reader.py loads these settings. Tests select environment via command line or environment variables.
Browser choice is configurable to run tests on Chrome, Firefox, or headless modes.
Credentials are stored securely outside code, loaded at runtime.
Use Pytest's built-in reporting with plugins like pytest-html to generate readable HTML reports saved in reports/html_reports/.
Logs are captured by logger.py and saved in reports/logs/ for debugging.
CI/CD pipelines (e.g., GitHub Actions, Jenkins) run tests automatically on code changes, publishing reports and logs for team review.
- Page Object Model: Keeps tests clean by separating UI details from test logic.
- DRY (Don't Repeat Yourself): Reuse code in utilities and page objects to avoid duplication.
- Explicit Waits: Use Selenium waits to handle dynamic page elements reliably.
- Configurable Environments: Easily switch between dev, staging, and production without code changes.
- Clear Reporting: Provide readable reports and logs to quickly find test failures.
Where would you add a new page object for the "User Profile" page in this framework structure?