Playwright Auto-wait und Timeout

Dieses Kapitel bietet eine ausführliche Einführung in den Auto-wait-Mechanismus von Playwright sowie umfassendes Wissen zu manuellem Warten und Timeout-Konfiguration.


Warum brauchen wir Auto-wait

Moderne Webanwendungen setzen stark auf asynchrones Rendering, und Seiteninhalte werden nicht sofort vollständig geladen.

In traditionellen Test-Frameworks müssen Entwickler schreibensleepoderwaitForDiese Warteoperationen sind nicht flexibel genug – entweder warten sie zu lange und verlangsamen die Tests, oder sie warten zu kurz und verursachen flaky Tests.

Playwright integriert Wartelogik in jeden Locator und jede Action und löst dieses Problem grundlegend.


Dreischichtiges Auto-Wait-System

Ebene 1: Locator-Auto-Wait

Wenn Sie einen Locator erstellen, sucht Playwright nicht sofort nach dem Element; stattdessen beginnt es zu suchen und wartet automatisch, wenn Sie eine Aktion oder Assertion ausführen.

Beispiel

// Locator erstellen (das Element wird an dieser Stelle noch nicht gesucht)
const btn = page.getByRole('button', { name: 'Delayed button' });

// Automatisch auf das Erscheinen der Schaltfläche beim Klicken warten (wartet bis zum Action-Timeout)
await btn.click();

Ebene 2: Prüfung der Aktionsausführbarkeit

Bevor eine Aktion ausgeführt wird (click, fill usw.), stellt Playwright sicher, dass das Element: Angehängt → Sichtbar → Stabil → Empfängt Ereignisse → Aktiviert ist.

Ebene 3: Automatische Wiederholung von Assertions

Wenn eine Assertion fehlschlägt, wird nicht sofort ein Fehler gemeldet; stattdessen wird weiter wiederholt, bis die Bedingung erfüllt ist oder ein Timeout auftritt.

Beispiel

// Diese Assertion wird 5 Sekunden lang wiederholt, bis der Text erscheint oder ein Timeout auftritt
await expect(page.getByText('Data loading complete')).toBeVisible();

Manuelle Wartemethoden

In speziellen Szenarien, in denen das automatische Warten nicht ausreicht, bietet Playwright auch manuelle Wartemethoden.

page.waitForTimeout(ms) — Feste Wartezeit

Beispiel

// Feste Wartezeit von 2 Sekunden (allgemein nicht empfohlen)
await page.waitForTimeout(2000);

Versuchen Sie, es zu vermeiden.waitForTimeoutFestes Warten ist bei Unterschieden in der Geräteleistung extrem instabil. Bevorzugen Sie die folgendenwaitForURL、waitForResponseereignisgesteuerten Wartezeiten.

page.waitForURL() — Auf URL-Änderung warten

Beispiel

// Auf exakte URL-Übereinstimmung warten
await page.waitForURL('https://www.example.com/dashboard');

// Warten, bis die URL ein bestimmtes Muster enthält
await page.waitForURL(/dashboard/);

page.waitForLoadState() — Auf Ladezustand warten

Beispiel

// Auf das load-Ereignis warten
await page.waitForLoadState('load');

// Auf DOMContentLoaded warten
await page.waitForLoadState('domcontentloaded');

// Auf Netzwerk-Leerlauf warten
await page.waitForLoadState('networkidle');

page.waitForResponse() — Auf Netzwerkantwort warten

Beispiel

// Auf eine bestimmte API-Antwort warten
const response = await page.waitForResponse(
  resp => resp.url().includes('/api/data') && resp.status() === 200
);

// Antwortdaten abrufen
const data = await response.json();

page.waitForEvent() — Auf Ereignis warten

Beispiel

// Warten, bis das Popup erscheint
const dialogPromise = page.waitForEvent('dialog');
await page.getByRole('button', { name: 'Delete' }).click();
const dialog = await dialogPromise;
await dialog.accept();

// Warten, bis eine neue Seite geöffnet wird
const pagePromise = page.context().waitForEvent('page');
await page.getByRole('link', { name: 'Open in new window' }).click();
const newPage = await pagePromise;

Timeout-Konfiguration erklärt

Playwright hat 4 Arten von Timeouts, die jeweils auf einer anderen Ebene wirken:

Timeout-TypSpeicherort der KonfigurationsdateiStandardwertGilt für
Test-Timeouttimeout30000msGesamter Testfall
Expect-Timeoutexpect.timeout5000msAssertion-Wiederholung
Aktions-Timeoutuse.actionTimeoutKeine (unbegrenzt)Elementoperationen (click, fill usw.)
Navigations-Timeoutuse.navigationTimeoutKeine (unbegrenzt)Seitennavigation (goto, goBack usw.)

Globale Konfiguration

Beispiel

// Dateipfad: playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
  // Gesamt-Timeout für jeden Test (Millisekunden)
  timeout: 60000,

  // Timeout für automatische Wiederholung der Assertion
  expect: {
    timeout: 10000,
  },

  Verwenden Sie: {
    // Timeout für jede Aktion (click, fill usw.)
    actionTimeout: 15000,

    // Timeout für jede Navigation
    navigationTimeout: 30000,
  },
});

Einstellungen pro Aufruf (höhere Priorität als globale Konfiguration)

Beispiel

// Gesamt-Timeout für einen einzelnen Test festlegen
test.setTimeout(120000);

// Timeout für eine einzelne Aktion festlegen
await page.getByRole('button').click({ timeout: 30000 });

// Timeout für eine einzelne Navigation festlegen
await page.goto('https://www.example.com/', { timeout: 60000 });

Timeout-Priorität

Einstellungen pro Aufruf > Einstellungen der globalen Konfigurationsdatei > Standardwerte.


Vorschläge für eine sinnvolle Einstellung von Timeouts

SzenarioEmpfohlener TimeoutBeschreibung
Lokale EntwicklungStandardwerteLokale Dienste reagieren schnell; Standardwerte sind ausreichend.
CI-Umgebung2–3-Fache des StandardwertsDie Leistung von CI-Maschinen schwankt erheblich.
Langsame SeitenactionTimeout: 15000Große Formulare, komplexe Seiten
Aufrufe von Drittanbieter-Dienstentest.setTimeout(120000)Externe API-Antworten sind langsam.
Andere Erweiterungen