Introduction
Introduction
Welcome to Promethee-Selenium. This professional-grade library provides a structured, scalable way to write UI tests using Selenium and Pytest, implementing the Page Object Model (POM) pattern.
It acts as a wrapper around the selenium-ui-test-tool library to provide a
high-level, opinionated architecture for robust test automation.
Bienvenue sur Promethee-Selenium. Cette librairie de niveau professionnel fournit une méthode structurée et évolutive pour écrire des tests d'interface utilisateur avec Selenium et Pytest, en implémentant le modèle Page Object Model (POM).
Elle agit comme une surcouche (wrapper) autour de la librairie selenium-ui-test-tool
pour offrir une architecture d'automatisation robuste.
Getting Started
Démarrage Rapide
1. Installation
Install the package via pip:
pip install promethee-selenium
2. Initialization
To initialize a new project with the recommended structure, run:
promethee-selenium init
To view the documentation in your browser:
promethee-selenium docs
1. Installation
Installez le paquet via pip :
pip install promethee-selenium
2. Initialisation
Pour initialiser un nouveau projet avec la structure recommandée, lancez :
promethee-selenium init
Pour afficher la documentation dans votre navigateur :
promethee-selenium docs
Philosophy & Architecture
Philosophie & Architecture
The Prométhée Philosophy
La Philosophie Prométhée
Prométhée is built on three core principles:
- Separation of Concerns: Tests should describe what to test (business logic), while Page Objects describe how to interact with the page (implementation details).
- Composition over Inheritance: Use the robust functional API of
selenium-ui-test-toolinside your Page Objects, rather than creating deep inheritance chains. - Data-Driven: Test data and execution logic should be decoupled.
Prométhée est bâti sur trois principes clés :
- Séparation des responsabilités : Les tests décrivent quoi tester (logique métier), tandis que les Page Objects décrivent comment interagir avec la page (détails d'implémentation).
- Composition plutôt qu'Héritage : Utilisez l'API fonctionnelle robuste de
selenium-ui-test-toolà l'intérieur de vos Page Objects, plutôt que de créer des chaînes d'héritage complexes. - Piloté par les données : Les données de test et la logique d'exécution doivent être découplées.
Recommended Project Structure
Structure de Projet Recommandée
When you run promethee-selenium init, we create a structure designed for
scalability:
Lorsque vous lancez promethee-selenium init, nous créons une structure conçue pour
l'évolutivité :
my_project/
├── scenarios/ # Your Page Objects (The "How")
│ └── login_page.py
├── tests/ # Your Test Scripts (The "What")
│ └── test_login.py
├── data/ # Test Data (CSV, JSON)
│ └── credentials.csv
├── utils/ # Custom Helpers
│ └── scenario_provider.py
└── conftest.py # Test Configuration & Lifecycle
Understanding Scaffolded Components
Comprendre les Composants Générés
1. conftest.py
1. conftest.py
This is the heartbeat of your test suite. It uses Pytest fixtures to manage the browser lifecycle.
What it does: It automatically starts the browser driver before your test runs
and closes it immediately after, ensuring a clean state for every test. You don't need to write
driver = WebDriver() or driver.quit() yourself.
C'est le cœur de votre suite de tests. Il utilise les fixtures Pytest pour gérer le cycle de vie du navigateur.
Ce qu'il fait : Il démarre automatiquement le driver du navigateur avant votre
test et le ferme immédiatement après, garantissant un état propre pour chaque test. Vous n'avez
pas besoin d'écrire driver = WebDriver() ou driver.quit() vous-même.
2. utils/scenario_provider.py
2. utils/scenario_provider.py
Hardcoding credentials in scripts is a security risk. The ScenarioProvider solves
this.
What it does: It reads a CSV file (like data/credentials.csv),
loads specific rows based on a scenario key, and injects sensitive values into environment
variables at runtime. This allows you to switch environments (staging/prod) without changing
code.
Coder des identifiants en dur dans les scripts est un risque de sécurité. Le
pip install promethee-seleniumésout ce problème.
Ce qu'il fait : Il lit un fichier CSV (comme data/credentials.csv),
charge des lignes spécifiques basées sur une clé de scénario, et injecte les valeurs sensibles
dans des variables d'environnement au moment de l'exécution. Cela vous permet de changer
d'environnement (staging/prod) sans toucher au code.
Tutorial: Writing a Test
Tutoriel : Écrire un Test
This tutorial guides you through creating a robust, data-driven test using Prométhée's architecture. We will build a login test.
Ce tutoriel vous guide dans la création d'un test robuste et piloté par les données en utilisant l'architecture de Prométhée. Nous allons créer un test de connexion.
Step 1: Prepare Test Data
Étape 1 : Préparer les Données de Test
First, define your test data in data/credentials.csv. This keeps sensitive data out
of your code.
Tout d'abord, définissez vos données de test dans data/credentials.csv. Cela garde
les données sensibles hors de votre code.
scenario,email,password
login_success,user@test.com,securePass123
login_failure,bad@test.com,wrongPass
Step 2: Configure Test Lifecycle
Étape 2 : Configurer le Cycle de Vie des Tests
The conftest.py file manages the browser lifecycle using Pytest fixtures. It ensures
the browser starts before tests and closes afterwards.
Your conftest.py should import the driver from `promethee`:
Le fichier conftest.py gère le cycle de vie du navigateur à l'aide des fixtures
Pytest. Il s'assure que le navigateur démarre avant les tests et se ferme après.
Votre conftest.py doit importer le driver depuis `promethee` :
import pytest
from promethee.conftest import driver, base_url
# You can add your own local fixtures here if needed
Step 3: Configure Base Interactions
Étape 3 : Configurer les Interactions de Base
Your Base class (in promethee/base.py) provides the foundation. Ensure
it's set up to handle common actions.
(Note: In most projects initialized with Prométhée, this is already done for you, but understanding it is key.)
Votre classe Base (dans promethee/base.py) fournit les fondations.
Assurez-vous qu'elle est configurée pour gérer les actions communes.
(Note : Dans la plupart des projets initialisés avec Prométhée, cela est déjà fait pour vous, mais le comprendre est essentiel.)
Step 4: Create Page Objects (OOP)
Étape 4 : Créer les Page Objects (POO)
We use Object-Oriented Programming. Your Page Object inherits from
Base to access the driver, but uses selenium-ui-test-tool functions
for interactions.
Nous utilisons la Programmation Orientée Objet. Votre Page Object hérite de
Base pour accéder au driver, mais utilise les fonctions de
selenium-ui-test-tool pour les interactions.
from promethee.base import Base
from selenium.webdriver.common.by import By
from selenium_ui_test_tool import fill_input, click_element, wait_for_element
class LoginPage(Base):
"""
Page Object for the Login Page.
Encapsulates all interactions with the login screen.
"""
def fill_login_form(self, username, password):
# self.driver is inherited from Base
fill_input(self.driver, By.ID, "username", username)
fill_input(self.driver, By.ID, "password", password)
click_element(self.driver, By.ID, "login-btn")
def is_error_displayed(self):
return wait_for_element(self.driver, By.CLASS_NAME, "error-msg") is not None
Step 5: Write the Test
Étape 5 : Écrire le Test
Finally, write the test in tests/test_login.py. Use ScenarioProvider to
fetch data and inject it into the Page Object.
Enfin, écrivez le test dans tests/test_login.py. Utilisez
ScenarioProvider pour récupérer les données et les injecter dans le Page Object.
from utils.scenario_provider import ScenarioProvider
from scenarios.login_page import LoginPage
def test_valid_login(driver):
# 1. Get Data
# Fetch data for 'login_success' scenario from CSV
data = ScenarioProvider.get_data_for_scenario("login_success")
# 2. Initialize Page Object
# Pass the driver fixture to the Page Object
login_page = LoginPage(driver)
# 3. Perform Actions
login_page.open_url("https://example.com/login")
login_page.fill_login_form(data['email'], data['password'])
# 4. Assert Results
assert "Dashboard" in login_page.get_title()
API Reference
Référence API
Class promethee.base.Base
Classe promethee.base.Base
The foundational class for all Page Objects.
La classe fondamentale pour tous les Page Objects.
__init__(driver, url=None): Initializes the page with a driver. If URL is provided, navigates to it.Initialise la page avec un driver. Si une URL est fournie, navigue vers celle-ci.open_url(url): Navigate to a specific URL.Naviguer vers une URL spécifique.get_title(): Returns the current page title.Retourne le titre de la page courante.refresh(): Refreshes the page.Rafraîchit la page.
External Interactions
Interactions Externes
Prométhée recommends using selenium-ui-test-tool for all element interactions. Key imports:
Prométhée recommande d'utiliser selenium-ui-test-tool pour toutes les interactions avec les éléments. Imports clés :
from selenium_ui_test_tool import (
click_element,
fill_input,
wait_for_element,
get_text
)