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

// Obtenir le texte d'un seul élément
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

import { test, expect } from '@playwright/test';

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'enregistrement
  • fullPage: 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

// login-test.spec.js
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')
Autres extensions