Sobes.tech
Middle

Cos'è il pattern Page Object?

sobes.tech AI

Risposta dell'AI

Il pattern Page Object è un modello di progettazione utilizzato per migliorare la leggibilità, la manutenibilità e ridurre la duplicazione del codice nell'automazione dei test di applicazioni web. È un approccio orientato agli oggetti in cui ogni pagina (o componente significativo) dell'applicazione web è rappresentata da una classe.

Idee principali del Page Object:

  • Incapsulamento degli elementi della pagina e delle azioni che possono essere eseguite con essi.
  • Separazione dei localizzatori degli elementi e della logica di business dei test.
  • Fornire un'API di alto livello per interagire con la pagina.

Vantaggi dell'uso del Page Object:

  • Miglioramento della leggibilità dei test: I test diventano più dichiarativi, descrivendo i passaggi di interazione con l'interfaccia utente in linguaggio di business.
  • Miglioramento della manutenibilità: Quando cambia l'UI (ad esempio, il localizzatore di un elemento), basta modificare in una sola classe Page Object, invece di in ogni test che utilizza quell'elemento.
  • Riduzione della duplicazione del codice: Le azioni comuni con la pagina sono incapsulate in metodi di Page Object e possono essere riutilizzate in diversi test.
  • Aumento della stabilità dei test: Grazie all'astrazione dei dettagli di implementazione dell'UI.

Esempio di struttura:

Supponiamo di avere una pagina di login. Possiamo creare una classe LoginPage.

# 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")
        self.password_input = (By.ID, "password")
        self.login_button = (By.XPATH, "//button[text()='Login']")

    def set_username(self, username):
        self.driver.find_element(*self.username_input).send_keys(username)

    def set_password(self, password):
        self.driver.find_element(*self.password_input).send_keys(password)

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click()

    def login(self, username, password):
        self.set_username(username)
        self.set_password(password)
        self.click_login_button()

Utilizzo nel test:

# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://example.com/login")

    def test_valid_login(self):
        login_page = LoginPage(self.driver)
        login_page.login("valid_user", "valid_password")
        # Verifica login riuscito

    def tearDown(self):
        self.driver.quit()

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

Qui, la classe LoginPage incapsula i localizzatori e le azioni relative alla pagina di login. Il test test_valid_login interagisce con LoginPage tramite metodi di alto livello come login. Se il localizzatore del campo username cambia, basta modificarlo solo in LoginPage.