Testowanie stanowi integralną część cyklu życia oprogramowania. Wiele z czynności procesu testowego możemy zoptymalizować i przyspieszyć poprzez automatyzację. Dlatego w tym artykule skupimy się na porównaniu jednych z najczęściej wykorzystywanych technologii do testów automatycznych – Playwright oraz Selenium.
Selenium i Playwright
W kontekście technicznym są to frameworki służące do automatyzacji testów przeglądarkowych. Zarówno Playwright, jak i Selenium to biblioteki open-source, które za pośrednictwem swoich API i komponentów, umożliwiają pisanie testów, symulowanie interakcji użytkownika i weryfikowanie stanu aplikacji internetowej w różnych przeglądarkach.
Oba narzędzia posiadają bogatą dokumentację oraz własne społeczności, jednak w ostatnim czasie to Playwright staje się narzędziem częściej wybieranym do automatyzacji testów. W dalszej części artykułu dokonamy porównania kilku aspektów, które różnią te narzędzia.
Architektura
Architektura odnosi się do sposobu, w jaki narzędzia do automatyzacji testów są zaprojektowane i jak komunikują się z przeglądarkami. Obejmuje to strukturę orazmetody łączenia i zarządzania zasobami, które wpływają na wydajność i efektywność testowania. Dobrze zaprojektowana architektura pozwala na szybsze wykonywanie testów i lepsze wykorzystanie zasobów komputera, co przekłada się na bardziej efektywne testowanie aplikacji internetowych.

- Selenium
Wykorzystuje starszą architekturę, w której komunikacja z przeglądarką odbywa się za pomocą zdalnego sterownika (drivera). Ta architektura ma tendencję do wywoływania większego narzutu na wydajność, zwłaszcza, gdy testy są wykonywane równocześnie. - Playwright
Posiada nowoczesną architekturę, która pozwala na równoczesne wykonywanie wielu zadań. Każda instancja przeglądarki jest izolowana, co oznacza, że testy mogą być wykonywane równolegle. Playwright kontroluje przeglądarkę przez pojedyncze połączenie, co jest bardziej wydajne niż wielokrotne połączenia w przypadku Selenium.
Asynchroniczność
Asynchroniczność w kontekście automatyzacji testów przeglądarek odnosi się do sposobu, w jaki narzędzie radzi sobie z operacjami, które mogą trwać pewien czas, takimi jak ładowanie stron, znajdowanie elementów czy wykonywanie akcji użytkownika. Playwright i Selenium znacznie różnią się w swoim podejściu do asynchroniczności, co ma wpływ na sposób pisania testów i zarządzania nimi.

- Selenium
Selenium działa głównie w trybie synchronicznym. Każda operacja (np. otwarcie strony, kliknięcie elementu) blokuje wykonanie kolejnych kroków testu do momentu jej zakończenia. Testy w Selenium często wymagają ręcznego zarządzania czasem oczekiwania, np. poprzez ustawianie stałych czasów oczekiwania (sleep) lub wykorzystanie różnych strategii czekania (np. explicit wait, implicit wait). - Playwright
Został zaprojektowany z myślą o asynchroniczności. Domyślnie obsługuje operacje asynchroniczne, co umożliwia bardziej efektywne zarządzanie czasem oczekiwania i synchronizacją. Nawet w wersji synchronicznej Playwright automatycznie zarządza czasem oczekiwania na operacje, co oznacza, że nie trzeba ręcznie ustawiać czasów oczekiwania tak często, jak ma to miejsce w przypadku Selenium.
Natywne czekanie na zdarzenia
Oczekiwanie na elementy przy testach aplikacji, które bazują na UI jest szczególnie ważnym zagadnieniem. Jest to istotne zwłaszcza wtedy, gdy nie mamy dostępu do kodu źródłowego testowanej aplikacji, jak np. w przypadku rozwiązań tworzonych przy pomocy platformy low-code. W takiej sytuacji mechanizmy oferowane przez narzędzia do automatyzacji stają się kluczowe przy wyborze oprogramowania, z którego będziemy korzystać oraz przy określaniu strategii pisania testów.

- Playwright
Charakteryzuje się automatycznym czekaniem na zdarzenia, takie jak pobieranie elementów na stronie, bez konieczności ręcznego dodawania opóźnień.S Dzięki temu testy stają się bardziej wydajne. - Selenium
Selenium posiada natywne wsparcie dla czekania, ale wymaga to ręcznej implementacji. Odpowiedzialność użytkownika za odpowiednią synchronizację wymaga od testera większej wiedzy przy pisaniu testów. W przypadku nieumiejętnej implementacji może prowadzić do spadków w wydajności.
Składnia
Kiedy piszemy testy automatyczne, sposób, w jaki konstruujemy nasz kod, ma ogromne znaczenie dla czytelności, wydajności i łatwości utrzymania. Dlatego warto zrozumieć, jak poszczególne narzędzia różnią się pod względem składni i jakie konsekwencje może to mieć dla naszego procesu testowania.

- Selenium
Wymaga oddzielnych sterowników dla różnych przeglądarek, więcej kodu do skonfigurowania. Składnia jest bardziej skomplikowana, a operacje na elementach wymagają korzystania z większej liczby metod. Zarządzanie czasem wymaga szczegółowej konfiguracji konkretnych metod.
// Przykład testu z wykorzystaniem Selenium + Java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
public class GoogleSearch {
public static void main(String[] args) {
// Ustawienie ścieżki do sterownika ChromeDriver
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver();
// Otwarcie strony Google
driver.get("https://www.google.com");
// Wpisanie frazy w pole wyszukiwania
WebElement searchBox = driver.findElement(By.name("q"));
searchBox.sendKeys("Selenium");
searchBox.submit();
// Czekanie na załadowanie wyników
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".g")));
// Pobranie i wydrukowanie wyników
List<WebElement> results = driver.findElements(By.cssSelector(".g"));
for (WebElement result : results) {
System.out.println(result.getText());
}
// Zamknięcie przeglądarki
driver.quit();
}
}
- Playwright
Wymaga mniej kodu potrzebnego do uruchomienia przeglądarki i otwarcia strony – integracja przeglądarek w jednym API. Składnia jest bardziej zwięzła, a dostępne metody bardziej jednoznaczne. Automatyczne oczekiwanie na elementy również zmniejsza ilość potrzebnego kodu.
// Przykład testu z wykorzystaniem Playwright + JavaScript
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://www.google.com');
await page.fill('input[name="q"]', 'Playwright');
await page.press('input[name="q"]', 'Enter');
await page.waitForSelector('.g');
const results = await page.$$eval('.g', nodes => nodes.map(n => n.innerText));
results.forEach(result => console.log(result));
await browser.close();
})();
Ponadto, Playwright jest narzędziem bardziej zoptymalizowanym do pracy w trybie bezprzeglądarkowym (headless), co znacząco wpływa na szybkość interakcji z testowanym systemem. Tryb ten pozwala na uruchamianie testów bez potrzeby wyświetlania interfejsu użytkownika, co redukuje obciążenie zasobów systemowych i przyspiesza wykonywanie testów. Dzięki temu, m.in. testy mogą być uruchamiane na serwerach CI/CD bez konieczności konfiguracji środowiska graficznego, co znacząco usprawnia proces ciągłej integracji i dostarczania oprogramowania.
Podsumowanie
Przy wyborze narzędzia do automatyzacji testów powinniśmy brać pod uwagi wiele czynników m.in. rodzaj i technologie używane w projekcie, dostępność dodatkowych bibliotek i możliwość integracji z nimi, aby zapewnić jak największe pokrycie testami tworzonej aplikacji, jak również zasoby i wiedzę w organizacji, umożliwiające szybkie wdrożenie w powstające/istniejące rozwiązanie.
W przypadku tworzenia testów automatycznych dla systemów opartych na rozwiązaniach typu low-code, możliwość szybkiej automatyzacji scenariuszy testowych jest kluczowa i zapewnia wsparcie w późniejszych testach regresji, co skraca czas weryfikacji stabilności systemu przy zmianie jego wersji. Prostota składni, wbudowane mechanizmy oczekiwania oraz stabilność i łatwa utrzymywalność testów sprawiają, że Playwright jest narzędziem zapewniającym niższy próg wejścia od Selenium.