Sobes.tech
Middle

Ce este pattern-ul Page Object?

sobes.tech AI

Răspuns de la AI

Modelul Page Object (PO) — este un șablon de proiectare pentru testarea automată a interfețelor web, care reprezintă paginile web ca fiind clase. Fiecare clasă PO încapsulează elementele și acțiunile efectuate de utilizator pe o anumită pagină.

Beneficiile utilizării:

  • Citibilitate: Codul testului devine mai ușor de înțeles, deoarece interacționează cu paginile și elementele lor prin metode de nivel înalt.
  • Ușurința de întreținere: La schimbarea locatorilor elementelor de pe pagină, este suficient să se facă modificări doar în clasa corespunzătoare Page Object, fără a rescrie testele care utilizează aceste elemente.
  • Reutilizare: Metodele și elementele din Page Object pot fi folosite în diferite scenarii de testare.
  • Separarea responsabilităților: Logica de interacțiune cu elementele UI este separată de logica scenariului de test.

Componente principale:

  • Clasele paginilor: Reprezintă o abstracție a unei pagini web specifice.
  • Elemente web: Sunt definite în interiorul clasei paginii folosind locatorii (XPath, CSS-selectors, ID etc.).
  • Metode: Reprezintă acțiuni care pot fi efectuate pe pagină (de exemplu, login(), addToCart(), search()). Aceste metode interacționează cu elementele web.

Structură exemplu:

# 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")  # Locator pentru câmpul de introducere a numelui de utilizator
        self.password_input = (By.ID, "password")  # Locator pentru câmpul de introducere a parolei
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Locator pentru butonul de login
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Locator pentru mesajul de eroare

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

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Introduce numele de utilizator
        self.driver.find_element(*self.password_input).send_keys(password) # Introduce parola

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Apasă butonul de login

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Obține textul mesajului de eroare
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Importă clasa Page Object

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Inițializează driver-ul
        self.login_page = LoginPage(self.driver) # Creează o instanță a Page Object

    def tearDown(self):
        self.driver.quit() # Închide driver-ul

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Deschide pagina
        self.login_page.enter_credentials("valid_user", "valid_password") # Introduce datele
        self.login_page.click_login_button() # Apasă butonul
        # Verificări suplimentare după login cu succes

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Deschide pagina
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Introduce datele
        self.login_page.click_login_button() # Apasă butonul
        error_text = self.login_page.get_error_message() # Obține textul de eroare
        self.assertIn("Numele de utilizator sau parola incorecte", error_text) # Verifică mesajul de eroare

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

În acest exemplu, LoginPage reprezintă un Page Object pentru pagina de login. Testele din test_login.py utilizează metodele acestei clase, abstractizând detaliile de interacțiune cu elementele.

Modelul Page Object este un standard de facto în automatizarea testării interfețelor web datorită avantajelor sale în ceea ce privește întreținerea și lizibilitatea.