Artykuł zaczniemy od wyjaśnienia, co to jest Playwright.

Definicja Playwright: "Playwright to framework do automatyzacji testów end-to-end, stworzony przez Microsoft. Narzędzie to zapewnia prosty i wydajny interfejs API do kontroli przeglądarek, takich jak Chromium, Firefox i WebKit, umożliwiając użytkownikom wykonywanie rzeczywistych akcji, takich jak interakcja ze stronami internetowymi, wypełnianie formularzy, klikanie przycisków czy wykonywanie zrzutów ekranu."
 

Główne zalety dla użytkownika

  • Wieloprzeglądarkowy. Playwright obsługuje wszystkie nowoczesne silniki renderujące, w tym Chromium, WebKit i Firefox.
  • Wieloplatformowy. Testowanie na systemach Windows, Linux i macOS, lokalnie lub na CI, w trybie głowicowym lub z interfejsem graficznym.
    Wielojęzyczny. Korzystaj z interfejsu API Playwright w językach takich jak TypeScript, JavaScript, Python, .NET, Java.
  • Testowanie stron internetowych na urządzeniach mobilnych. Emulacja natywna dla przeglądarki Google Chrome na systemie Android oraz Mobile Safari. Ten sam silnik renderujący działa na Twoim komputerze stacjonarnym i w chmurze.
  • Automatyczne czekanie na elementy. Playwright oczekuje na elementy, zanim zostaną podjęte działania. Posiada również bogaty zestaw zdarzeń introspekcyjnych. Połączenie obu eliminuje potrzebę stosowania sztucznych opóźnień - głównego powodu niestabilności testów.
  • Asercje. Sprawdzenia są automatycznie ponawiane, aż zostaną spełnione niezbędne warunki.
  • Śledzenie (tracing). Konfiguracja strategii ponownego próbowania testów, przechwytywanie śladu wykonania, nagrania wideo, zrzuty ekranu w celu eliminacji niestabilności.
  • Wiele wszystkiego. Scenariusze testowe obejmujące wiele kart, różne źródła i wielu użytkowników. Twórz scenariusze z różnymi kontekstami dla różnych użytkowników i uruchamiaj je na Twoim serwerze, wszystko w ramach jednego testu.
  • Zaufane zdarzenia. Najedź na elementy, oddziałuj na dynamiczne kontrolki, generuj zaufane zdarzenia. Playwright wykorzystuje prawdziwy potok wejściowy przeglądarki nie do odróżnienia od użytkownika rzeczywistego.
  • Testowanie ramek, przenikanie do Shadow DOM. Selektory Playwright przenikają do Shadow DOM i pozwalają na płynne przechodzenie między ramkami.
  • Konteksty przeglądarki. Playwright tworzy kontekst przeglądarki dla każdego testu. Kontekst przeglądarki równoznaczny jest z zupełnie nowym profilem przeglądarki. Tworzenie nowego kontekstu przeglądarki zajmuje tylko kilka milisekund i zapewnia pełną izolację testów bez dodatkowego obciążenia.
  • Jednorazowe logowanie. Zachowaj stan uwierzytelnienia kontekstu i ponownie używaj go we wszystkich testach. Pozwala to uniknąć powtarzających się operacji logowania w każdym teście, zapewniając jednocześnie pełną izolację niezależnych testów.

Tworzenie frameworku Playwright + Python + Pytest

Uwaga! Poniższy przykład przedstawia tworzenie frameworku na urządzeniu Mac.
 

Instalacja
Standardowo Python jest już zainstalowany na Macu, można to zweryfikować używając w terminalu komendy:

Jeżeli python nie jest zainstalowany lub jest w wersji 2.x, postępuj według kroków z tego linku: python.org

Zainstaluj pytest z playwright:

Zainstaluj wymagane przeglądarki (domyślnie będzie ustawione Chromium):

Zainstaluj pytest-xdist aby uruchamiać wiele testów równocześnie:

Aby sprawdzić czy główny setup działa, należy tymczasowo stworzyć plik test_example.py w którym umieszczamy ponizszy kod:

Następnie w terminalu wpisać komendę i wcisnąć enter:

Testy działają w trybie headless wiec nie bedzie widoku UI, natomiast w terminalu powinna wyświetlić się informacja że testy przeszły. Jeżeli tak się stało, usuń plik test_example.py. WSZYSTKO GOTOWE!

Page Objects oraz wyszukiwanie lokatorów

Page Object to wzorzec projektowy używany głównie w testowaniu oprogramowania. Jest to sposób organizacji kodu testów automatycznych w aplikacjach, które posiadają interfejs użytkownika. Poniższy przykład pokazuje przykład Page Objects dla strony, która odpowiada za logowanie:

W __init__ definiujemy nasze lokatory, które później wykorzystujemy w tworzeniu wielokrotnego użytku funkcjonalności takich jak submit_login. 

Lokatory stanowią sposób na znalezienie elementu(-ów) na stronie w dowolnym momencie. Poniżej, przedstawione zostały rekomendowane przez Playwright sposoby znajdowania lokatorów:

  • page.get_by_role() - lokalizuje za pomocą jawnych i domyślnych atrybutów dostępności.
  • page.get_by_text() - lokalizuje po treści tekstowej.
  • page.get_by_label() - lokalizuje formularz kontrolny po tekście związanym z etykietą.
  • page.get_by_placeholder() - lokalizuje pole wprowadzania po atrybucie placeholder.
  • page.get_by_alt_text() - lokalizuje element, zwykle obraz, po jego alternatywnym tekście.
  • page.get_by_title() - lokalizuje element po atrybucie title.
  • page.get_by_test_id() - lokalizuje element na podstawie atrybutu data-testid (inne atrybuty można skonfigurować).


Dodatkowo lokatory w Playright można identyfikować używając page.locator(), który przyjmuje jako argumenty różne rodzaje selektorów, które mogą być używane do zlokalizowania elementów na stronie. Może to być selektor CSS, XPath lub inne zgodne z narzędziem automatyzacji przeglądarki.

Wyszukiwanie oraz tworzenie/generowanie lokatorów w Playwrightcie jest łatwe z tego względu, że dostarcza on nam specjalną konsolę, która generuje nam sposób sam lokator po zaznaczeniu elementu. Aby uruchomić konsolę do znajdowania i generowania lokatorów należy użyć komendy:


 

Tworzenie testów

Tworzymy klasę o nazwie LoginTest, która będzie przechowywać testy. Poniżej pokazany jest przykład takiej klasy:

  • Fixture Setup (Ustawienia Fixture):
    • Klasa TestLogin zawiera dekorator @pytest.fixture, który definiuje fixture o nazwie setup.
    • Argument scope="function" oznacza, że ta fixture zostanie wykonana dla każdej funkcji testowej.
    • Argument autouse=True wskazuje, że fixture ta będzie używana automatycznie, bez konieczności jawnej deklaracji w testach.
    • Wewnątrz tej fixture ustawiane są atrybuty self.page i self.login_page na podstawie przekazanej strony (page) oraz utworzonej instancji klasy LoginPage.
  • Metoda Testowa (Test):
    • Metoda testowa test_has_title jest odpowiedzialna za sprawdzenie, czy proces logowania działa poprawnie.
    • Pierwszy krok to nawigacja do strony logowania przy użyciu self.login_page.navigate().
    • Następnie używamy funkcji expect, aby zweryfikować, czy tytuł strony logowania jest widoczny (to_be_visible()).
    • Kolejnym krokiem jest przesłanie danych logowania (w tym przykładzie: "standard_user" i "secret_sauce") za pomocą self.login_page.submit_login.
    • Ostatecznie, lokalizujemy przycisk menu na stronie i znowu używamy expect do sprawdzenia, czy jest on widoczny.

Wartość tego kodu polega na testowaniu poprawności funkcji logowania na stronie internetowej przy użyciu frameworka Pytest. Fixture setup zapewnia, że niezbędne obiekty są skonfigurowane przed wykonaniem testu. Sam test sprawdza, czy strona logowania wyświetla się poprawnie, czy dane logowania są akceptowane, a przycisk menu jest dostępny po zalogowaniu.

Uruchamianie testów

Framework Pytest oferuje różne opcje konfiguracyjne dla uruchamiania testów, w tym możliwość określenia, na jakiej przeglądarce mają być uruchamiane, czy uruchamiania w trybie równoległym (parallel). Poniżej przedstawiamy rozbudowany opis sposobów uruchamiania testów:


Uruchamianie na jednej przeglądarce:
Aby uruchomić testy na jednej przeglądarce, możemy skorzystać z parametru --browser, który zostanie przekazany do testów jako argument. Na przykład:

W kodzie testu, należy odpowiednio dostosować konfigurację przeglądarki w zależności od przekazanego parametru.
 

Uruchamianie na trzech przeglądarkach:
Aby uruchomić testy na trzech przeglądarkach, możemy skorzystać, podobnie jak w przypadku jednej przeglądarki,  z parametru --browser, który zostanie przekazany do testów jako argument. Na przykład:



To polecenie uruchamia testy na trzech różnych przeglądarkach, przekazując trzy różne wartości dla argumentu --browser. Testy będą uruchamiane pojedynczo na każdej przeglądarce.


Uruchamianie w trybie parallel:
Aby uruchomić testy równolegle, możemy skorzystać z flagi -n lub --numprocesses w Pytest. Przykładowo:


 

To uruchomi testy równolegle na trzech procesach. Warto jednak upewnić się, że testy są napisane w sposób thread-safe, aby uniknąć konfliktów między równocześnie działającymi testami.


Uruchamianie na trzech przeglądarkach w trybie parallel:
Aby uruchomić testy na trzech różnych przeglądarkach jednocześnie, wykorzystując tryb równoległy w frameworku Pytest, możemy skorzystać z flagi -n auto, która automatycznie dostosowuje liczbę procesów do dostępnych rdzeni procesora. Poniżej znajdziesz przykładowe polecenie do uruchomienia testów wraz z odpowiednimi argumentami dla przeglądarek:

Opis Polecenia:

  • pytest test_login.py: Uruchamia testy zawarte w pliku test_login.py przy użyciu frameworka Pytest.
  • --browser chrome --browser firefox --browser edge: Przekazuje trzy różne argumenty --browser z wartościami chrome, firefox i edge.
  • -n auto: Flagę -n auto używamy do automatycznego dostosowania liczby procesów do dostępnych rdzeni procesora.


Równoczesne Uruchamianie na Trzech Przeglądarkach:

  • Każda z trzech przeglądarek (chrome, firefox, edge) będzie uruchamiana równocześnie, dzięki zastosowaniu flagi -n auto.


Korzyści:
 

  • Równoczesne testowanie na różnych przeglądarkach pozwala na skrócenie czasu trwania całego procesu testowania.
  • Automatyczne dostosowanie liczby procesów do dostępnych zasobów systemowych.



Podsumowanie


Artykuł omawia framework Playwright, stworzony przez Microsoft, który służy do automatyzacji testów end-to-end. Playwright obsługuje przeglądarki takie jak Chromium, Firefox i WebKit, oferując prosty i wydajny interfejs API do interakcji z stronami internetowymi.

Główne zalety Playwright to wieloprzeglądarkowość, wieloplatformowość, obsługa wielu języków programowania, testowanie na urządzeniach mobilnych, auto-czekanie, asercje, śledzenie (tracing), oraz możliwość testowania ramek i przenikania do Shadow DOM.

Dalej zostały przedstawione kroki do stworzenia frameworku Playwright z użyciem języka Python i narzędzia Pytest na platformie Mac. Wskazuje na instalację niezbędnych komponentów, tworzenie Page Objects do reprezentowania stron internetowych, oraz wykorzystanie różnych sposobów wyszukiwania lokatorów.

Dodatkowo, czytelnik dowiaduje się, jak tworzyć testy przy użyciu Pytest, implementując klasę TestLogin, która wykorzystuje Page Objects do testowania procesu logowania na stronie internetowej.

Artykuł kończy się opisem różnych opcji uruchamiania testów przy użyciu Pytest, w tym możliwości uruchamiania na jednej lub wielu przeglądarkach jednocześnie, a także w trybie równoległym.

Podsumowując, artykuł dostarcza kompleksowej informacji na temat frameworku Playwright, prezentuje praktyczny przykład jego implementacji w połączeniu z Pythonem i Pytestem, oraz oferuje wskazówki dotyczące konfiguracji i uruchamiania testów.
 

autor: Jarosław Dąbrowski 
Senior Test Engineer