„Testy mają być czytelne jak przepis na makaron. A nie jak wykres zależności w mikroserwisach.”
Dlaczego w ogóle POM?
Masz testy Selenium, które klikają, sprawdzają, wchodzą, wychodzą… ale coś zaczyna śmierdzieć. Zmiana jednego selektora rozwala pół projektu. Ktoś dodał nowe pole – i nagle 10 testów czerwone. Kod wygląda jak ctrl+c / ctrl+v po trzech kawach.
Rozwiązanie? Page Object Model (POM) – wzorzec, który oddziela logikę testową od implementacji UI. Brzmi poważnie, działa prosto.
Jak działa?
Zamiast pisać test, który bezpośrednio grzebie w elementach strony, tworzysz klasę – obiekt strony, który wie, jak się z tą stroną obchodzić:
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_field = driver.find_element(By.ID, "username")
self.password_field = driver.find_element(By.ID, "password")
self.login_button = driver.find_element(By.ID, "login")
def login(self, username, password):
self.username_field.send_keys(username)
self.password_field.send_keys(password)
self.login_button.click()
I teraz w teście:
def test_valid_login(driver):
login_page = LoginPage(driver)
login_page.login("admin", "admin123")
assert "dashboard" in driver.current_url
Zalety? Oto one:
- 🔄 Reużywalność – nie duplikujesz kodu w 10 testach.
- 🔧 Łatwe utrzymanie – zmieniasz selektor raz.
- 🧠 Czytelność – test opisuje co się dzieje, nie jak.
Gdzie trzymać POM?
- Osobny folder:
pages/
- Jedna klasa = jedna strona lub komponent
- Używaj inicjalizacji drivera i trzymających się siebie metod (np.
fill_form()
,submit()
,get_error_message()
)
Czego unikać?
- ❌ Przerzucania całej logiki testu do PageObject – to ma być API do strony, nie mini-test-runner.
- ❌ Przekombinowania z dziedziczeniem – keep it simple.
- ❌ „PageGodObjects” – jeśli strona robi wszystko, podziel ją.
TL;DR
Page Object Model to jak kuchenny organizer – wszystko na miejscu, wiesz gdzie szukać, nic się nie wylewa.
Zamiast pisać test jak partyzant w dżungli DOM-u, robisz to jak strateg: budujesz warstwę abstrakcji i idziesz jak po sznurku.
W kolejnych postach: struktura projektu testowego z POM, refaktor klasycznego testu w Pytest, a także integracja z fixture’ami i CI/CD.
Testuj z głową.
I pamiętaj – czysty kod to szczęśliwy QA. 🧼
– Karol