Sobes.tech
Middle

Czym jest wzorzec Page Object?

sobes.tech AI

Odpowiedź od AI

Wzorzec Page Object to wzorzec projektowy używany do poprawy czytelności, łatwości utrzymania i redukcji duplikacji kodu w automatyzacji testów aplikacji internetowych. Jest to podejście obiektowe, w którym każda strona (lub istotny komponent) aplikacji internetowej jest reprezentowana przez osobną klasę.

Główne idee Page Object:

  • Enkapsulacja elementów strony i działań, które można z nimi wykonywać.
  • Oddzielenie lokalizatorów elementów od logiki biznesowej testów.
  • Zapewnienie wysokopoziomowego API do interakcji ze stroną.

Zalety korzystania z Page Object:

  • Poprawa czytelności testów: Testy stają się bardziej deklaratywne, opisując kroki interakcji z interfejsem użytkownika w języku biznesowym.
  • Ułatwienie utrzymania: Gdy UI się zmienia (np. lokalizator elementu), wystarczy zmienić to tylko w jednej klasie Page Object, a nie w każdym teście korzystającym z tego elementu.
  • Redukcja duplikacji kodu: Wspólne działania na stronie są enkapsulowane w metodach Page Object i mogą być wielokrotnie wykorzystywane w różnych testach.
  • Zwiększenie stabilności testów: Dzięki abstrakcji szczegółów implementacji UI.

Przykład struktury:

Załóżmy, że mamy stronę logowania. Możemy utworzyć klasę 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(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()

Użycie w teście:

# 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")
        # Sprawdzenie poprawnego logowania

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

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

Tutaj klasa LoginPage enkapsuluje lokalizatory i działania związane ze stroną logowania. Test test_valid_login korzysta z LoginPage poprzez metody wysokiego poziomu, takie jak login. Jeśli lokalizator pola użytkownika się zmieni, wystarczy zmodyfikować go tylko w LoginPage.