Odświeżanie strony w Selenium - Jak uniknąć błędów?

Kod Pythona z użyciem **selenium refresh page** do testowania strony logowania. Test zakończony błędem AssertionError.

Napisano przez

Dawid Kowalczyk

Opublikowano

26 mar 2026

Spis treści

Odświeżanie strony w testach Selenium wygląda prosto, ale to właśnie przy tym kroku najczęściej wychodzą na jaw problemy z synchronizacją, starymi elementami i zbyt luźnym podejściem do stanu aplikacji. Pokażę, jak robić to poprawnie, kiedy wystarczy zwykły reload, a kiedy lepiej ponownie wejść na ten sam adres albo poczekać na konkretny stan DOM. To praktyczny temat z obszaru automatyzacji testów, bo od jednego źle ustawionego odświeżenia zależy stabilność całego scenariusza.

Najważniejsze rzeczy o odświeżaniu strony w Selenium

  • Najbezpieczniejszym domyślnym wyborem jest metoda odświeżenia z obiektu nawigacji, np. `navigate().refresh()`.
  • Po przeładowaniu strony stare referencje do elementów często stają się nieaktualne, więc trzeba je wyszukać ponownie.
  • Samo odświeżenie nie zastępuje poprawnego oczekiwania na stan aplikacji; zwykle potrzebny jest explicit wait.
  • Jeśli test ma być stabilny, lepiej zaczynać go z czystego stanu niż ratować się wieloma refreshami.
  • W niektórych przypadkach sens ma ponowne wejście na ten sam adres lub reload przez JavaScript, ale to powinien być wariant pomocniczy, nie pierwszy odruch.

Co naprawdę robi odświeżenie strony w Selenium

W Selenium odświeżenie oznacza ponowne załadowanie bieżącej strony w tej samej karcie. W praktyce selenium refresh page sprowadza się do odwołania, które uruchamia standardową akcję przeglądarki, a nie do żadnego „resetu” aplikacji. To ważne rozróżnienie, bo odświeżenie nie czyści sesji, nie naprawia błędnego stanu testu i nie gwarantuje, że wszystkie komponenty zdążyły już zbudować swój widok.

Oficjalna dokumentacja Selenium pokazuje, że komendy nawigacyjne czekają na określony stan ładowania strony, domyślnie `readyState = complete`, ale to nie znaczy, że aplikacja oparta mocno o JavaScript jest już faktycznie gotowa do interakcji. Jeśli po stronie klienta dane dochodzą jeszcze chwilę po zakończeniu ładowania, sam powrót z komendy odświeżenia nie wystarczy. Ja traktuję ten moment jako początek kolejnego etapu testu, a nie jego koniec.

To prowadzi do praktycznej zasady: najpierw wybieram sposób przeładowania, a dopiero potem definiuję warunek, po którym test uznam za gotowy do kolejnego kroku. Bez tego odświeżenie staje się tylko ruchem kosmetycznym.

Ikona Selenium z symbolem odświeżania strony i fragmentem interfejsu przeglądarki.

Najprostsze metody odświeżenia bieżącej strony

Jeśli chodzi o samą technikę, w większości przypadków zaczynam od natywnej komendy przeglądarki. Jest najczytelniejsza, najlepiej komunikuje intencję i najmniej zaskakuje osobę, która później czyta test.

Metoda Przykład Kiedy używać Na co uważać
Natywne odświeżenie driver.navigate().refresh() Gdy chcesz odświeżyć bieżącą stronę tak, jak zrobiłby to użytkownik Po reloadzie stare elementy mogą stracić ważność
Wczytanie bieżącego URL driver.get(driver.getCurrentUrl()) Gdy helper pracuje na adresach URL i chcesz wymusić nowe wejście na ten sam adres To nie zawsze jest semantycznie to samo co kliknięcie odświeżania w przeglądarce
Reload przez JavaScript executeScript("window.location.reload()") Jako wariant awaryjny albo wtedy, gdy potrzebujesz większej kontroli nad kontekstem skryptu Po takim reloadzie nadal musisz sam zadbać o oczekiwanie na stan aplikacji

Przeczytaj również: Fixture w testach - jak stabilizować automatyzację?

Składnia w popularnych językach

  • Java: driver.navigate().refresh();
  • Python: driver.refresh()
  • JavaScript: await driver.navigate().refresh();
  • C#: driver.Navigate().Refresh();
  • Ruby: driver.navigate.refresh

Ja zwykle zaczynam od native refresh, bo jest najbardziej jednoznaczny. Dopiero jeśli mam specyficzny helper oparty na URL-ach albo problematyczny przypadek z aplikacją, schodzę do alternatywy.

W dokumentacji Selenium widać też wyraźnie, że refresh jest częścią nawigacji przeglądarki, a nie osobnym „trikiem” testowym. To dobra wskazówka: im bliżej zachowania realnego użytkownika, tym łatwiej później zrozumieć wyniki testu.

Kiedy refresh wygrywa z ponownym wejściem na adres

Refresh i ponowne wejście na ten sam URL wyglądają podobnie, ale w testach nie są wymienne w stu procentach. Ja rozdzielam je według intencji, a nie według przyzwyczajenia.

Sytuacja Lepszy wybór Dlaczego
Chcę odświeżyć dashboard po aktualizacji danych refresh() To najbliższe temu, co zrobiłby użytkownik, i najlepiej pasuje do weryfikacji widoku po pollingowej aktualizacji
Helper testowy operuje wyłącznie na URL-ach get(current_url) Gdy kod już zarządza adresami, ponowne wejście na ten sam URL bywa czytelniejsze niż mieszanie kilku obiektów nawigacji
Trzeba awaryjnie wymusić reload w trudnym środowisku JavaScript reload To dobry wariant pomocniczy, ale nie powinien być domyślną odpowiedzią na każdy problem

Warto też pamiętać o ograniczeniach. Na stronach z formularzem wysyłanym metodą POST odświeżenie może uruchomić komunikat o ponownym wysłaniu danych albo zmienić stan aplikacji w sposób, którego nie planowałeś. W aplikacjach z ciężkim frontem i wieloma stanami po stronie klienta lepiej najpierw sprawdzić, czy naprawdę potrzebujesz reloadu, czy raczej nowego wejścia do scenariusza.

Jeśli test dotyka autoryzacji, cookies albo lokalnego stanu przeglądarki, ani refresh, ani ponowne wejście na URL nie dają „czystej kartki”. Wtedy trzeba rozwiązać problem u źródła, a nie mnożyć odświeżenia.

Jak uniknąć błędów po przeładowaniu

Najczęstszy problem po reloadzie to stale element reference. Dokumentacja Selenium wprost pokazuje, że po odświeżeniu strony albo zmianie DOM referencja do elementu może przestać być ważna, więc trzeba go odszukać ponownie. To jeden z tych błędów, które początkujący często interpretują jako „Selenium nie działa”, choć w praktyce problem leży w cyklu życia elementu.

Ja stosuję trzy zasady: nie trzymam `WebElement` przez refresh, po reloadzie wyszukuję element jeszcze raz i czekam na konkretny sygnał gotowości, a nie na sam fakt zakończenia nawigacji.

By status = By.cssSelector("[data-test='status']");
driver.navigate().refresh();

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(d -> d.findElement(status).isDisplayed());

To jest bezpieczniejsze niż ślepe `Thread.sleep`, bo opiera się na warunku, który naprawdę ma znaczenie dla testu. Jeśli potrzebujesz innego sygnału, możesz czekać na tekst, URL, tytuł albo zniknięcie elementu ładowania. W aplikacjach dynamicznych samo `readyState = complete` bywa za słabe, bo JavaScript potrafi jeszcze przez chwilę dogrywać treść i zmieniać DOM po stronie klienta.

Praktycznie rzecz biorąc, im bardziej selektywnie czekasz, tym mniej flakiness przenosi się na cały suite. To zwykle daje większy efekt niż kolejne próby „naprawiania” testu po odświeżeniu.

Nie traktuj odświeżania jako naprawy złego stanu testu

Refresh bywa kuszącym skrótem, ale nie powinien zastępować porządnego przygotowania testu. Selenium zaleca zaczynanie każdego scenariusza od znanego, czystego stanu, a jeśli to możliwe, od osobnego WebDrivera dla każdego testu. To nie jest detal organizacyjny, tylko fundament stabilności.

W praktyce odświeżenie nie rozwiązuje takich rzeczy jak:

  • zanieczyszczone cookies lub `localStorage`,
  • stan sesji przenoszony między testami,
  • dane przygotowane ręcznie zamiast przez API lub fixture,
  • zależność jednego testu od wyniku innego testu,
  • ukryte opóźnienia w aplikacji, które refresh tylko maskuje.

Ja zwykle patrzę na częste odświeżanie jak na objaw, a nie rozwiązanie. Jeśli test wymaga kilku reloadów, żeby przejść, to najczęściej problem leży w przygotowaniu danych, synchronizacji albo w samej architekturze scenariusza. Dokumentacja Selenium zresztą zachęca, by nie używać przeglądarki do przygotowywania wszystkiego od zera, jeśli ten sam efekt da się osiągnąć szybciej przez API lub inny niż przeglądarka poziom testu.

To ważne szczególnie w dużych suite’ach, gdzie każde dodatkowe odświeżenie spowalnia wykonanie i zwiększa liczbę miejsc, w których coś może się rozjechać.

Co warto wdrożyć od razu w swoim helperze

Jeśli miałbym zamknąć cały temat w jednym nawyku, byłby to prosty helper: odśwież stronę, a potem poczekaj na konkretny, biznesowy warunek. Nie na sam fakt „strona się załadowała”, tylko na coś, co faktycznie potwierdza gotowość aplikacji do kolejnego kroku.

void refreshAndWait(WebDriver driver, By locator) {
    driver.navigate().refresh();
    new WebDriverWait(driver, Duration.ofSeconds(10))
        .until(d -> d.findElement(locator).isDisplayed());
}

W mojej praktyce najlepiej działają testy, które odświeżają stronę rzadko, celowo i zawsze z warunkiem końcowym. Jeśli musisz sięgać po reload często, warto najpierw poprawić setup, izolację danych i sposób oczekiwania na stan aplikacji. Wtedy odświeżanie przestaje być protezą, a staje się normalnym, przewidywalnym elementem scenariusza.

FAQ - Najczęstsze pytania

Nie zawsze. Choć to najbezpieczniejsza domyślna opcja, po odświeżeniu stare referencje do elementów mogą stać się nieaktualne. Często potrzebne jest ponowne wyszukanie elementów i użycie explicit wait, aby poczekać na konkretny stan aplikacji, a nie tylko na załadowanie strony.

Odświeżenie strony w Selenium to ponowne załadowanie bieżącej strony w tej samej karcie, co symuluje akcję użytkownika. Nie resetuje to stanu przeglądarki, sesji ani ciasteczek. Aby uzyskać "czystą kartkę", należy raczej uruchomić nowy WebDriver lub odpowiednio zarządzać stanem testu.

Użyj `driver.get(driver.getCurrentUrl())`, gdy Twój helper testowy operuje na adresach URL i chcesz wymusić nowe wejście na ten sam adres. Jest to przydatne, gdy potrzebujesz, aby przeglądarka potraktowała to jako nową nawigację, a nie tylko odświeżenie bieżącej zawartości.

Aby uniknąć błędu "Stale Element Reference", po odświeżeniu strony zawsze wyszukuj elementy ponownie. Nie trzymaj referencji do `WebElement` przez refresh. Dodatkowo, użyj `WebDriverWait` do oczekiwania na konkretny, biznesowy warunek gotowości elementu, a nie tylko na zakończenie nawigacji.

Częste odświeżanie strony w testach Selenium jest zazwyczaj objawem problemów, a nie rozwiązaniem. Może wskazywać na niewłaściwe przygotowanie danych testowych, problemy z synchronizacją lub niestabilność samej aplikacji. Lepszym podejściem jest zapewnienie czystego stanu początkowego dla każdego testu.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi:

selenium refresh page selenium staleelementreferenceexception po odświeżeniu jak czekać po odświeżeniu strony selenium

Udostępnij artykuł

Dawid Kowalczyk

Dawid Kowalczyk

Jestem Dawid Kowalczyk, analitykiem branżowym z wieloletnim doświadczeniem w obszarze technologii. Od ponad pięciu lat zajmuję się analizowaniem trendów rynkowych oraz innowacji technologicznych, co pozwoliło mi zgromadzić głęboką wiedzę na temat najnowszych osiągnięć w tej dziedzinie. Moim celem jest uproszczenie złożonych danych oraz dostarczanie obiektywnej analizy, która pomoże czytelnikom lepiej zrozumieć dynamiczny świat technologii. Wierzę w siłę rzetelnych informacji, dlatego dokładam wszelkich starań, aby moje teksty były aktualne i oparte na wiarygodnych źródłach. Jako doświadczony twórca treści, dążę do tego, aby każdy artykuł dostarczał wartościowych informacji, które są nie tylko interesujące, ale także użyteczne dla moich czytelników.

Napisz komentarz