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.