Testy pisane w Selenium są dosyć “drogie”. Trudniej je utrzymać niż testy API, a dodatkowo nie możemy ich pisać na wczesnym etapie tworzenia danej funkcjonalności, gdy nie mamy jeszcze graficznego interfejsu. Co więcej, testy te trwają stosunkowo długo. Dzieje się tak, ponieważ testy Selenium opierają się na warstwie GUI, a wyklikiwanie na niej akcji zawsze zajmuje więcej czasu niż odpytanie o to samo API. Czas wykonywania testów w Selenium możemy zredukować na wiele sposobów, a jednym z nich jest wykorzystanie trybu headless.
Spis treści
Tryb headless w Selenium
Uruchomienie przeglądarki w trybie headless to uruchomienie jej bez interfejsu. Oznacza to, że nie zobaczymy okna przeglądarki, ale nadal możemy się z nią komunikować. Właśnie w ten sposób możemy odpalić nasze testy, żeby przyspieszyć ich wykonanie.
No dobra, a jak to wygląda w praktyce? Załóżmy, że chcemy uruchomić testy w trybie headless w przeglądarce Chrome – aby to zrobić, potrzebujemy najpierw stworzyć obiekt ChromeOptions(). Następnie za pomocą metody addArguments() dodajemy odpowiedni argument. Na koniec przekazujemy w konstruktorze drivera referencję do obiektu klasy ChromeOptions(). Być może kojarzycie coś takiego:
Możemy również zamiast addArguments(), wywołać metodę setHeadless() i zadziała ona dokładnie tak samo:
Z tą różnicą, że metoda setHeadless() ma zostać usunięta w wersji 4.10 Selenium.
Nowy tryb headless w Chrome
Ale dlaczego setHeadless() ma zostać usunięte, zapytacie. Obecnie przeglądarka Chrome posiada nowy tryb headless, który pozwala w pełni korzystać z funkcjonalności przeglądarki, w tym na uruchamianie rozszerzeń. Ten nowy tryb od wersji 96 ustawialiśmy następująco:
--headless=chrome
A od wersji 109 wygląda to już tak:
--headless=new
Metoda setHeadless() używająca tego “starego” trybu headless zostanie zatem usunięta, żeby nie tworzyć kolejnej metody dla nowego trybu. Po prostu teraz będziemy to sobie ustawiać za pomocą addArguments(). Poniżej przykład dla wersji 109 Chrome’a:
Kod jest napisany dla Selenium w wersji 4.7, dla którego nie trzeba już samodzielnie pobierać drivera. Artykuł na ten temat przeczytacie tutaj.
A co z innymi przeglądarkami?
Testy w trybie headless możemy również pisać dla innych przeglądarek, na przykład dla Firefoxa lub Edge. Wystarczy tylko, że obiekty ChromeOptions() i ChromeDriver() zamienimy na obiekty odpowiadające wybranej przeglądarce i przekażemy odpowiedni argument.
Co nam to daje?
Najlepiej o zaletach trybu headless przekonać się w praktyce. W tym celu napisałam kilka krótkich testów i porównałam czas ich wykonania. To są wyniki testów wykonanych w “normalnym” trybie:

A to w trybie headless:

W przykładzie skróciliśmy czas wykonywania testów aż o 25%. Zwróćcie uwagę na to, że wykorzystałam bardzo mały zestaw testowy. Wyobraźcie sobie ile czasu możecie zaoszczędzić, gdy tych testów jest dużo więcej.
Szanujmy swój czas
W pracy testera szybko można zauważyć, że liczba testów stale rośnie. Zestawy testowe mogą składać się z kilkudziesięciu lub nawet kilkuset testów, a na dodatek muszą być odpalane po każdej wprowadzonej zmianie do oprogramowania. Trochę niezręcznie opóźniać deploy na produkcję o kolejne godziny, bo testy Selenium dalej lecą i końca nie widać. 😉 Czas kosztuje, dlatego warto zaprzyjaźnić się z trybem headless już na początku swojej przygody z automatyzacją.
Znacie inne sposoby na skrócenie czasu wykonywania testów w Selenium? Dajcie znać!