Sprawdzaj stronę, którą otworzyło kliknięcie
Gdy kliknięcie otwiera popup albo nową kartę, sprawdzaj tamtą stronę. To, że karta otwierająca została na miejscu, nie dowodzi, że nowe okno działa.
Ten wpis jest częścią serii Podstawy Playwright. Jeśli pominąłeś poprzedni, przeczytaj Część 14 — Pliki, które użytkownik naprawdę wysyła.
Wprowadzenie — strona źródłowa się nie ruszyła
Test klika „Zapłać”. Kasa nadal jest na ekranie. Asercja na tej stronie przechodzi. Okno płatności otworzyło się za nią, pokazało błąd, a suite tam nie spojrzała.
Część 14 czekała na pobranie, bo sam klik nie dowodzi, że plik doszedł. Z popupem jest tak samo: liczy się strona, na którą patrzy użytkownik, a nie karta, która została w tle.
Czekaj na popup przed kliknięciem
waitForEvent('popup') rejestrujesz przed kliknięciem. Po kliknięciu okno może już istnieć, a późniejsze czekanie je przegapi.
test('shows the amount in the payment window', async ({ page }) => {
await page.goto('/checkout');
const popupPromise = page.waitForEvent('popup'); // okno, które otwiera to kliknięcie
await page.getByRole('button', { name: 'Pay in a new window' }).click();
const popup = await popupPromise;
await expect(popup.getByRole('heading', { name: 'Pay 49.00' })).toBeVisible();
});
Decyzją jest czekanie na popup. Asercja na page po tym kliknięciu dowodzi tylko tego, że kasa nadal stoi.
Promise.all z czekaniem i kliknięciem to ta sama kolejność. Tak część 14 czekała na pobranie. Użyj formy, którą suite już ma. Nie klikaj najpierw i nie zaczynaj czekać dopiero potem.
Link z target="_blank" odpala to samo zdarzenie. Rola kontrolki nie ma znaczenia. Znaczenie ma to, że produkt otworzył inną stronę.
Nie wymyślaj okna
context.newPage() tworzy pustą kartę, której produkt nie otworzył. Sięgnij po tę metodę, gdy adres otwiera sam test. To złe narzędzie, gdy asercja brzmi „to kliknięcie otworzyło okno płatności”.
Jeśli sam otworzysz adres, pomijasz przycisk, window.open i token, który karta otwierająca dopisała do adresu. Zielony test znaczy wtedy, że /pay wczytuje się po wpisaniu. Nie znaczy, że kliknięcie działa.
Kliknięcie w tej samej karcie nie jest popupem
Jeśli produkt przechodzi na inny adres w tej samej karcie, waitForEvent('popup') czeka do timeoutu. Sprawdź, co aplikacja naprawdę robi. Zachodzi dokładnie jedna z tych sytuacji:
- kliknięcie otwiera inną stronę — czekaj na
popupi sprawdzaj tamtą - kliknięcie zostawia cię w tej karcie — sprawdzaj
toHaveURLalbo nagłówek napage
Nie zostawiaj czekania na popup „na wszelki wypadek” z długim timeoutem. Zawieszenie nie jest zaliczeniem.
Podsumowanie
Uruchom waitForEvent('popup') przed kliknięciem, które ma otworzyć okno. Sprawdzaj stronę, którą to czekanie zwraca. context.newPage() zostaw kartom, które test otwiera celowo. Jeśli produkt zostaje w tej samej karcie, w ogóle nie czekaj na popup.
Zadanie na ten tydzień: Znajdź jeden test, który klika kontrolkę z target="_blank" albo przycisk płatności, a potem sprawdza oryginalne page. Poczekaj na popup i przenieś asercję na to okno.
Następny wpis w serii: Część 16 — Kontrolki wewnątrz ramki.