Sobes.tech
Middle

Qu'est-ce que le pattern Page Object?

sobes.tech IA

Réponse de l'IA

Le modèle Page Object (PO) est un patron de conception pour l’automatisation des tests d’interfaces web, qui représente les pages web sous forme de classes. Chaque classe PO encapsule les éléments et actions effectués par l’utilisateur sur une page spécifique.

Avantages de son utilisation :

  • Lisibilité : Le code de test devient plus compréhensible, car il interagit avec les pages et leurs éléments via des méthodes de haut niveau.
  • Facilité de maintenance : Lorsqu’un localisateur d’un élément change sur la page, il suffit de modifier la classe Page Object correspondante, sans avoir à réécrire les tests qui utilisent ces éléments.
  • Réutilisation : Les méthodes et éléments du Page Object peuvent être utilisés dans différents scénarios de test.
  • Séparation des responsabilités : La logique d’interaction avec les éléments UI est séparée de la logique du scénario de test.

Composants principaux :

  • Classes de pages : Représentent une abstraction d’une page web spécifique.
  • Éléments web : Définis à l’intérieur de la classe de la page en utilisant des localisateurs (XPath, sélecteurs CSS, ID, etc.).
  • Méthodes : Représentent des actions pouvant être effectuées sur la page (par exemple, login(), addToCart(), search()). Ces méthodes interagissent avec les éléments web.

Exemple de structure :

# login_page.py
from selenium.webdriver.common.by import By

class LoginPage:

    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")  # Localisateur du champ de saisie du nom d’utilisateur
        self.password_input = (By.ID, "password")  # Localisateur du champ de saisie du mot de passe
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Localisateur du bouton de connexion
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Localisateur du message d’erreur

    def open(self, url):
        self.driver.get(url) # Ouvre la page

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Saisit le nom d’utilisateur
        self.driver.find_element(*self.password_input).send_keys(password) # Saisit le mot de passe

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Clique sur le bouton de connexion

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Récupère le texte du message d’erreur
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Import de la classe Page Object

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Initialisation du driver
        self.login_page = LoginPage(self.driver) # Création d’une instance de Page Object

    def tearDown(self):
        self.driver.quit() # Fermeture du driver

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Ouverture de la page
        self.login_page.enter_credentials("valid_user", "valid_password") # Saisie des données
        self.login_page.click_login_button() # Clic sur le bouton
        # Vérifications supplémentaires après une connexion réussie

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Ouverture de la page
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Saisie des données
        self.login_page.click_login_button() # Clic sur le bouton
        error_text = self.login_page.get_error_message() # Récupération du texte d’erreur
        self.assertIn("Identifiants incorrects", error_text) # Vérification du message d’erreur

if __name__ == "__main__":
    unittest.main()

Dans cet exemple, LoginPage représente un Page Object pour la page de connexion. Les tests dans test_login.py utilisent les méthodes de cette classe, abstraites des détails d’interaction avec les éléments.

Le pattern Page Object est une norme de facto dans l’automatisation des tests d’interfaces web grâce à ses avantages en termes de maintenabilité et de lisibilité.