Powrót do: Praktyczne wprowadzenie do testów automatycznych z Playwright
Playwright – Twój pierwszy test automatyczny
Wszystkie detale z tym związane znajdziesz na końcu części tekstowej lekcji.
Prezentacja
Dodatkowe materiały
Jeśli takie zaobserwowałeś, oraz blokują twój postęp do daj nam znać w komentarzu.
Kod lekcji na GitHub
Cały kod do tego kursu znajdziesz w dedykowanym repozytorium na GitHub.
Kod do tej lekcji znajduje się w dokładnie w tu: Sekcja 01 Lekcja 01
Instalacja niezbędnych narzędzi
Node.js: środowisko uruchomieniowe dla JavaScript, TypeScript
- Link do pobrania Node.js – https://nodejs.org/en/
VS Code: środowisko do rozwijania oprogramowania
- Link do pobrania VS Code – https://code.visualstudio.com/
Poznajemy stronę
Link do testowanej stronyNowy projekt
Kroki:
- Tworzymy katalogi Projects/demo-bank-tests na dysku C:/
- W katalogu C:/Projects/demo-bank-tests tworzymy (inicjalizujemy) projekt node.js za pomocą komendy:
npm init playwright@latest
- Usuwamy zawartość pliku example.spec.ts, który znajduje się w katalogu tests, który został utworzony po inicjalizacji projektu.
spec
lub test
:.spec.ts lub .test.ts dla języka TypeScript
.spec.js lub .test.js dla języka JavaScript.
Przykładowo:
- example.spec.ts
- login.spec.ts
- user-account.spec.ts
My będziemy korzystać ze słów kluczowych spec
oraz ts
. Domyślnie Playwright rozpoznaje pliki z testami posiadające te wartości w nazwie.
Nagrywamy test
Aby nagrać test za pomocą codegen użyj polecenia:
npx playwright codegen [adres]
czyli np:
npx playwright codegen https://demo-bank.vercel.app/
Testowany scenariusz:
- Wpisz login (dowolne 8 znaków)
- Wpisz hasło (dowolne 8 znaków)
- Kliknij Zaloguj
- Kliknij w nazwę zalogowanego użytkownika: Jan Demobankowy
Aby zakończyć nagrywanie kliknij przycisk czerwonego kwadratu.
Skopiuj cały kod i wklej go w pliku example.spec.ts.
Przykładowy nagrany test:
import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://demo-bank.vercel.app/'); await page.getByTestId('login-input').click(); await page.getByTestId('login-input').fill('testerLO'); await page.getByTestId('password-input').click(); await page.getByTestId('password-input').fill('10987654'); await page.getByTestId('login-button').click(); await page.getByTestId('user-name').click(); });
Możesz zamknąć okna związane z nagrywaniem poprzez zamknięcie przeglądarki do nagrywania.
Modyfikacja pliku konfiguracyjnego Playwright
Wyłączymy inne przeglądarki niż Chromium aby nasze testy przebiegały szybko i bezproblemowo.
Przejdź do pliku: playwright.config.ts. Zaznacz kod:
{ name: 'firefox', use: { ...devices['Desktop Firefox'], }, }, { name: 'webkit', use: { ...devices['Desktop Safari'], }, },
Użyj skrótu klawiszowego Ctrl+/. W ten sposób kod zostanie zakomentowany i te elementy konfiguracji nie będą brane pod uwagę. Efekt:
// { // name: 'firefox', // use: { // ...devices['Desktop Firefox'], // }, // }, // { // name: 'webkit', // use: { // ...devices['Desktop Safari'], // }, // },
Uruchamiamy test
Aby uruchomić testy z katalogu test użyj polecenia:
npx playwright test
Aby uruchomić testy z katalogu test z widocznym oknem przeglądarki użyj polecenia:
npx playwright test --headed
Wyświetlenie raportu
Aby wyświetlić raport z testów użyj polecenia:
npx playwright show-report
Zakończenie wyświetlania raportu. W konsoli użyj skrótu Ctrl + c dwukrotnie.
Asercje i sprawdzenie wyników testów
Aby sprawdzić czy element (o test-id user-name) na stronie ma zadany tekst (Jan Demobankowy) możesz użyć poniższej konstrukcji:
await expect(page.getByTestId('user-name')).toHaveText('Jan Demobankowy');
Testy zakończone niepowodzeniem
Zepsuty krok w teście
Zmień wartość w teście (np. hasło) na niepoprawną i uruchom testy:
await page.getByTestId('password-input').fill('');
Zapoznaj się z raportem a następnie przywróć zmiany do poprzedniej (poprawnej) formy.
Zepsuty krok w asercji
Zmień wartość w asercji (np. oczekiwaną nazwę) na niepoprawną i uruchom testy:
await expect(page.getByTestId('user-name')).toHaveText('Jan DemobankowyX');
Zapoznaj się z raportem a następnie przywróć zmiany do poprzedniej (poprawnej) formy.
Cały kod
Opis instalacji takiego projektu znajdziesz w naszej lekcji Instalacja projektu z pliku w Node.js.
Może się zdarzyć, że gdy strona będzie działała wolniej, to testy będą się zakończyć niepowodzeniem przez przekroczony czas czekania w asercjach. W takim przypadku spróbuj zwiększyć wartość czekania na 8 sekund (czyli na timeout: 8000), a następnie uruchom ponownie test 🙂
Zawartość pliku example.spec.ts:
import { test, expect } from '@playwright/test'; test('test', async ({ page }) => { await page.goto('https://demo-bank.vercel.app/'); await page.getByTestId('login-input').click(); await page.getByTestId('login-input').fill('testerLO'); await page.getByTestId('password-input').click(); await page.getByTestId('password-input').fill('10987654'); await page.getByTestId('login-button').click(); await page.getByTestId('user-name').click(); await expect(page.getByTestId('user-name')).toHaveText('Jan Demobankowy'); });
Zawartość pliku package.json:
{ "name": "demo-bank-tests", "version": "1.0.0", "description": "", "main": "index.js", "scripts": {}, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@playwright/test": "^1.28.1" } }
Zawartość pliku playwright.conf.ts:
import type { PlaywrightTestConfig } from '@playwright/test'; import { devices } from '@playwright/test'; /** * Read environment variables from file. * https://github.com/motdotla/dotenv */ // require('dotenv').config(); /** * See https://playwright.dev/docs/test-configuration. */ const config: PlaywrightTestConfig = { testDir: './tests', /* Maximum time one test can run for. */ timeout: 30 * 1000, expect: { /** * Maximum time expect() should wait for the condition to be met. * For example in `await expect(locator).toHaveText();` */ timeout: 5000 }, /* Run tests in files in parallel */ fullyParallel: true, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: process.env.CI ? 2 : 0, /* Opt out of parallel tests on CI. */ workers: process.env.CI ? 1 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: 'html', /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ actionTimeout: 0, /* Base URL to use in actions like `await page.goto('/')`. */ // baseURL: 'http://localhost:3000', /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', }, /* Configure projects for major browsers */ projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'], }, }, // { // name: 'firefox', // use: { // ...devices['Desktop Firefox'], // }, // }, // { // name: 'webkit', // use: { // ...devices['Desktop Safari'], // }, // }, /* Test against mobile viewports. */ // { // name: 'Mobile Chrome', // use: { // ...devices['Pixel 5'], // }, // }, // { // name: 'Mobile Safari', // use: { // ...devices['iPhone 12'], // }, // }, /* Test against branded browsers. */ // { // name: 'Microsoft Edge', // use: { // channel: 'msedge', // }, // }, // { // name: 'Google Chrome', // use: { // channel: 'chrome', // }, // }, ], /* Folder for test artifacts such as screenshots, videos, traces, etc. */ // outputDir: 'test-results/', /* Run your local dev server before starting the tests */ // webServer: { // command: 'npm run start', // port: 3000, // }, }; export default config;
Sposób importu, obecnie (Q1 2024) wygląda tak:
import { defineConfig, devices } from '@playwright/test';
Brak ustawień timeouts (możesz je śmiało dodać jak to było pokazane w kodzie starszego configa – wręcz to zalecamy). Oto kod ustawień, który już obecnie nie jest dodawany automatycznie (użyte są domyślne wartości dla Playwright taki jak w ustawieniach poniżej):
/* Maximum time one test can run for. */ timeout: 30 * 1000, expect: { /** * Maximum time expect() should wait for the condition to be met. * For example in `await expect(locator).toHaveText();` */ timeout: 5000, },
Usunięcie informacji o action timeout
z sekcji use
. Tak samo jak w przypadku poprzednich ustawień, gdy ich nie ma są używane domyślne wartości:
/* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ actionTimeout: 0,
Pozostałe zmiany dotyczą formatowania i sposobu eksportu ale nie różnią się logiką od poprzedniej konfiguracji.
Hej! Nowy laptop… probuje uruchomic projekt…
No i coś znów mam problemy z Playwright test…
Wtyczka w VSC nie pokazuje testów, komenda npx playwright test nie działa.
1.Utworzylem zupelnie nowy projekt:
2. npm init playwright@latest
3. npx playwright test
No i nie dziala.
Node werjsa: 22.14.0
Windows 11
(
code: ‘MODULE_NOT_FOUND’,
requireStack: [
‘C:\\repos\\test\\playwright.config.ts’,
‘C:\\Users\\michal\\AppData\\Local\\npm-cache\\_npx\\e41f203b7505f1fb\\node_modules\\playwright\\lib\\transform\\transform.js’,
‘C:\\Users\\michal.\\AppData\\Local\\npm-cache\\_npx\\e41f203b7505f1fb\\node_modules\\playwright\\lib\\common\\configLoader.js’,
‘C:\\Users\\michal.\\AppData\\Local\\npm-cache\\_npx\\e41f203b7505f1fb\\node_modules\\playwright\\lib\\program.js’,
‘C:\\Users\\michal.\\AppData\\Local\\npm-cache\\_npx\\e41f203b7505f1fb\\node_modules\\playwright\\cli.js’
)
Podpowiecie co robić? Za kazdym razem gdy trzeba bylo zrobic cos od nowa z instalacja Playwright i VSC mam problemy
Hej Michał,
Gdy się przepinam na nowy komp system, wersje node to zawsze pojawi się jakieś zasko.
Zacznijmy od tego, że problemy mogą być od poziomu uprawnień (np. Node 22 z VSCode nie moga się dobić do plików usera).
Ale też mogą dotyczyć jakiś starych danych z cache i path.
W twoim przypadku zaczą bym od usunięcia całego folderu npm-cache zlokalizowanego w pliku
C:\Users\michal.\AppData\Local
.Usuną bym też cały node-modules z projektu (z poziomu eksploratora plików).
Potem zainstalowałbym przez
npm i
wszystkie paczki.Testy uruchomiłbym z linii poleceń a nie z VSC aby sprawdzić czy VSC coś nie ma problemu z prawami dostępu.
Zweryfikowałbym na koniec instalację Node.js jeśli wciąż były by problemy. Reinstalacja mgła by pomóc.
Daj znaka, która z tych opcji zadziałała (albo i nie).
Powodzenia i z pewnością rozwiążemy problem!
Pozdrawiam.
I jeszcze upewnij się, że uruchamiasz polecenie w folderze w którym masz playwright.config.ts i node-modules. Czasem zdarza się, że przypadkowo polecenia wykonuje się po za głównym folderem projektu i takie błędy mogą się pojawić.
Cześć !
Po przerobieniu kursu z Git’a wróciłam do playwright (który już miałam w sumie przerobiony w połowie) no ale do brzegu. Postanowiłam, że zrobię wszystko prawilnie z połączeniem z zdalnym repozytorium itp. Wszystko działa mogę push’ować, commit’ować nagrywać testy i je poprawiać ALE nie mogę ich odpalać lokalnie 😀 generalnie terminal krzyczy mi ciągle Error: no tests found 😀 Czy macie na to jakąś metodę? czy może coś sknociłam z instalacją? generalnie drzewo projektu wygląda ok itp. więc nie wiem co mogłam zrobić źle 🙁
Hej!
Podeślij mi proszę na maila kontaktowego (znajdziesz go po prawej na pasku bocznym) swój projekt, wykorzystane komendy i screeny z uruchomienia – rzucę na nie okiem 🙂
Błąd Error: no tests found może wynikać z kilku rzeczy, np:
– niepoprawne nazwy plików
– źle nazwany katalog (tests vs e2e)
– niepoprawna komenda do uruchomienia testów
– niepoprawna konfiguracja (w playwright.config.ts i pole
testDir
)Jako zboczenie zawodowe musiałam odnaleźć źródło mojego błędu i go rozwiązać, ale bez Twoich wskazówek zajęło by mi to pewnie dłużej 😀 okazało się, że moje pliki (jak login.spec.ts , czy pliki .json) były poza folderem i znajdowały się “nigdzie” wystarczyło zrobić porządek i przenieś do folderu aby wszystko zadziałało! 🙂 Teraz komendy uruchomieniowe testów działają jak należy! Bardzo dziękuję za pomoc! 🙂
PS. Byłam na Waszej prezentacji na test:fest we Wrocławiu i dzięki temu odkryłam Wasze super kursy, robicie świetną robotę oby tak dalej! Kibicuje 🙂
To świetnie, że Ci się udało 😁 I cała przyjemność po mojej stronie 😉
PS. Dzięki wielkie! 🙇♂️ Cieszę się, że Ci się podobają nasze materiały i mam nadzieje, że możesz wykorzystywać tę wiedzę w projekcie.
Niebawem (4 czerwca) startujemy z webinarem – to mam nadzieje, że zajrzysz 😀
Cześć,
mam kłopot z uruchomieniem testów na Mac’u na którym chciałbym przerobić kurs. Na Windowsie wszytko śmiga ale tutaj dostaję komunikat:
Ustawienia wg Waszych wskazań. Jak mogę uruchomić testy? Gdzie szukać rozwiązania?
Rozwiązałem problem tworząc nowy projekt i przeinstalowując Playwright’a. Póki co działa.
Hej Adam!
Wygląda to jak problem z nierozwiązanymi zależnościami – czyli jakby konflikt po instalacji. Muszę przyznać, że runner testów Playwright jest bardzo wrażliwy na wszelkie problemy w konfiguracji/kodzie/zależnościach.
Ale super, że typowa informatyczna strategia ‘Have you tried turning it off and on again?’ tutaj zadziałał 😁
Warto ją stosować w razie nieoczywistych problemów.
czy istnieje jakaś inna opcja instalacji pakietu playwright niz z poziomu terminala z użyciem playwright@latest? z uwagi na pewne ograniczenia na komputerze służbowym node, visual studio code i niektóre rzeczy działają normalnie niestety ta komenda jest blokowana 🙁
Hej Marcin!
W takim przypadku można sobie ręcznie stworzyć projekt z
npm init
i potem zainstalować Playwright poleceniem:i teraz trzeba dodać samodzielnie playwright.config i folder z testami – wykorzystaj nasze repozytorium do tego https://github.com/jaktestowac/playwright_automatyzacja_wprowadzenie/tree/main/S01_wprowadzenie/L01_pierwszy_test
Ale oczywiście nie obędzie się bez instalacji przeglądarek:
i tu może pojawić się problem z blokowanymi zasobami. W dokumentacji jest kilka tricków (poleceń jakie możesz wykonać przed poleceniem
npx playwright install
)https://playwright.dev/docs/browsers/#install-behind-a-firewall-or-a-proxy
Zobacz te instrukcje i mam nadzieję, że instalacja przebiegnie pomyślnie.
Pozdrawiam i życzę powodzenia🫡
częściowo udało mi się obejść problem – dzięki za porady. Niestety nie jestem w stanie korzystać z 100% dobrodziejstwa playwright, ale testy da się pisać i odpalać na chrome więc to już coś 🙂 Pojawia się u mnie często problem podczas próby uruchomienia automatycznego nagrywania testów – VS Code wyświetla komunikat “spawn UNKNOWN”. Jest na to jakieś obejście? 🙂
Można jeszcze próbować odpalać w niezależnym terminalu systemowym dane polecenia po za VSCode.
Dodatkowo można coś takiego dodać przy uruchamianiu komendy UI Mode z wywołaniem przeglądarki np.
npx playwright test --ui-port=0
Ostatecznie kontakt z suportem IT bo to najczęściej reguły zabezpieczenia maszyny powodują ten błąd ;)
Tak się zastanawiam, czy nie warto pokazać w szkoleniu opcji VSCode automatycznego zapisu zawartości pliku przy przejściu na inne okno.
Wyeliminowałoby to pamiętanie o Ctrl + S
Hej Arek, trafna uwaga – w kolejnej lekcji opisujemy włączenie opcji autosave💪
Ciekawostka 🙂
W nowszych wersjach playwrightj (u mnie 1.40.1)
Można dodać asserty z poziomu codegen 😀
Super spostrzeżenie – od listopadowej wersji w końcu możemy robić też asercje w Codegen! To dobra wiadomość dla wszystkich szybko prototypujących testy w ten sposób.
Wymieniona funkcjonalność pokazuje, że warto czytać release notes Playwright bo zawierają ciekawe informacje.
Hej u mnie brak jest jest tych znaczków, które umożliwiają rozwijanie poszczególnych kroków Przemkowi.
>
>
>
moment kursu to 20:48
mój kod:
import { test, expect } from ‘@playwright/test’;
test(‘test’, async ({ page }) => {
await page.goto(‘https://demo-bank.vercel.app/’);
await page.getByTestId(‘login-input’).click();
await page.getByTestId(‘login-input’).fill(‘testerle’);
await page.getByTestId(‘password-input’).click();
await page.getByTestId(‘password-input’).fill(‘haslohas’);
await page.getByTestId(‘login-button’).click();
await page.getByTestId(‘user-name’).click();
});
Hej,
Jaki wynik otrzymujesz? Jak wygląda Twój raport? 🙂
Cześć, u mnie W części Test zakończony nie powodzeniem błąd pojawia sie w kroku
9 | await page.getByTestId(‘login-button’).click();
W lekcji jest to krok
10 | await page.getByTestId(‘user-name’).click();
Czy ktoś tez ma podobnie?
Hej,
Jaki dokładnie błąd Ci leci? 🙂
Jak wygląda Twój kod testów? 🙂
Treść raportu z błedem:
Natomiast mój kod:
Hej,
Powodem błędu jest puste hasło wpisywane w pole (w linii
await page.getByTestId("password-input").fill("");
).W przypadku gdy nie podamy hasła o wymaganej długości, to przycisk logowania na stronie nie będzie aktywny. To natomiast spowoduje, że Playwright nie będzie “umiał go kliknąć” (Playwright domyślnie czeka, aż element będzie klikalny i aktywny).
Rozwiązaniem tego błędu jest podanie poprawnego hasła (albo raczej hasła o wymaganej długości), np.
await page.getByTestId('password-input').fill('10987654');
🙂Daj proszę znać czy ta poprawka pomogła 🙂
Hej, hej. Dzięki za info. Jednakże nie do końca o to mi chodzi.
25 minuta lekcji – część lekcji: “Test zakończony niepowodzeniem”. Wykonujemy test nic nie podając w polu hasło. Usuwam dane z pola hasło, zapisuję i wykonuję test. Pojawia się raport. Mój raport różni się w stosunku do raportu otrzymanego w lekcji. Mój raport wskazuje, że błąd pojawia się w kroku
9 | await page.getByTestId(‘login-button’).click();
W lekcji jest to krok
10 | await page.getByTestId(‘user-name’).click();
Mój test jak i test w lekcji zakończyły się niepowodzeniem, co jest zgodne z założeniem. Tylko zastanawia mnie skąd różnica w raportach?
O widzisz! To nie zauważyłem tej różnicy 😉
To może być spowodowane, że Przemek korzystał z innej wersji strony – a obecnie jest odrobinę inna (button login jest aktywny dopiero po wpisaniu hasła).
Mogą pojawić się niewielkie różnice miedzy tym co na nagraniu, a tym co jest aktualnie na stronie (spowodowane przez mikro zmiany i aktualizacje) 🙂
Spoko, dzięki bardzo za pomoc! 🙂