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.