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à.