Извлечение данных и валидация в Playwright

Извлечение и проверка данных — ключевые для автоматизированного тестирования, в основном включаютполучение данных страницы, проверку утверждений, скриншоты и запись; они не только проверяют, корректна ли функциональность, но и помогают при отладке и регрессионном тестировании.

Получение информации об элементах

При тестировании часто нужно считывать информацию со страницы для проверки. Playwright предоставляет богатый набор API.

1. Получение текстового содержимого

Пример

// Получить текст одного элемента
const text = await page.textContent('#welcome');
console.log(text);

// Получить текст нескольких элементов
const items = await page.$$eval('.list-item', els => els.map(e => e.textContent));
console.log(items);

2. Получить значения атрибутов

const value = await page.getAttribute('#username', 'placeholder');
console.log(value); // "请输入用户名"

3. Получить информацию о стилях

// 获取元素的 style 属性
const color = await page.$eval('#btn', el => getComputedStyle(el).color);
console.log(color);

4. Проверка состояния элемента

await page.isVisible('#dialog');   // 是否可见
await page.isHidden('#loading');   // 是否隐藏
await page.isEnabled('#submit');   // 是否可用
await page.isDisabled('#submit');  // 是否禁用
await page.isChecked('#agree');    // 复选框是否选中

Утверждения и валидация

Playwright предоставляетвстроенную библиотеку утверждений(@playwright/test), что упрощает написание тестовых сценариев.

1. Встроенные методы утверждений

В@playwright/testВ , используйтеexpectдля проверок.

Пример

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

test('Validation Example', async ({ page }) => {
  await page.goto('https://example.com');

  // Проверка текста
  await expect(page.locator('h1')).toHaveText('Example Domain');

  // Проверка атрибута
  await expect(page.locator('a')).toHaveAttribute('href', 'https://www.iana.org/domains/example');

  // Проверка видимости
  await expect(page.locator('h1')).toBeVisible();
});

2. Проверка текстового содержимого

await expect(page.locator('#message')).toHaveText('登录成功');
await expect(page.locator('#username')).toHaveValue('testuser');

3. Проверка состояния элемента

await expect(page.locator('#submit')).toBeEnabled();
await expect(page.locator('#agree')).toBeChecked();
await expect(page.locator('#loading')).toBeHidden();

4. Проверка заголовка и URL страницы

await expect(page).toHaveTitle(/Playwright/);
await expect(page).toHaveURL('https://playwright.dev/');

Скриншоты и запись

Скриншоты и запись очень полезны при отладке, анализе случаев сбоя и регрессионном тестировании.

1. Скриншот страницы

await page.screenshot({ path: 'screenshot.png', fullPage: true });
  • path: Путь сохранения
  • fullPage: Захватывать ли всю страницу

2. Скриншот элемента

const element = page.locator('#logo');
await element.screenshot({ path: 'logo.png' });

3. Запись видео

При созданииcontext, включите запись:

const context = await browser.newContext({
  recordVideo: { dir: 'videos/' }
});
const page = await context.newPage();
await page.goto('https://example.com');
await context.close(); // 关闭后保存视频

4. Сравнение скриншотов (тестирование снимков)

Playwright поддерживает сравнение снимков, обычно используется при регрессионном тестировании.

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

test('页面快照测试', async ({ page }) => {
  await page.goto('https://playwright.dev');
  expect(await page.screenshot()).toMatchSnapshot('homepage.png');
});

Он сравнивает скриншоты с эталонными изображениямиhomepage.pngчтобы обнаруживать изменения интерфейса.

Хорошо ✅ Тогда яГлава 6: Извлечение данных и валидациядобавлюполный практический пример, и составлютаблицу сравнения API. Таким образом, у вас будет и практический опыт, и краткая справочная таблица.


Практический пример — проверка входа и снимок экрана

Этот пример охватывает:Извлечение информации + проверка утверждений + скриншоты страниц。

Пример

// login-test.spec.js
import { test, expect } from '@playwright/test';

test('Вход пользователя и проверка результатов', async ({ page }) => {
  // 1. Открыть страницу входа
  await page.goto('https://example.com/login');

  // 2. Введите имя пользователя и пароль
  await page.fill('#username', 'testuser');
  await page.fill('#password', 'Password123');

  // 3. Нажмите Войти
  await page.click('#submit');

  // 4. Дождитесь перенаправления и проверьте заголовок
  await expect(page).toHaveTitle(/Dashboard/);

  // 5. Проверьте приветственный текст
  await expect(page.locator('.welcome')).toHaveText('Добро пожаловать, testuser');

  // 6. Проверьте состояние кнопки
  await expect(page.locator('#logout')).toBeVisible();
  await expect(page.locator('#logout')).toBeEnabled();

  // 7. Получите атрибут ID пользователя и проверьте
  const userId = await page.getAttribute('#user-profile', 'data-id');
  console.log('User ID:', userId);
  expect(userId).not.toBeNull();

  // 8. Снимок экрана страницы
  await page.screenshot({ path: 'login-success.png', fullPage: истина });

  // 9. Сравнение снимков (регрессионное тестирование UI)
  expect(await page.screenshot()).toMatchSnapshot('dashboard.png');
});

Этот тест проверит:

  • Правильность заголовка страницы и приветственного текста
  • Видимость / доступность элементов
  • Наличие атрибута информации о пользователе
  • Сравнение скриншота страницы и снимка UI

Таблица общих API

Ниже представленасводная таблица API, связанного с извлечением и проверкой данных.

Метод Описание Пример
page.textContent(selector) Получить текстовое содержимое элемента await page.textContent('#msg')
page.innerText(selector) Получить отрендеренный простой текст await page.innerText('#msg')
page.innerHTML(selector) Получить HTML элемента await page.innerHTML('#content')
page.getAttribute(selector, name) Получить значение атрибута await page.getAttribute('#btn', 'class')
page.$eval(selector, fn) Выполнить функцию на элементе await page.$eval('#logo', el => el.tagName)
page.$$eval(selector, fn) Выполнить функции пакетно await page.$$eval('.item', els => els.length)
page.isVisible(selector) Видимый await page.isVisible('#dialog')
page.isHidden(selector) Скрытый await page.isHidden('#loading')
page.isEnabled(selector) Включён await page.isEnabled('#submit')
page.isDisabled(selector) Отключено await page.isDisabled('#submit')
page.isChecked(selector) Отмечено await page.isChecked('#agree')

Утверждения и валидация (@playwright/test)

Метод Описание Пример
expect(locator).toHaveText(value) Проверить текст expect(page.locator('h1')).toHaveText('欢迎')
expect(locator).toHaveValue(value) Проверить значение поля ввода expect(page.locator('#user')).toHaveValue('test')
expect(locator).toHaveAttribute(name, value) Проверить атрибут expect(page.locator('#btn')).toHaveAttribute('type', 'submit')
expect(locator).toBeVisible() Элемент видим expect(page.locator('#msg')).toBeVisible()
expect(locator).toBeHidden() Элемент скрыт expect(page.locator('#loading')).toBeHidden()
expect(locator).toBeEnabled() Элемент включён expect(page.locator('#submit')).toBeEnabled()
expect(locator).toBeDisabled() Элемент отключён expect(page.locator('#submit')).toBeDisabled()
expect(locator).toBeChecked() Элемент отмечен expect(page.locator('#agree')).toBeChecked()
expect(page).toHaveTitle(title) Проверка заголовка страницы expect(page).toHaveTitle(/Dashboard/)
expect(page).toHaveURL(url) Проверка URL страницы expect(page).toHaveURL('https://example.com/dashboard')

Скриншоты и запись

Метод Описание Пример
page.screenshot(options) Скриншот страницы await page.screenshot({ path: 'page.png' })
locator.screenshot(options) Скриншот элемента await page.locator('#logo').screenshot({ path: 'logo.png' })
context = browser.newContext({ recordVideo }) Включить запись видео recordVideo: { dir: 'videos/' }
expect(await page.screenshot()).toMatchSnapshot(name) Сравнение скриншотов (snapshot-тестирование) expect(await page.screenshot()).toMatchSnapshot('home.png')
Другие расширения