Sobes.tech
Middle

Czym jest wzorzec Page Object?

sobes.tech AI

Odpowiedź od AI

Wzorzec Page Object (PO) jest wzorcem projektowym dla automatyzacji testów interfejsów internetowych, który reprezentuje strony internetowe jako klasy. Każda klasa PO kapsułkuje elementy i działania wykonywane przez użytkownika na konkretnej stronie.

Zalety stosowania:

  • Czytelność: Kod testowy staje się bardziej zrozumiały, ponieważ wchodzi w interakcję ze stronami i ich elementami za pomocą metod wysokiego poziomu.
  • Łatwość utrzymania: Przy zmianie lokalizatorów elementów na stronie, wystarczy zmodyfikować odpowiednią klasę Page Object, bez konieczności przepisywania testów korzystających z tych elementów.
  • Ponowne użycie: Metody i elementy Page Object mogą być używane w różnych scenariuszach testowych.
  • Rozdzielenie odpowiedzialności: Logika interakcji z elementami UI jest oddzielona od logiki scenariusza testowego.

Główne komponenty:

  • Klasy stron: Reprezentują abstrakcję konkretnej strony internetowej.
  • Elementy web: Definiowane w klasie strony z użyciem lokalizatorów (XPath, selektory CSS, ID itp.).
  • Metody: Reprezentują działania, które można wykonać na stronie (np. login(), addToCart(), search()). Metody te wchodzą w interakcję z elementami web.

Przykład struktury:

# 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")  # Lokalizator pola wprowadzania nazwy użytkownika
        self.password_input = (By.ID, "password")  # Lokalizator pola wprowadzania hasła
        self.login_button = (By.XPATH, "//button[contains(text(), 'Login')]") # Lokalizator przycisku logowania
        self.error_message = (By.CSS_SELECTOR, ".error-message") # Lokalizator komunikatu o błędzie

    def open(self, url):
        self.driver.get(url) # Otwiera stronę

    def enter_credentials(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username) # Wprowadza nazwę użytkownika
        self.driver.find_element(*self.password_input).send_keys(password) # Wprowadza hasło

    def click_login_button(self):
        self.driver.find_element(*self.login_button).click() # Kliknięcie przycisku logowania

    def get_error_message(self):
        return self.driver.find_element(*self.error_message).text # Pobiera tekst komunikatu o błędzie
# test_login.py
import unittest
from selenium import webdriver
from login_page import LoginPage # Import klasy Page Object

class LoginTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome() # Inicjalizacja WebDriver
        self.login_page = LoginPage(self.driver) # Utworzenie instancji Page Object

    def tearDown(self):
        self.driver.quit() # Zamknięcie WebDriver

    def test_valid_login(self):
        self.login_page.open("http://example.com/login") # Otwarcie strony
        self.login_page.enter_credentials("valid_user", "valid_password") # Wprowadzenie danych
        self.login_page.click_login_button() # Kliknięcie przycisku
        # Dodatkowe sprawdzenia po pomyślnym zalogowaniu

    def test_invalid_login(self):
        self.login_page.open("http://example.com/login") # Otwarcie strony
        self.login_page.enter_credentials("invalid_user", "wrong_password") # Wprowadzenie danych
        self.login_page.click_login_button() # Kliknięcie przycisku
        error_text = self.login_page.get_error_message() # Pobranie tekstu błędu
        self.assertIn("Nieprawidłowe dane logowania", error_text) # Sprawdzenie komunikatu o błędzie

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

W tym przykładzie LoginPage reprezentuje Page Object dla strony logowania. Testy w test_login.py korzystają z metod tej klasy, abstrahując od szczegółów interakcji z elementami.

Wzorzec Page Object jest de facto standardem w automatyzacji testów interfejsów webowych ze względu na swoje zalety w zakresie utrzymania i czytelności.