Extraction et validation des données avec Playwright
L'extraction et la validation de données sont essentielles aux tests automatisés, comprenant principalementla récupération des données de page, la validation des assertions, les captures d'écran et l'enregistrement, qui permettent non seulement de vérifier si les fonctionnalités sont correctes, mais aussi de faciliter le débogage et les tests de régression.
Récupération des informations sur les éléments
Lors des tests, vous devez souvent lire les informations de la page pour validation. Playwright fournit un riche ensemble d'API.
1. Obtenir le contenu textuel
Exemple
const text = await page.textContent('#welcome');
console.log(text);
// Obtenir le texte de plusieurs éléments
const items = await page.$$eval('.list-item', els => els.map(e => e.textContent));
console.log(items);
2. Obtenir les valeurs d'attributs
const value = await page.getAttribute('#username', 'placeholder');
console.log(value); // "请输入用户名"
3. Obtenir les informations de style
// 获取元素的 style 属性
const color = await page.$eval('#btn', el => getComputedStyle(el).color);
console.log(color);
4. Vérification de l'état des éléments
await page.isVisible('#dialog'); // 是否可见
await page.isHidden('#loading'); // 是否隐藏
await page.isEnabled('#submit'); // 是否可用
await page.isDisabled('#submit'); // 是否禁用
await page.isChecked('#agree'); // 复选框是否选中
Assertions et validation
Playwright fournitune bibliothèque d'assertions intégrée(@playwright/test), ce qui facilite l'écriture de cas de test.
1. Méthodes d'assertion intégrées
Dans@playwright/testDans , utilisezexpectpour les assertions.
Exemple
test('Validation Example', async ({ page }) => {
await page.goto('https://example.com');
// Assertion de texte
await expect(page.locator('h1')).toHaveText('Example Domain');
// Assertion d'attribut
await expect(page.locator('a')).toHaveAttribute('href', 'https://www.iana.org/domains/example');
// Assertion de visibilité
await expect(page.locator('h1')).toBeVisible();
});
2. Validation du contenu textuel
await expect(page.locator('#message')).toHaveText('登录成功');
await expect(page.locator('#username')).toHaveValue('testuser');
3. Validation de l'état des éléments
await expect(page.locator('#submit')).toBeEnabled();
await expect(page.locator('#agree')).toBeChecked();
await expect(page.locator('#loading')).toBeHidden();
4. Validation du titre de la page et de l'URL
await expect(page).toHaveTitle(/Playwright/);
await expect(page).toHaveURL('https://playwright.dev/');
Captures d'écran et enregistrement
Les captures d'écran et l'enregistrement sont très utiles pour le débogage, l'analyse des cas d'échec et les tests de régression.
1. Capture d'écran de la page
await page.screenshot({ path: 'screenshot.png', fullPage: true });
path: Chemin d'enregistrementfullPage: Indique s'il faut capturer toute la page
2. Capture d'écran d'un élément
const element = page.locator('#logo');
await element.screenshot({ path: 'logo.png' });
3. Enregistrement vidéo
Lors de la créationcontext, activez l'enregistrement :
const context = await browser.newContext({
recordVideo: { dir: 'videos/' }
});
const page = await context.newPage();
await page.goto('https://example.com');
await context.close(); // 关闭后保存视频
4. Comparaison de captures d'écran (tests d'instantanés)
Playwright prend en charge la comparaison d'instantanés, couramment utilisée dans les tests de régression.
import { test, expect } from '@playwright/test';
test('页面快照测试', async ({ page }) => {
await page.goto('https://playwright.dev');
expect(await page.screenshot()).toMatchSnapshot('homepage.png');
});
Il compare les captures d'écran avec les images de référencehomepage.pngpour détecter les changements d'interface.
D'accord ✅ Ensuite, je vaisChapitre 6 : Extraction et validation des donnéesajouter uncas pratique complet, et compilerun tableau comparatif d'API. Ainsi, vous aurez à la fois une expérience pratique et un tableau de référence rapide.
Cas pratique — Validation de connexion et capture d'écran instantanée
Ce cas couvre :Extraction d'informations + validation d'assertions + captures d'écran de page。
Exemple
import { test, expect } from '@playwright/test';
test('Connexion de l'utilisateur et vérification des résultats', async ({ page }) => {
// 1. Ouvrir la page de connexion
await page.goto('https://example.com/login');
// 2. Saisir le nom d'utilisateur et le mot de passe
await page.fill('#username', 'testuser');
await page.fill('#password', 'Password123');
// 3. Cliquer sur connexion
await page.click('#submit');
// 4. Attendre la redirection et vérifier le titre
await expect(page).toHaveTitle(/Dashboard/);
// 5. Vérifier le texte de bienvenue
await expect(page.locator('.welcome')).toHaveText('Bienvenue, testuser');
// 6. Vérifier l'état du bouton
await expect(page.locator('#logout')).toBeVisible();
await expect(page.locator('#logout')).toBeEnabled();
// 7. Récupérer l'attribut ID utilisateur et vérifier
const userId = await page.getAttribute('#user-profile', 'data-id');
console.log('ID utilisateur :', userId);
expect(userId).not.toBeNull();
// 8. Capture d'écran de la page
await page.screenshot({ path: 'login-success.png', fullPage: vrai });
// 9. Comparaison d'instantanés (tests de régression de l'interface utilisateur)
expect(await page.screenshot()).toMatchSnapshot('dashboard.png');
});
Ce test vérifiera :
- Si le titre de la page et le texte d'accueil sont corrects
- Si les éléments sont visibles / activés
- Si l'attribut d'informations utilisateur existe
- Comparaison de capture d'écran de page et d'instantané d'interface utilisateur
Tableau des API courantes
Ci-dessous se trouve le tableau récapitulatif des API liées àl'extraction et à la validation des données.
| Méthode | Description | Exemple |
|---|---|---|
page.textContent(selector) |
Obtenir le contenu textuel de l'élément | await page.textContent('#msg') |
page.innerText(selector) |
Obtenir le texte brut rendu | await page.innerText('#msg') |
page.innerHTML(selector) |
Obtenir le HTML de l'élément | await page.innerHTML('#content') |
page.getAttribute(selector, name) |
Obtenir la valeur de l'attribut | await page.getAttribute('#btn', 'class') |
page.$eval(selector, fn) |
Exécuter une fonction sur l'élément | await page.$eval('#logo', el => el.tagName) |
page.$$eval(selector, fn) |
Exécuter des fonctions par lots | await page.$$eval('.item', els => els.length) |
page.isVisible(selector) |
Est visible | await page.isVisible('#dialog') |
page.isHidden(selector) |
Est masqué | await page.isHidden('#loading') |
page.isEnabled(selector) |
Est activé | await page.isEnabled('#submit') |
page.isDisabled(selector) |
Est désactivé | await page.isDisabled('#submit') |
page.isChecked(selector) |
Est coché | await page.isChecked('#agree') |
Assertions et validation (@playwright/test)
| Méthode | Description | Exemple |
|---|---|---|
expect(locator).toHaveText(value) |
Vérifier le texte | expect(page.locator('h1')).toHaveText('欢迎') |
expect(locator).toHaveValue(value) |
Vérifier la valeur du champ | expect(page.locator('#user')).toHaveValue('test') |
expect(locator).toHaveAttribute(name, value) |
Vérifier l'attribut | expect(page.locator('#btn')).toHaveAttribute('type', 'submit') |
expect(locator).toBeVisible() |
L'élément est visible | expect(page.locator('#msg')).toBeVisible() |
expect(locator).toBeHidden() |
L'élément est masqué | expect(page.locator('#loading')).toBeHidden() |
expect(locator).toBeEnabled() |
L'élément est activé | expect(page.locator('#submit')).toBeEnabled() |
expect(locator).toBeDisabled() |
L'élément est désactivé | expect(page.locator('#submit')).toBeDisabled() |
expect(locator).toBeChecked() |
L'élément est coché | expect(page.locator('#agree')).toBeChecked() |
expect(page).toHaveTitle(title) |
Vérification du titre de la page | expect(page).toHaveTitle(/Dashboard/) |
expect(page).toHaveURL(url) |
Vérification de l'URL de la page | expect(page).toHaveURL('https://example.com/dashboard') |
Captures d'écran et enregistrement
| Méthode | Description | Exemple |
|---|---|---|
page.screenshot(options) |
Capture d'écran de page | await page.screenshot({ path: 'page.png' }) |
locator.screenshot(options) |
Capture d'écran d'élément | await page.locator('#logo').screenshot({ path: 'logo.png' }) |
context = browser.newContext({ recordVideo }) |
Activer l'enregistrement vidéo | recordVideo: { dir: 'videos/' } |
expect(await page.screenshot()).toMatchSnapshot(name) |
Comparaison de captures d'écran (tests de snapshot) | expect(await page.screenshot()).toMatchSnapshot('home.png') |