Automatisation des
tests
Yessine Hadj Kacem
Maître de conférences en informatique
PMP® Certified
ISTQB® Certified
Plan
2
▪ Introduction aux tests automatisés
▪ Utilisation de Selenium pour les tests
automatisés
▪ Framework pytest
▪ Patron Page Object Model (POM)
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
3
3 Objectifs
Comprendre les bases du test automatisé
Découvrir les outils Selenium et pytest
Apprendre les principes du Page Object Model (POM)
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
4
4 Différence entre les tests manuels et automatisés
Tests manuels
▪ Nécessite une intervention
humaine
▪ Idéal pour tests exploratoires
Tests automatisés
▪ Exécutés par script
▪ Efficace pour les tests répétitifs
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
5
5 Tests automatisés
Automatiser l'exécution des tests pour vérifier le bon fonctionnement
des fonctionnalités
Principes clés:
▪ Réduction de l'intervention humaine
▪ Répétabilité et efficacité
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
6
6 Avantages de l'automatisation des tests
Prévention des erreurs humaines simples
Gain de temps grâce à la réduction du travail manuel répétitif : Le
test doit être joué plus d’une fois
Evaluation plus objective (par exemple, de la couverture)
Accès plus facile à l'information sur les tests pour soutenir la gestion
des tests et le reporting des tests
Réduction des délais d'exécution des tests pour une détection plus
précoce des défauts
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
7
7 Limites des tests automatisés
Estimations inexactes du temps
Trop grande dépendance à l'égard d'un outil
Incompatibilité de l'outil d'automatisation avec la plateforme de
développement
Maintenance coûteuse si l'application change souvent
Inefficace pour les tests exploratoires et UX
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
8
8 Outils de test automatisé
Selenium: Automatisation de tests d'interface utilisateur
pytest: Framework pour organiser et exécuter des tests en Python
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
9
9 Cycle de vie des tests automatisés
Conception des cas de test
Implémentation des cas de test
Rédaction des scripts de test
Exécution des tests
Analyse des résultats et génération de rapports de défauts
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
10
10 Types et niveaux de tests automatisés
Types de tests automatisés
▪ Tests fonctionnels
▪ Tests de régression
▪ Tests non- fonctionnels : Test de performance et de charge
Niveaux de tests automatisés
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
11
11 Selenium pour les tests automatisés
Outil open-source pour l'automatisation des navigateurs
Composants: WebDriver, IDE, GridTests fonctionnels
▪ WebDriver : Interface permettant de contrôler un navigateur pour
automatiser des interactions web.
▪ IDE : Outil d'enregistrement et de relecture de tests Selenium, utile pour
créer des scripts sans coder.
▪ Grid : Infrastructure permettant d'exécuter des tests en parallèle sur
plusieurs navigateurs et plateformes
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
12
12 Selenium : Polyvalence et Utilisations
Compatibilité multi-langages :
▪ Selenium supporte plusieurs langages de programmation, notamment
Java, Python, C#, Ruby, et JavaScript.
Applications :
▪ Automatisation des tests : Selenium est principalement utilisé pour
automatiser les tests d’interfaces web.
▪ Web Scraping : Il peut également être utilisé pour extraire des données de
sites web, bien qu’il ne soit pas spécifiquement conçu pour le scraping.
Avantage : Sa flexibilité et sa compatibilité en font un outil largement
adopté pour divers projets d’automatisation web.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
13
13 Structure d’un script Selenium
Initialisation du WebDriver
Navigation vers une URL
Fermeture du navigateur
Exemple de code pour démarrer un navigateur Edge et accéder à une
URL
driver = webdriver.Edge()
url="https://www.google.com"
driver.get(url)
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
14
14 Navigation et Contrôle du Navigateur avec Selenium
driver.back() # Retourne à la page précédente
print(driver.title) # Affiche le titre de la page actuelle
driver.forward() # Avance vers la page suivante
driver.refresh() # Recharge la page actuelle
driver.close() # Ferme la fenêtre active du navigateur
driver.quit() # Ferme toutes les fenêtres et termine la session
WebDriver
sleep(n) #NB: Il est important de faire une pause de n
secondes pour visualiser l'action
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
15
15 Eléments d’une interface Web
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
16
16 Les sélecteurs dans Selenium
Sélecteurs courants: id, name, class, CSS selectors, XPath
Utilisation: Trouver des éléments pour interagir avec eux
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
17
17 Les sélecteurs dans Selenium
Par ID : Localise un élément unique sur la page via son identifiant, souvent
privilégié car l'ID est unique
element = driver.find_element(By.ID, "username")
Par nom (NAME) : Localise un élément par son nom. Selenium
interagit avec le premier élément correspondant trouvé
element = driver.find_element(By.NAME, "login")
Par Texte du Lien (LINK_TEXT): Utilisé uniquement pour localiser des
hyperliens en fonction du texte visible du lien
element = driver.find_element(By.LINK_TEXT, "Register")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
18
18 Les sélecteurs dans Selenium
Par Nom de Balise (TAG_NAME) : Localise des éléments en fonction de leur
balise HTML (par exemple, <input>, <button>).
→ Peut être utilisé pour trouver plusieurs éléments du même type.
all_links = driver.find_elements(By.TAG_NAME, "a")
Par Nom de Classe (className) :Localise des éléments en fonction
de leur nom de classe CSS.
element = driver.find_element(By.CLASS_NAME, "sample1")
elements = driver.find_elements(By.CLASS_NAME, "sample1")
for element in elements:
print(element.text)
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
19
19 Les sélecteurs dans Selenium
Par Nom de Balise (TAG_NAME) : Localise des éléments en fonction de leur
balise HTML (par exemple, <input>, <button>).
→ Peut être utilisé pour trouver plusieurs éléments du même type.
all_links = driver.find_elements(By.TAG_NAME, "a")
Par Nom de Classe (className) :Localise des éléments en fonction
de leur nom de classe CSS.
element = driver.find_element(By.CLASS_NAME, "sample1")
elements = driver.find_elements(By.CLASS_NAME, "sample1")
for element in elements:
print(element.text)
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
20
20 Les sélecteurs dans Selenium : Xpath
// : Sélectionnez le nœud actuel.
Nom de l'étiquette : Nom de variable du nœud particulier.
@: Sélectionnez l'attribut.
Attribut: Nom d'attribut du nœud.
Valeur: Valeur de l'attribut.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
21
21 Les sélecteurs dans Selenium : XPath
XPath permet de localiser des éléments en naviguant dans la structure DOM via
des expressions de chemin.
XPath relatif : Utilise //, permet de localiser un élément indépendamment de sa
position exacte dans le DOM
element = driver.find_element(By.XPATH, "//div[@id='login']")
XPath absolu : Débute à la racine du document avec / et spécifie un chemin
complet, mais est moins flexible car toute modification de la structure DOM
peut rendre le chemin invalide.
element = driver.find_element(By.XPATH,
"/html/body/div[1]/div[2]/div[1]/input")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
22
22 Les sélecteurs dans Selenium : XPath
Par Sélecteur CSS (cssSelector) : Le cssSelector permet de localiser des
éléments en utilisant des règles CSS. Il est souvent plus rapide que l'XPath.
element = driver.find_element(By.CSS_SELECTOR, "#gh-btn")
Par Texte Partiel du Lien (partialLinkText) : Permet de localiser un hyperlien en
utilisant une partie du texte du lien, utile lorsque le texte complet n’est pas
connu.
element = driver.find_element(By.PARTIAL_LINK_TEXT, "Reg
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
23
23 Actions Avancées avec Selenium : Sélection et Gestion de Fenêtres
Changer de Fenêtre Permet de basculer vers une autre fenêtre ou un autre
onglet du navigateur.
driver.switch_to.window(handles[1])
Sélection d'Option dans une Liste Déroulante Exemple de sélection d'une
option dans un menu déroulant.
dropdown = Select(driver.find_element(By.ID, "dropdownMenu"))
dropdown.select_by_index(2)# Sélection par index
dropdown.select_by_visible_text("Option 3") # Sélection par texte
visibleconnu.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
24
24 Actions Avancées avec Selenium : Souris et Clavier
Clic Droit et Double Clic Permet d'effectuer des actions de clic avancées sur
des éléments.
action = ActionChains(driver)
element_right_click = driver.find_element(By.ID,
"rightClickElement")
action.context_click(element_right_click).perform() # Clic droit
element_double_click = driver.find_element(By.ID,
"doubleClickElement")
action.double_click(element_double_click).perform() # Double
clic
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
25
25 Actions Avancées avec Selenium : Souris et Clavier
Drag and Drop (Glisser-Déposer)
Déplace un élément de la source à la cible.
source = driver.find_element(By.ID, "sourceElement")
target = driver.find_element(By.ID, "targetElement")
action.drag_and_drop(source, target).perform()
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
26
26 Actions Avancées avec Selenium : Raccourcis Clavier et Glissement
Copier et Coller avec le Clavier Imite les raccourcis clavier pour sélectionner,
copier et coller du texte.
input1.send_keys("example text")
action.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).
perform() # Sélectionner tout
action.key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).
perform() # Copier
input2.click()
action.key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).
perform() # Coller.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
27
27 Actions Avancées avec Selenium : Raccourcis Clavier et Glissement
Déplacement de Curseurs dans un Slider
Déplace les curseurs dans un composant de type slider.
min_slider = driver.find_element(By.XPATH, "//div[@class='slider-
handle'][1]")
max_slider = driver.find_element(By.XPATH, "//div[@class='slider-
handle'][2]")
action.drag_and_drop_by_offset(min_slider, 50, 0).perform() #
Glisse le curseur minimum
action.drag_and_drop_by_offset(max_slider, -30, 0).perform() #
Glisse le curseurs
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
28
28 Gestion des pop-ups et des alertes
Accepter une Alerte en cliquant sur le bouton "OK".
# Basculer vers l'alerte
alert = driver.switch_to.alert
# Accepter l'alerte
alert.accept()
Rejeter une Alerte:Rejette l'alerte en cliquant sur le bouton "Annuler" (si
disponible).
# Basculer vers l'alerte
alert = driver.switch_to.alert
# Rejeter l'alerte
alert.dismiss()
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
29
29 Gestion des pop-ups et des alertes
Récupérer le Texte d'une Alerte
Extrait le texte affiché dans l'alerte, utile pour des vérifications ou des
assertions.
# Basculer vers l'alerte
alert = driver.switch_to.alert
# Récupérer le texte de l'alerte
alert_text = alert.text
print(f"Texte de l'alerte : {alert_text}")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
30
30 Gestion des pop-ups et des alertes
Exemple Complet : Manipulation d'une Alerte
# Simuler une action qui déclenche une alerte
driver.find_element(By.ID, "triggerAlertButton").click()
# Basculer vers l'alerte
alert = driver.switch_to.alert
# Récupérer et afficher le texte de l'alerte
print(f"Texte de l'alerte : {alert.text}")
# Choisir une action en fonction du texte de l'alerte
if "Confirmer" in alert.text:
alert.accept() # Accepter si le texte correspond
else:
alert.dismiss() # Rejeter autrement
# Basculer vers l'alerte
alert = driver.switch_to.alert
# Récupérer le texte de l'alerte
alert_text = alert.text
print(f"Texte de l'alerte : {alert_text}")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
31
31 Exceptions Courantes et Gestion dans Selenium
Exceptions Courantes
▪ NoSuchElementException : Levée lorsque Selenium ne trouve pas un élément sur la
page, souvent parce que l'élément n'est pas encore chargé ou parce que le
sélecteur est incorrect.
▪ TimeoutException : Levée lorsque Selenium attend trop longtemps une condition
(par exemple, la présence d'un élément) sans succès. Couramment utilisée avec
WebDriverWait.
Gestion des Exceptions avec try-except
▪ Utiliser des blocs try-except pour capturer les exceptions et réagir en conséquence
sans interrompre l'exécution du script.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
32
32 Exceptions Courantes et Gestion dans Selenium
# Initialisation du driver
driver = webdriver.Chrome()
driver.get("https://example.com")
try:
# Essayer de trouver un élément avec un délai d'attente
explicite
element = WebDriverWait(driver,
10).until(EC.presence_of_element_located((By.ID, "username")))
element.send_keys("test_user")
except NoSuchElementException:
print("Erreur : Élément introuvable.")
except TimeoutException:
print("Erreur : Temps d'attente dépassé pour la recherche
de l'élément.")
finally:
driver.quit()
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
33
33 Utilisation de Selenium pour les assertions de base
Vérifier la Présence d'un Élément
driver = webdriver.Chrome()
driver.get("https://example.com")
try:
element = driver.find_element(By.ID, "username")
assert element is not None, "L'élément 'username' est
introuvable sur la page."
print("Présence de l'élément vérifiée avec succès.")
except NoSuchElementException:
print("Erreur : Élément non trouvé.")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
34
34 Utilisation de Selenium pour les assertions de base
Comparer le Texte Affiché avec le Texte Attendu
driver = webdriver.Chrome()
driver.get("https://example.com")
# Récupérer le texte d'un élément
element = driver.find_element(By.ID, "welcomeMessage")
actual_text = element.text
expected_text = "Bienvenue sur notre site"
# Assertion pour comparer les textes
assert actual_text == expected_text, f"Erreur : Texte affiché
'{actual_text}' ne correspond pas au texte attendu
'{expected_text}'."
print("Le texte affiché correspond au texte attendu.")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
35
35 Introduction à pytest
Framework de test pour Python
Permet l'écriture de tests simples et organisés
Installation:
▪ Installer pytest via pip
▪ Configurer pytest pour le projet
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
36
36 Introduction à pytest
Nommage et Organisation des Fichiers
▪ Nommage des fichiers : Les fichiers de test doivent commencer par le
préfixe test_ (par exemple, test_login.py).
▪ Nommage des fonctions : Chaque fonction de test doit également
commencer par test_, ce qui facilite l'identification et l'exécution.
Pour une organisation optimale, opter pour une séparation claire du
code source et des tests :
▪ Dossier src : Contient le code source de l’application.
▪ Dossier tests : Contient tous les tests organisés en sous-dossiers si
nécessaire.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
37
37 Exemple de Structure de projet pytest
project-root/
├── src/
│ └── main_code.py
├── tests/
│ ├── test_main_code.py
│ └── __init__.py # Facilite l'import de modules entre tests
├── pytest.ini # Configuration de Pytest (ex. : options de tests, gestion
des paths)
└── requirements.txt
pytest.ini : Permet de configurer Pytest pour spécifier des options, tels que le
niveau de log, les marqueurs de test, et les chemins des dossiers src et tests.
__init__.py : Fichier vide placé dans les dossiers pour les traiter comme des
packages Python, facilitant l'importation de modules entre les src et tests
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
38
38 Fixtures dans Pytest
Les fixtures dans Pytest sont des fonctions spéciales qui permettent
de créer des configurations ou des états initiaux
Elles sont très utiles pour préparer des ressources, comme des
connexions à une base de données, des navigateurs, ou des
configurations communes, et ainsi éviter la duplication de code.
Créer une Fixture de Base : Une fixture est définie avec le décorateur
@pytest.fixture. Elle peut être appelée automatiquement par plusieurs
tests pour fournir des configurations ou des données partagées.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
39
39 Fixtures dans Pytest : Exemple
import pytest
from selenium import webdriver
# Définir une fixture qui initialise un navigateur Chrome
@pytest.fixture
def browser():
driver = webdriver.Chrome()
driver.get("https://example.com")
yield driver # La fonction se met en pause et attend
que le test se termine
driver.quit()
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
40
40 Utiliser une Fixture dans un Test
Utiliser une Fixture dans un Test : Les tests peuvent accéder aux
fixtures en ajoutant le nom de la fixture comme paramètre
Exemple de test utilisant la fixture browser :
# Utilise la fixture pour accéder au navigateur initialisé
def test_title(browser):
assert browser.title == "Example Domain", "Le titre
de la page est incorrect".
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
41
41 Chaînage de Fixtures
Il est également possible de chaîner les fixtures, permettant de
construire des configurations complexes tout en gardant chaque
fixture simple et modulaire.
Exemple de test utilisant la fixture browser :
def login(browser):
browser.find_element(By.ID, "username").send_keys("user")
browser.find_element(By.ID, "password").send_keys("pass")
browser.find_element(By.ID, "login").click()
yield browser # Permet de continuer avec un navigateur
connecté
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
42
42 Patron de conception Page Object Model (POM)
Modèle pour organiser le code de test
Séparation de la logique de test et des interactions avec l'interface
utilisateur
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
43
43 Structure d'un objet de page dans POM
Classe Python représentant une page
Contient les éléments et méthodes pour interagir avec la page
Modularité et Réutilisation : Chaque page a sa propre classe.
Séparation des Préoccupations : La logique de l’application (les
interactions avec les éléments) est séparée de la logique de test.
Facilité de Maintenance : Si un élément de la page change il suffit de
modifier la classe représentant cette page, et non tous les tests.
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
44
44 Exemple de Classe pour la page d’accueil
from selenium.webdriver.common.by import By
class LoginPage:
textbox_username_id = "user-name"
textbox_password_id = "password"
button_login_xpath = "//input[@id='login-button']"
button_menu_logout="//button[@id='react-burger-menu-
btn']"
link_logout = "//a[@id='logout_sidebar_link']"
def __init__(self, driver):
self.driver = driver
def setUserName(self, username):
self.driver.find_element(By.ID,
self.textbox_username_id).clear()
self.driver.find_element(By.ID,
self.textbox_username_id).send_keys(username)
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
45
45 Exemple de Classe pour la page d’accueil
def setPassword(self, password):
self.driver.find_element(By.ID,
self.textbox_password_id).clear()
self.driver.find_element(By.ID,
self.textbox_password_id).send_keys(password)
def clickLogin(self):
self.driver.find_element(By.XPATH,
self.button_login_xpath).click()
def clickLogout(self):
self.driver.find_element(By.XPATH,
self.button_menu_logout).click()
self.driver.find_element(By.XPATH,
self.link_logout).click()
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
46
46 Exemple d’utilisation dans un test
class Test_001_Login:
url = "https://www.saucedemo.com/"
username = "standard_user"
password = "secret_sauce"
def test_homePageTitle(self):
self.driver = webdriver.Chrome()
self.driver.get(self.url)
actualTitle = self.driver.title
assert actualTitle == "Swag Labs"
self.driver.close()
print("Test for home page passed")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
47
47 Exemple d’utilisation dans un test
def test_login(self):
self.driver = webdriver.Chrome()
self.driver.get(self.url)
self.loginPage = LoginPage(self.driver)
self.loginPage.setUserName(self.username)
self.loginPage.setPassword(self.password)
self.loginPage.clickLogin()
text = self.driver.find_element(By.CLASS_NAME,
"title").text
assert "products" in text.lower()
print("TEST PASSED : LOGIN SUCCESSFUL")
Introduction aux tests automatisés
Selenium pour les tests automatisés
Framework pytest
Patron Page Object Model (POM)
48
48 Applications
Exercices
Mini-Projet