Извлечение данных и валидация в 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для проверок.
Пример
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. Таким образом, у вас будет и практический опыт, и краткая справочная таблица.
Практический пример — проверка входа и снимок экрана
Этот пример охватывает:Извлечение информации + проверка утверждений + скриншоты страниц。
Пример
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') |