Selenium w praktyce - jak tworzyć stabilne testy

Osoba pracuje przy laptopie z kodem, używając telefonu do testowania aplikacji z **selenium**. Obok kawa i okulary.

Napisano przez

Juliusz Król

Opublikowano

18 wrz 2026

Spis treści

Gdy testy logowania, zakupów albo formularzy wykonuje się ręcznie po każdej zmianie, zespół szybko traci czas na powtarzalne czynności. Selenium to zestaw narzędzi do sterowania przeglądarką i automatyzacji testów aplikacji webowych, ale jego skuteczność zależy od dobrego projektu testów. Wyjaśniam, jak działa WebDriver, od czego zacząć, jak pisać stabilne scenariusze oraz kiedy użyć Grid zamiast lokalnego uruchamiania.

Najważniejsze informacje o automatyzacji testów przeglądarkowych

  • WebDriver steruje prawdziwą przeglądarką podobnie jak użytkownik.
  • Selenium Manager automatycznie pomaga dobrać i pobrać sterownik przeglądarki.
  • Lokatory i jawne oczekiwania mają większy wpływ na stabilność niż sama liczba testów.
  • Grid umożliwia równoległe testowanie na wielu przeglądarkach, systemach i maszynach.
  • Narzędzie jest open source, ale projekt wymaga czasu na utrzymanie scenariuszy i infrastruktury.

Schemat działania selenium: biblioteki klienta, protokół JSON Wire, sterowniki przeglądarek i rzeczywiste przeglądarki.

Czym jest Selenium i gdzie naprawdę pomaga

Selenium nie jest pojedynczym programem, lecz rodziną narzędzi do automatyzacji przeglądarek. Najczęściej używanym elementem jest WebDriver, czyli interfejs, przez który kod otwiera stronę, wyszukuje elementy, wpisuje dane, klika przyciski i sprawdza rezultat.

W praktyce oznacza to testowanie aplikacji w warunkach zbliżonych do realnego użycia. Przeglądarka wykonuje polecenia, a test może zweryfikować na przykład, czy po zalogowaniu pojawia się panel klienta, koszyk zachowuje produkty albo formularz odrzuca nieprawidłowy adres e-mail.

W skład ekosystemu wchodzą także Selenium IDE do nagrywania prostych scenariuszy oraz Selenium Grid do uruchamiania testów na zdalnych maszynach. IDE przydaje się do nauki i szybkiego prototypowania, ale przy większym projekcie zwykle przechodzi się na testy zapisane w kodzie.

Co można automatyzować

  • logowanie, rejestrację i odzyskiwanie hasła,
  • zakupy, płatności testowe i obsługę koszyka,
  • walidację formularzy oraz komunikatów błędów,
  • nawigację między podstronami i działanie filtrów,
  • podstawowe scenariusze regresji po wdrożeniu zmian.

Nie każdy test warto automatyzować. Ja zaczynam od procesów częstych, powtarzalnych i krytycznych dla biznesu. Jednorazowy test wyglądu albo scenariusz zmieniający się co kilka dni może kosztować więcej w utrzymaniu, niż faktycznie oszczędza.

Jak działa WebDriver od polecenia do wyniku

Test składa się z kilku prostych etapów. Kod uruchamia sesję przeglądarki, otwiera wskazany adres, znajduje element po lokatorze, wykonuje akcję i sprawdza oczekiwany rezultat. Za komunikację między biblioteką testową, sterownikiem i przeglądarką odpowiada standard W3C WebDriver.

Przykładowy scenariusz w Pythonie może wyglądać tak:

from selenium import webdriver

driver = webdriver.Chrome()

try:
    driver.get("https://example.test/login")
    driver.find_element("css selector", "#email").send_keys("tester@example.test")
    driver.find_element("css selector", "#password").send_keys("tajne-haslo")
    driver.find_element("css selector", "button[type='submit']").click()

    assert "Panel klienta" in driver.title
finally:
    driver.quit()

Ten przykład pokazuje mechanikę, ale nie jest jeszcze dobrym testem produkcyjnym. Prawdziwy scenariusz powinien korzystać z danych testowych, jednoznacznych asercji i obsługi stanu aplikacji. Samo sprawdzenie tytułu strony często nie wystarcza, bo poprawne logowanie może nie zmienić go wcale.

Selenium Manager upraszcza start

Współczesne wydania korzystają z Selenium Managera, który pomaga zarządzać sterownikami przeglądarek. Dzięki temu początkujący nie musi od razu ręcznie wyszukiwać odpowiedniej wersji ChromeDrivera, GeckoDrivera czy sterownika Edge.

Nie oznacza to, że konfiguracja zawsze znika całkowicie. W firmowej sieci ograniczenia proxy, firewall albo zamknięte środowisko CI mogą utrudnić pobieranie komponentów. W takich warunkach trzeba przygotować sterowniki w obrazie kontenera albo zarządzać nimi jawnie.

Jak zbudować pierwszy sensowny zestaw testów

Najlepiej zacząć od małego zestawu, który sprawdza najważniejsze ścieżki użytkownika. Pięć dobrze zaprojektowanych testów logowania i zakupu daje zwykle więcej informacji niż kilkadziesiąt przypadkowych scenariuszy opartych na klikaniu elementów bez jasnego celu.

  1. Wybierz jeden proces biznesowy, na przykład logowanie.
  2. Przygotuj stabilne konto testowe i przewidywalne dane.
  3. Opisz scenariusz językiem użytkownika, a dopiero potem zamień go na kod.
  4. Dodaj asercje sprawdzające rezultat, nie tylko wykonanie kliknięcia.
  5. Uruchom test lokalnie, a później w środowisku CI.

Przy większej liczbie testów przydaje się wzorzec Page Object. Zamiast umieszczać lokatory i operacje na stronie w każdym scenariuszu, grupuje się je w klasach opisujących konkretne widoki. Kiedy zmieni się identyfikator przycisku, poprawka trafia w jedno miejsce.

Co powinien sprawdzać dobry test

Dobry test nie odpowiada wyłącznie na pytanie „czy udało się kliknąć?”. Powinien sprawdzić, czy system zrobił to, czego oczekuje użytkownik, na przykład wyświetlił komunikat, utworzył zamówienie albo zablokował dostęp do chronionej strony.

W mojej ocenie najważniejsza jest czytelność scenariusza. Osoba, która nie pisała danego testu, powinna po kilku sekundach zrozumieć, jaki proces biznesowy jest sprawdzany i dlaczego ewentualna awaria ma znaczenie.

Stabilne lokatory i oczekiwania bez przypadkowych błędów

Najczęstszą przyczyną niestabilnych testów nie jest sam framework, lecz zbyt kruche lokatory i źle dobrany czas oczekiwania. Selektor oparty na przypadkowej klasie CSS może przestać działać po niewielkiej zmianie interfejsu, nawet jeśli funkcja aplikacji pozostała bez zmian.

Które lokatory wybierać

Lokator Kiedy warto go użyć Ryzyko
Unikalny identyfikator Gdy jest stały i nadany specjalnie dla testów Niskie
Atrybut data-testid Gdy zespół może kontrolować kod aplikacji Niskie
Selektor CSS Gdy identyfikator nie istnieje, ale struktura jest stabilna Średnie
XPath Przy złożonych relacjach między elementami Wyższe, jeśli jest długi i zależny od struktury DOM
Tekst linku Przy prostych, niezmiennych linkach Średnie, szczególnie w aplikacjach wielojęzycznych

Najchętniej korzystam z krótkich, jednoznacznych selektorów i proszę programistów o dodawanie atrybutów przeznaczonych dla automatyzacji. To drobna zmiana w HTML, która potrafi ograniczyć późniejsze koszty utrzymania.

Dlaczego sleep zwykle szkodzi

Stałe opóźnienie, na przykład pięć sekund po każdym kliknięciu, jest kuszące, ale nie rozwiązuje problemu synchronizacji. Na szybkim środowisku test niepotrzebnie zwalnia, a na wolniejszym nadal może wykonać kolejne polecenie zbyt wcześnie.

Lepszym rozwiązaniem jest jawne oczekiwanie na konkretny stan. Test może czekać, aż element pojawi się w DOM, stanie się widoczny, będzie klikalny albo zniknie komunikat ładowania. Oczekujemy wtedy na zdarzenie istotne dla scenariusza, a nie na arbitralny upływ czasu.

Trzeba też uważać na mieszanie oczekiwań implicit i explicit. Taka konfiguracja może wydłużać błędy i utrudniać ich analizę. W większości projektów wybieram jednoznaczne oczekiwania jawne oraz krótkie, sensowne limity czasu.

Kiedy Grid i CI dają realną przewagę

Lokalne uruchamianie wystarcza na początku. Problem pojawia się wtedy, gdy aplikacja ma obsługiwać Chrome, Firefox, Edge i Safari albo działać poprawnie na kilku systemach operacyjnych. Ręczne przełączanie środowisk szybko staje się wąskim gardłem.

Selenium Grid kieruje polecenia do zdalnych instancji przeglądarek i pozwala wykonywać testy równolegle. W efekcie ten sam zestaw może zostać uruchomiony na różnych przeglądarkach, a czas całej regresji spada wraz z liczbą dostępnych sesji.

Równoległość nie jest jednak darmowa. Jedna sesja przeglądarki może potrzebować około 1 GB pamięci RAM, a liczba jednoczesnych uruchomień zależy między innymi od procesora, pamięci i konfiguracji węzłów. Zbyt agresywne zwiększenie liczby sesji często kończy się niestabilnością zamiast przyspieszeniem.

Przeczytaj również: Selenium - Czy wiesz, jak budować stabilne testy?

Praktyczny model pipeline’u

  1. Po utworzeniu pull requesta uruchom krótki zestaw testów dymnych.
  2. Po scaleniu zmian wykonaj pełniejszą regresję w kilku przeglądarkach.
  3. Zapisuj zrzuty ekranu, logi i informacje o środowisku po błędzie.
  4. Oddziel awarie aplikacji od problemów infrastruktury.
  5. Regularnie usuwaj testy duplikujące te same ryzyka.

Największą korzyść daje połączenie testów z CI/CD, a nie samo posiadanie Grid. Automatyzacja ma sens wtedy, gdy wynik pojawia się w procesie dostarczania oprogramowania i prowadzi do konkretnej decyzji, na przykład zatrzymania wdrożenia po złamaniu krytycznego scenariusza.

Selenium, Playwright czy Cypress

Nie wybierałbym narzędzia wyłącznie na podstawie popularności. Znaczenie mają język używany przez zespół, obsługiwane przeglądarki, sposób uruchamiania testów, dojrzałość infrastruktury i to, czy potrzebne są testy end-to-end, czy raczej testy komponentów.

Narzędzie Mocne strony Kiedy rozważyć
Selenium Szerokie wsparcie języków, przeglądarek i zdalnego uruchamiania Duże zespoły, istniejące środowisko Grid, projekty wielojęzyczne
Playwright Rozbudowane mechanizmy oczekiwania, szybki start i dobre wsparcie nowoczesnych aplikacji Nowe projekty webowe, szczególnie w JavaScript lub TypeScript
Cypress Prosty interfejs developerski i wygodny podgląd testu w przeglądarce Testy aplikacji frontendowych rozwijanych blisko ekosystemu JavaScript

Wybór Selenium nadal jest rozsądny, gdy firma ma już biblioteki, Page Objecty, pipeline’y i kompetencje związane z tym ekosystemem. Migracja tylko dlatego, że inne narzędzie wygląda nowocześniej, może przynieść więcej pracy niż korzyści.

Jeżeli zaczynam projekt od zera, porównuję nie tylko składnię. Sprawdzam czas napisania pierwszego testu, jakość raportów, obsługę równoległości, łatwość diagnozowania błędów oraz koszt utrzymania po sześciu miesiącach. To właśnie wtedy wychodzą na jaw różnice, których nie widać w krótkim przykładzie.

Od czego zacząć, żeby automatyzacja nie stała się ciężarem

Najbezpieczniejszy start to jeden język, jedna przeglądarka i kilka krytycznych scenariuszy. Dopiero gdy testy są stabilne, warto dodawać kolejne środowiska, równoległość i bardziej rozbudowane raportowanie.

Traktuję automatyzację jako część jakości oprogramowania, a nie kolekcję skryptów klikających po interfejsie. Stabilne lokatory, dobre dane testowe, jawne oczekiwania i sensowne asercje zrobią dla projektu więcej niż setki szybko dopisanych przypadków.

Jeżeli zespół potrafi utrzymywać testy równie starannie jak kod aplikacji, Selenium daje solidną podstawę do regresji i testów end-to-end. Jeżeli scenariusze są kruche, dane przypadkowe, a błędy ignorowane, nawet najlepsze narzędzie zacznie tylko szybciej produkować fałszywe alarmy.

FAQ - Najczęstsze pytania

WebDriver steruje prawdziwą przeglądarką, otwiera strony, wyszukuje elementy, wykonuje akcje i sprawdza rezultaty. Selenium IDE służy głównie do nagrywania prostych scenariuszy, natomiast większe projekty zwykle opierają się na testach zapisanych w kodzie.

Najlepiej używać stałych, unikalnych identyfikatorów lub atrybutów data-testid przeznaczonych dla testów. Krótkie selektory CSS są rozwiązaniem pośrednim, a długie XPath-y zależne od struktury DOM mają większe ryzyko awarii.

Stałe opóźnienie może niepotrzebnie spowalniać testy, a na wolniejszym środowisku nadal może być zbyt krótkie. Jawne oczekiwania synchronizują scenariusz z konkretnym stanem, na przykład widocznością lub klikalnością elementu. Warto też unikać mieszania oczekiwań implicit i explicit.

Grid warto zastosować, gdy testy mają działać równolegle na wielu przeglądarkach, systemach lub zdalnych maszynach. Jedna sesja może potrzebować około 1 GB pamięci RAM, dlatego liczba równoległych uruchomień powinna uwzględniać procesor, pamięć i konfigurację węzłów.

Najbezpieczniej zacząć od jednego języka, jednej przeglądarki i kilku krytycznych scenariuszy. Należy przygotować stabilne dane testowe, dodać asercje sprawdzające rezultat, uruchomić testy lokalnie, a następnie w CI. Kolejne środowiska i równoległość warto dodawać dopiero po uzyskaniu stabilności.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi:

selenium webdriver lokatory selenium grid page object

Udostępnij artykuł

Juliusz Król

Juliusz Król

Nazywam się Juliusz Król i od 4 lat zajmuję się automatyzacją testów oraz zapewnieniem jakości oprogramowania. Moje zainteresowanie tymi tematami zrodziło się z potrzeby zrozumienia, jak technologia może wspierać procesy tworzenia oprogramowania i jak kluczowe jest zapewnienie jego wysokiej jakości. W swoich tekstach skupiam się na praktycznych rozwiązaniach, które pomagają innym w efektywnym wdrażaniu automatyzacji oraz w rozwiązywaniu problemów związanych z jakością. Dzięki mojemu doświadczeniu staram się przekazywać wiedzę w sposób przystępny i zrozumiały, porównując różne podejścia oraz analizując aktualne trendy w branży. Zawsze dbam o to, aby moje materiały były rzetelne, aktualne i pomocne dla czytelników, którzy pragną rozwijać swoje umiejętności w obszarze QA.

Napisz komentarz