Playwright Fortgeschrittene Seitenoperationen

In diesem Kapitel stellen wir erweiterte Seitenoperationen von Playwright vor, die näher an realen Testanforderungen sind undWartemechanismen, Formularverarbeitung, Popup-Dialogeund weitere erweiterte Funktionen abdecken.


Wartemechanismus

Einer der größten Vorteile von Playwright istintelligentes Warten (Auto-Waiting): Die meisten Operationen (wie z. B.click, fill) wartet automatisch darauf, dass das Element sichtbar und bedienbar ist. In komplexen Szenarien müssen Sie das Warten jedoch weiterhin manuell steuern.

1. Implizites Warten (Auto-Warten)

Playwrights integrierter Wartemechanismus:

  • Element ist sichtbar
  • Klickbar / Interaktiv
  • Seite vollständig geladen

Beispiel

await page.click('#submit'); // Automatisch warten, bis die Schaltfläche sichtbar und klickbar ist

2. Explizites Warten

Wartemethoden explizit aufrufen, z. B. auf einen Selektor, Text oder eine Anfrage warten.

Beispiel

await page.waitForSelector('#result', { state: 'visible' });

HäufigstateWerte:

  • 'attached'→ Element erscheint im DOM
  • 'visible'→ Element ist auf der Seite sichtbar
  • 'hidden'→ Element ist ausgeblendet
  • 'detached'→ Element wurde entfernt

3. Warten, bis ein Element erscheint / verschwindet

// 等待元素出现
await page.waitForSelector('#loading', { state: 'visible' });

// 等待元素消失
await page.waitForSelector('#loading', { state: 'hidden' });

4. Warten, bis eine Netzwerkanfrage abgeschlossen ist

Warten, bis eine bestimmte Anfrage abgeschlossen ist; wird häufig für AJAX-Anfragen oder API-Aufrufe verwendet.

// 等待指定 URL 的请求完成
await page.waitForResponse(response => 
  response.url().includes('/api/login') && response.status() === 200
);

5. Benutzerdefinierte Wartebedingungen

Durchpage.waitForFunctionBenutzerdefinierte Wartelogik ausführen.

// 等待页面上计数器达到 10
await page.waitForFunction(() => {
  return document.querySelector('#count').innerText === '10';
});

Formularverarbeitung

Formulare sind das häufigste Interaktionsszenario beim Testen. Playwright bietet eine umfangreiche API, um Formularsteuerelemente zu bedienen.

1. Operationen mit Eingabefeldern

await page.fill('#username', 'admin');  // 清空并输入
await page.type('#search', 'Playwright', { delay: 100 }); // 模拟逐字输入

2. Auswahl im Dropdown-Menü

// 通过 value
await page.selectOption('#country', 'china');

// 通过标签文本
await page.selectOption('#country', { label: 'United States' });

// 通过 index
await page.selectOption('#country', { index: 2 });

3. Kontrollkästchen und Radio-Buttons

// 勾选复选框
await page.check('#agree');

// 取消勾选
await page.uncheck('#subscribe');

// 点击单选框
await page.check('input[type="radio"][value="male"]');

4. Datei-Upload

// 直接上传文件
await page.setInputFiles('#upload', 'example.png');

// 上传多个文件
await page.setInputFiles('#upload', ['a.png', 'b.png']);

// 清空文件
await page.setInputFiles('#upload', []);

5. Formularübermittlung

Es gibt zwei Möglichkeiten, ein Formular abzusenden:

  • Klicken Sie auf die Schaltfläche „Absenden“
  • Formularübermittlungsereignis direkt auslösen
await page.click('button[type="submit"]');
// 或者
await page.press('#form input[name="email"]', 'Enter');

Popups und Dialoge

Playwright kannbrowsereigene Popups(alert, confirm, prompt) sowie benutzerdefinierte Modale erfassen und behandeln.

1. Umgang mit Alert

page.once('dialog', async dialog => {
  console.log(dialog.message()); // 打印弹窗内容
  await dialog.accept(); // 点击 "确定"
});

await page.click('#show-alert');

2. Umgang mit Confirm

page.once('dialog', async dialog => {
  console.log(dialog.message());
  await dialog.dismiss(); // 点击 "取消"
});

await page.click('#show-confirm');

3. Umgang mit Prompt

page.once('dialog', async dialog => {
  console.log(dialog.message());
  await dialog.accept('Playwright'); // 输入内容并确认
});

await page.click('#show-prompt');

4. Benutzerdefiniertes Modal

Benutzerdefinierte Modals (wie Bootstrap / Ant Design) sind eigentlich gewöhnliche DOM-Elemente, und Sie können direktLokalisierung + Interaktionverwenden, um sie zu schließen oder Eingaben vorzunehmen.

await page.click('#open-modal');
await page.fill('.modal input[name="name"]', 'Test User');
await page.click('.modal button.confirm');

Praktischer Fall — Automatisierungstests für Registrierungsformulare

Das folgende Beispiel wird umfassendWartemechanismen, Formularoperationen, Dateiupload, Dialogbehandlung verwenden。

Beispiel

// register-test.js
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: false, slowMo: 500 });
  const context = await browser.newContext();
  const page = await context.newPage();

  // 1. Die Registrierungsseite öffnen
  await page.goto('https://example.com/register', { waitUntil: 'domcontentloaded' });

  // 2. Warten, bis das Formular erscheint
  await page.waitForSelector('#register-form', { state: 'visible' });

  // 3. Grundlegende Informationen eingeben
  await page.fill('#username', 'testuser');
  await page.fill('#email', '[email protected]');
  await page.fill('#password', 'Password123');

  // 4. Land aus Dropdown auswählen
  await page.selectOption('#country', { label: 'China' });

  // 5. Bedingungen akzeptieren
  await page.check('#agree');

  // 6. Avatar hochladen
  await page.setInputFiles('#avatar', 'avatar.png');

  // 7. Auf Absenden klicken
  page.once('dialog', async dialog => {
    console.log('Popup-Inhalt:', dialog.message());
    await dialog.accept(); // Auf OK klicken
  });
  await page.click('button[type="submit"]');

  // 8. Auf die Weiterleitung nach dem Absenden warten
  await page.waitForLoadState('networkidle');

  // 9. Ergebnis prüfen (ob es Willkommenstext enthält)
  const successText = await page.textContent('.welcome-message');
  console.log('Registrierungsergebnis:', successText);

  // 10. Screenshot aufnehmen und speichern
  await page.screenshot({ path: 'register-success.png' });

  await browser.close();
})();

Wirkung nach der Ausführung:

  • Formular automatisch ausfüllen, Land auswählen, Avatar hochladen
  • Popups automatisch behandeln
  • Nach dem Absenden einen Screenshot aufnehmen und die Willkommensnachricht überprüfen

Vollständige API

Das Folgende ist eine Zusammenstellung vonSeitennavigation, Warten, Formularen, Interaktion, Popupsgängigen APIs:

Kategorie Methode / Eigenschaft Beschreibung
Seitennavigation page.goto(url[, options]) Seite öffnen
page.reload([options]) Seite aktualisieren
page.goBack([options]) Zurück
page.goForward([options]) Vorwärts
page.waitForLoadState([state, options]) Warten, bis das Laden abgeschlossen ist
Wartemechanismus page.waitForSelector(selector[, options]) Warten, bis ein Element erscheint/verschwindet
page.waitForResponse(fn[, options]) Auf die Antwort der angegebenen Anfrage warten
page.waitForFunction(pageFn[, arg, options]) Benutzerdefinierte Wartebedingungen
Element-Lokalisierung page.locator(selector) Generischer Locator
page.getByRole(role, options) Nach Rolle lokalisieren
page.getByText(text) Nach Text lokalisieren
page.getByPlaceholder(text) Eingabe-Platzhalter
page.getByLabel(text) Formular-Label
Formularoperationen page.fill(selector, value) Eingabefeld (leeren und ausfüllen)
page.type(selector, text[, options]) Zeichenweises Tippen simulieren
page.press(selector, key) Taste auf Element drücken
page.selectOption(selector, values) Dropdown-Menü-Auswahl
page.check(selector[, options]) Kontrollkästchen/Optionsfeld aktivieren
page.uncheck(selector[, options]) Auswahl aufheben
page.setInputFiles(selector, files) Datei-Upload
Grundlegende Interaktion page.click(selector[, options]) Element anklicken
page.dblclick(selector[, options]) Doppelklicken
page.hover(selector[, options]) Hover
page.mouse.move(x, y) Maus bewegen
page.mouse.click(x, y[, options]) Mausklick
page.dragAndDrop(src, dest[, options]) Element ziehen
Umgang mit Popups page.on('dialog', handler) Auf Dialogereignisse lauschen
dialog.message() Popup-Text abrufen
dialog.accept([promptText]) Bestätigen (Inhalt kann eingegeben werden)
dialog.dismiss() Cancel
Screenshot und Assertion page.screenshot({ path }) Screenshot aufnehmen und speichern
page.textContent(selector) Textinhalt abrufen
expect(locator).toHaveText(text) Text-Assertion (erfordert die Verwendung von@playwright/test)
Weitere Erweiterungen