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
2. Explizites Warten
Wartemethoden explizit aufrufen, z. B. auf einen Selektor, Text oder eine Anfrage warten.
Beispiel
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
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) |