Sobes.tech
Middle

Cos'è il pattern Page Object?

sobes.tech AI

Risposta dell'AI

Il pattern Page Object (PO) è un modello di progettazione per l'automazione dei test di interfacce web, che rappresenta le pagine web come classi. Ogni classe PO incapsula gli elementi e le azioni eseguite dall'utente su una pagina specifica.

Vantaggi dell'uso:

  • Leggibilità: Il codice di test diventa più comprensibile, poiché interagisce con le pagine e i loro elementi tramite metodi di alto livello.
  • Manutenibilità: Quando i localizzatori degli elementi sulla pagina cambiano, basta modificare la classe PO corrispondente, senza riscrivere i test che utilizzano quegli elementi.
  • Riutilizzabilità: I metodi e gli elementi del Page Object possono essere usati in diversi scenari di test.
  • Separazione delle responsabilità: La logica di interazione con gli elementi UI è separata dalla logica dello scenario di test.

Componenti principali:

  • Classi di pagina: Rappresentano un'astrazione di una pagina web concreta.
  • Elementi web: Sono definiti all'interno della classe di pagina usando localizzatori (XPath, selettori CSS, ID, ecc.).
  • Metodi: Rappresentano azioni che possono essere eseguite sulla pagina (ad esempio, login(), addToCart(), search()). Questi metodi interagiscono con gli elementi web.

Esempio di struttura:

# 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")  # Localizzatore del campo di input username
        self.password_input = (By.ID, "password")  # Localizzatore del campo di input password
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Localizzatore del pulsante di login
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Localizzatore del messaggio di errore

    def open(self, url):
        self.driver.get(url) # Apre la pagina

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Inserisce username
        self.driver.find_element(*self.password_input).send_keys(password) # Inserisce password

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Clicca sul pulsante di login

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Ottiene il testo del messaggio di errore
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Importa la classe Page Object

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Inizializza il driver
        self.login_page = LoginPage(self.driver) # Crea un'istanza di Page Object

    def tearDown(self):
        self.driver.quit() # Chiude il driver

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Apre la pagina
        self.login_page.enter_credentials("valid_user", "valid_password") # Inserisce i dati
        self.login_page.click_login_button() # Clicca sul pulsante
        # Controlli aggiuntivi dopo login riuscito

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Apre la pagina
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Inserisce i dati
        self.login_page.click_login_button() # Clicca sul pulsante
        error_text = self.login_page.get_error_message() # Ottiene il testo dell'errore
        self.assertIn("Credenziali non valide", error_text) # Verifica il messaggio di errore

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

In questo esempio, LoginPage rappresenta un Page Object per la pagina di login. I test in test_login.py usano i metodi di questa classe, astratti dai dettagli di interazione con gli elementi.

Il pattern Page Object è uno standard de facto nell'automazione dei test di interfacce web grazie ai suoi vantaggi in termini di manutenibilità e leggibilità.