Sobes.tech
Middle

Co je to vzorec Page Object?

sobes.tech AI

Odpověď od AI

Vzor Page Object je návrhový vzor používaný na zvýšenie čitateľnosti, udržiavateľnosti a zníženie duplikácie kódu v testovacej automatizácii webových aplikácií. Ide o objektovo orientovaný prístup, kde je každá stránka (alebo významná súčasť) webovej aplikácie reprezentovaná samostatnou triedou.

Hlavné myšlienky Page Object:

  • Zapuzdrenie prvkov stránky a akcií, ktoré je možné s nimi vykonať.
  • Oddelenie lokalizátorov prvkov od biznis logiky testov.
  • Poskytovanie vysokoúrovňového API na interakciu so stránkou.

Výhody používania Page Object:

  • Zvýšenie čitateľnosti testov: Testy sa stávajú deklaratívnejšími, opisujúc kroky interakcie s používateľským rozhraním v biznis jazyku.
  • Zlepšenie udržiavateľnosti: Pri zmene UI (napríklad zmena lokalizátora prvku) stačí upraviť len jednu triedu Page Object, nie každý test, ktorý tento prvok používa.
  • Zníženie duplikácie kódu: Spoločné akcie s stránkou sú zapuzdrené v metódach Page Object a môžu byť znovu použité v rôznych testoch.
  • Zvýšenie stability testov: Vďaka abstrakcii od detailov implementácie UI.

Príklad štruktúry:

Predpokladajme, že máme prihlasovaciu stránku. Môžeme vytvoriť triedu 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()

Použitie v teste:

# 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")
        # Kontrola úspešného prihlásenia

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

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

V tomto prípade trieda LoginPage zapuzdruje lokalizátory a akcie súvisiace s prihlasovacou stránkou. Test test_valid_login interaguje s LoginPage prostredníctvom vysokoúrovňových metód login. Ak sa zmení lokalizátor poľa používateľského mena, stačí ho upraviť iba v LoginPage.