Sobes.tech
Middle

Mi az a Page Object minta?

sobes.tech MI

Válasz az MI-től

A Page Object (PO) minta egy tervezési sablon az automatizált webes felületi teszteléshez, amely a weboldalakat osztályokként ábrázolja. Minden PO osztály beburkolja az elemeket és a felhasználó által végrehajtott műveleteket egy adott oldalon.

Használatának előnyei:

  • Áttekinthetőség: A tesztkód könnyebben érthetővé válik, mivel magas szintű módszereken keresztül lép kapcsolatba az oldalakkal és azok elemeivel.
  • Karbantarthatóság: Az oldal elemeinek lokátorain változtatva elegendő csak az adott Page Object osztályt módosítani, anélkül, hogy újra kellene írni a teszteket, amelyek ezeket az elemeket használják.
  • Újrafelhasználhatóság: A Page Object módszerei és elemei különböző tesztesetekben is felhasználhatók.
  • Felelősségek szétválasztása: Az UI elemekkel való interakció logikája el van választva a tesztszkript logikájától.

Fő komponensek:

  • Oldal osztályok: Egy adott weboldal absztrakcióját képviselik.
  • Web elemek: Az oldal osztályán belül határozzák meg locatorok segítségével (XPath, CSS szelektorok, ID stb.).
  • Módszerek: Az oldal műveleteit reprezentálják (pl. login(), addToCart(), search()). Ezek a módszerek az web elemekkel lépnek kapcsolatba.

Struktúra példa:

# 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")  # Felhasználónév mező lokátora
        self.password_input = (By.ID, "password")  # Jelszó mező lokátora
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Bejelentkezés gomb lokátora
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Hibaüzenet lokátora

    def open(self, url):
        self.driver.get(url) # Az oldal megnyitása

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Felhasználónév beírása
        self.driver.find_element(*self.password_input).send_keys(password) # Jelszó beírása

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Bejelentkezés gomb megnyomása

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Hibaüzenet szövegének lekérése
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Page Object osztály importálása

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Driver inicializálása
        self.login_page = LoginPage(self.driver) # Page Object példány létrehozása

    def tearDown(self):
        self.driver.quit() # Driver bezárása

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Az oldal megnyitása
        self.login_page.enter_credentials("valid_user", "valid_password") # Adatok megadása
        self.login_page.click_login_button() # Gombra kattintás
        # További ellenőrzések a sikeres bejelentkezés után

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Az oldal megnyitása
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Adatok megadása
        self.login_page.click_login_button() # Gombra kattintás
        error_text = self.login_page.get_error_message() # Hibaüzenet lekérése
        self.assertIn("Hibás felhasználónév vagy jelszó", error_text) # Üzenet ellenőrzése

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

Ebben a példában a LoginPage egy Page Object a bejelentkezési oldalhoz. A test_login.py tesztek a osztály metódusait használják, elrejtve az elemekkel való közvetlen interakció részleteit.

A Page Object minta a webes felületi tesztelés automatizálásának de-facto szabványa, mely a karbantarthatóság és az olvashatóság szempontjából kiemelkedő előnyökkel jár.