Playwright Datenextraktion und Validierung
Datenextraktion und -Validierung sind entscheidend für automatisiertes Testen, hauptsächlich einschließlichAbrufen von Seitendaten, Assertion-Validierung, Screenshots und Aufzeichnung, die nicht nur überprüfen, ob die Funktionalität korrekt ist, sondern auch beim Debugging und bei Regressionstests helfen.
Abrufen von Elementinformationen
Beim Testen müssen Sie häufig Seiteninformationen zur Validierung lesen. Playwright bietet einen umfangreichen Satz von APIs.
1. Textinhalt abrufen
Beispiel
const text = await page.textContent('#welcome');
console.log(text);
// Den Text mehrerer Elemente abrufen
const items = await page.$$eval('.list-item', els => els.map(e => e.textContent));
console.log(items);
2. Attributwerte abrufen
const value = await page.getAttribute('#username', 'placeholder');
console.log(value); // "请输入用户名"
3. Style-Informationen abrufen
// 获取元素的 style 属性
const color = await page.$eval('#btn', el => getComputedStyle(el).color);
console.log(color);
4. Elementzustand prüfen
await page.isVisible('#dialog'); // 是否可见
await page.isHidden('#loading'); // 是否隐藏
await page.isEnabled('#submit'); // 是否可用
await page.isDisabled('#submit'); // 是否禁用
await page.isChecked('#agree'); // 复选框是否选中
Assertions und Validierung
Playwright bieteteine integrierte Assertion-Bibliothek(@playwright/test), was das Schreiben von Testfällen erleichtert.
1. Integrierte Assertion-Methoden
In@playwright/testIn , verwenden Sieexpectfür Assertions.
Beispiel
test('Validation Example', async ({ page }) => {
await page.goto('https://example.com');
// Text-Assertion
await expect(page.locator('h1')).toHaveText('Example Domain');
// Attribut-Assertion
await expect(page.locator('a')).toHaveAttribute('href', 'https://www.iana.org/domains/example');
// Sichtbarkeits-Assertion
await expect(page.locator('h1')).toBeVisible();
});
2. Validierung des Textinhalts
await expect(page.locator('#message')).toHaveText('登录成功');
await expect(page.locator('#username')).toHaveValue('testuser');
3. Validierung des Elementzustands
await expect(page.locator('#submit')).toBeEnabled();
await expect(page.locator('#agree')).toBeChecked();
await expect(page.locator('#loading')).toBeHidden();
4. Validierung von Seitentitel und URL
await expect(page).toHaveTitle(/Playwright/);
await expect(page).toHaveURL('https://playwright.dev/');
Screenshots und Aufzeichnung
Screenshots und Aufzeichnungen sind sehr nützlich beim Debugging, bei der Fehlerfallanalyse und beim Regressionstest.
1. Seiten-Screenshot
await page.screenshot({ path: 'screenshot.png', fullPage: true });
path: SpeicherpfadfullPage: Ob die gesamte Seite erfasst werden soll
2. Element-Screenshot
const element = page.locator('#logo');
await element.screenshot({ path: 'logo.png' });
3. Videoaufzeichnung
Beim Erstellencontext, Aufzeichnung aktivieren:
const context = await browser.newContext({
recordVideo: { dir: 'videos/' }
});
const page = await context.newPage();
await page.goto('https://example.com');
await context.close(); // 关闭后保存视频
4. Screenshot-Vergleich (Snapshot-Testing)
Playwright unterstützt Snapshot-Vergleich, der häufig bei Regressionstests verwendet wird.
import { test, expect } from '@playwright/test';
test('页面快照测试', async ({ page }) => {
await page.goto('https://playwright.dev');
expect(await page.screenshot()).toMatchSnapshot('homepage.png');
});
Es vergleicht Screenshots mit Referenzbildernhomepage.pngum UI-Änderungen zu erkennen.
Okay ✅ Dann werde ichKapitel 6: Datenextraktion und Validierungeinenvollständigen praktischen Fallhinzufügen undeine API-Vergleichstabelle erstellen. Auf diese Weise haben Sie sowohl praktische Erfahrung als auch eine Schnellreferenztabelle.
Praktischer Fall — Login-Validierung und Screenshot-Snapshot
Dieser Fall behandelt:Informationsextraktion + Assertion-Validierung + Seiten-Screenshots。
Beispiel
import { test, expect } from '@playwright/test';
test('Benutzeranmeldung und Überprüfung der Ergebnisse', async ({ page }) => {
// 1. Login-Seite öffnen
await page.goto('https://example.com/login');
// 2. Benutzername und Passwort eingeben
await page.fill('#username', 'testuser');
await page.fill('#password', 'Password123');
// 3. Auf Anmelden klicken
await page.click('#submit');
// 4. Auf Weiterleitung warten und Titel prüfen
await expect(page).toHaveTitle(/Dashboard/);
// 5. Willkommenstext überprüfen
await expect(page.locator('.welcome')).toHaveText('Welcome, testuser');
// 6. Button-Status prüfen
await expect(page.locator('#logout')).toBeVisible();
await expect(page.locator('#logout')).toBeEnabled();
// 7. Benutzer-ID-Attribut abrufen und überprüfen
const userId = await page.getAttribute('#user-profile', 'data-id');
console.log('User ID:', userId);
expect(userId).not.toBeNull();
// 8. Seiten-Screenshot
await page.screenshot({ path: 'login-success.png', fullPage: wahr });
// 9. Snapshot-Vergleich (UI-Regressionstests)
expect(await page.screenshot()).toMatchSnapshot('dashboard.png');
});
Dieser Test überprüft:
- Ob der Seitentitel und der Begrüßungstext korrekt sind
- Ob Elemente sichtbar / aktiviert sind
- Ob das Benutzerinfo-Attribut existiert
- Vergleich von Seiten-Screenshot und UI-Snapshot
Gängige API-Tabelle
Nachfolgend istDatenextraktion und -validierungzugehörige API-Übersichtstabelle.
| Methode | Beschreibung | Beispiel |
|---|---|---|
page.textContent(selector) |
Element-Textinhalt abrufen | await page.textContent('#msg') |
page.innerText(selector) |
Gerenderten reinen Text abrufen | await page.innerText('#msg') |
page.innerHTML(selector) |
Element-HTML abrufen | await page.innerHTML('#content') |
page.getAttribute(selector, name) |
Attributwert abrufen | await page.getAttribute('#btn', 'class') |
page.$eval(selector, fn) |
Eine Funktion auf dem Element ausführen | await page.$eval('#logo', el => el.tagName) |
page.$$eval(selector, fn) |
Funktionen im Batch ausführen | await page.$$eval('.item', els => els.length) |
page.isVisible(selector) |
Ist sichtbar | await page.isVisible('#dialog') |
page.isHidden(selector) |
Ist ausgeblendet | await page.isHidden('#loading') |
page.isEnabled(selector) |
Ist aktiviert | await page.isEnabled('#submit') |
page.isDisabled(selector) |
Ist deaktiviert | await page.isDisabled('#submit') |
page.isChecked(selector) |
Ist markiert | await page.isChecked('#agree') |
Assertions und Validierung (@playwright/test)
| Methode | Beschreibung | Beispiel |
|---|---|---|
expect(locator).toHaveText(value) |
Text überprüfen | expect(page.locator('h1')).toHaveText('欢迎') |
expect(locator).toHaveValue(value) |
Eingabewert überprüfen | expect(page.locator('#user')).toHaveValue('test') |
expect(locator).toHaveAttribute(name, value) |
Attribut überprüfen | expect(page.locator('#btn')).toHaveAttribute('type', 'submit') |
expect(locator).toBeVisible() |
Element ist sichtbar | expect(page.locator('#msg')).toBeVisible() |
expect(locator).toBeHidden() |
Element ist ausgeblendet | expect(page.locator('#loading')).toBeHidden() |
expect(locator).toBeEnabled() |
Element ist aktiviert | expect(page.locator('#submit')).toBeEnabled() |
expect(locator).toBeDisabled() |
Element ist deaktiviert | expect(page.locator('#submit')).toBeDisabled() |
expect(locator).toBeChecked() |
Element ist markiert | expect(page.locator('#agree')).toBeChecked() |
expect(page).toHaveTitle(title) |
Überprüfung des Seitentitels | expect(page).toHaveTitle(/Dashboard/) |
expect(page).toHaveURL(url) |
Überprüfung der Seiten-URL | expect(page).toHaveURL('https://example.com/dashboard') |
Screenshots und Aufzeichnung
| Methode | Beschreibung | Beispiel |
|---|---|---|
page.screenshot(options) |
Seiten-Screenshot | await page.screenshot({ path: 'page.png' }) |
locator.screenshot(options) |
Element-Screenshot | await page.locator('#logo').screenshot({ path: 'logo.png' }) |
context = browser.newContext({ recordVideo }) |
Videoaufzeichnung aktivieren | recordVideo: { dir: 'videos/' } |
expect(await page.screenshot()).toMatchSnapshot(name) |
Screenshot-Vergleich (Snapshot-Testing) | expect(await page.screenshot()).toMatchSnapshot('home.png') |