Assertions и проверки

Puppeteer предоставляет мощные инструменты для автоматизации браузера, позволяя выполнять тесты пользовательского интерфейса и взаимодействовать с веб-страницами. Одним из ключевых аспектов эффективного использования Puppeteer является возможность выполнения проверок и утверждений (assertions) для обеспечения правильности работы тестируемых приложений. Assertions помогают убедиться, что элементы на странице отображаются корректно, что страница ведет себя ожидаемым образом, и что данные соответствуют заданным условиям.

Основы утверждений в тестах

В контексте автоматизированных тестов утверждения проверяют состояние системы в момент времени. Если условие не выполняется, тест считается провалившимся. В Puppeteer для выполнения assertions часто используют библиотеки, такие как Jest, Mocha, или Chai, но сами утверждения могут быть интегрированы в код без использования сторонних фреймворков.

Пример простого утверждения

Один из самых распространенных вариантов — проверка наличия элемента на странице. Рассмотрим следующий пример:

const puppeteer = require(&

async function runTest() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');

    const element = await page.$('h1');
    if (!element) {
        throw new Error('Элемент h1 не найден');
    }

    await browser.close();
}

runTest();

В данном примере проверяется, существует ли элемент <h1> на странице. Если элемент не найден, выбрасывается исключение с сообщением об ошибке. Это простая форма утверждения.

Использование ожиданий (waits)

Часто необходимо удостовериться, что элементы на странице появились, прежде чем с ними взаимодействовать. Для этого Puppeteer предоставляет различные методы ожидания, которые позволяют контролировать время загрузки страницы и состояния элементов.

Ожидание появления элемента

Метод page.waitForSelector() позволяет подождать появления элемента на странице, прежде чем выполнять дальнейшие действия.

await page.waitForSelector('h1');

Этот метод будет ожидать, пока элемент <h1> не появится на странице. Если элемент не будет найден в течение указанного времени (по умолчанию 30 секунд), тест завершится ошибкой.

Ожидание изменений в элементе

Иногда нужно дождаться, пока элемент изменит свой вид, например, когда происходит динамическая загрузка контента. В этом случае можно использовать метод waitForFunction:

await page.waitForFunction(
    'document.querySelector("h1").textContent === "Expected Title"'
);

Этот метод проверяет, что текст элемента <h1> совпадает с ожидаемым значением. Если условие не выполнится в течение заданного времени, будет выброшено исключение.

Библиотеки для тестирования и утверждений

Для удобства работы с assertions в тестах, обычно используются библиотеки, такие как Chai, Jest или Mocha, которые интегрируются с Puppeteer и позволяют делать утверждения более декларативными.

Использование Chai для утверждений

Библиотека Chai предоставляет удобный синтаксис для различных типов утверждений. В тестах с Puppeteer ее можно использовать для проверок на существование элементов, значений или состояния.

Пример с использованием Chai:

const puppeteer = require('puppeteer');
const chai = require('chai');
const expect = chai.expect;

async function runTest() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');

    const element = await page.$('h1');
    expect(element).to.not.be.null;

    const title = await page.$eval('h1', el => el.textContent);
    expect(title).to.equal('Expected Title');

    await browser.close();
}

runTest();

В данном примере с использованием Chai выражения expect(element).to.not.be.null и expect(title).to.equal(‘Expected Title’) проверяют, что элемент существует и что его текстовое содержимое соответствует ожидаемому.

Использование Jest для утверждений

Jest — еще одна популярная библиотека для тестирования в JavaScript, которая также может быть использована для выполнения проверок в тестах с Puppeteer. Jest предоставляет встроенные утверждения, такие как expect, и работает очень удобно с асинхронными операциями.

Пример использования Jest:

const puppeteer = require('puppeteer');

describe('Тестирование страницы', () => {
    let browser;
    let page;

    beforeAll(async () => {
        browser = await puppeteer.launch();
        page = await browser.newPage();
    });

    afterAll(async () => {
        await browser.close();
    });

    test('Проверка заголовка страницы', async () => {
        await page.goto('https://example.com');
        const title = await page.$eval('h1', el => el.textContent);
        expect(title).toBe('Expected Title');
    });

    test('Проверка наличия кнопки', async () => {
        const button = await page.$('button');
        expect(button).not.toBeNull();
    });
});

В этом примере expect(title).toBe(‘Expected Title’) и expect(button).not.toBeNull() используются для проверки значений и наличия элементов на странице.

Проверки на основе данных

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

Пример проверки значений:

const puppeteer = require('puppeteer');
const chai = require('chai');
const expect = chai.expect;

async function runTest() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');

    const data = await page.$$eval('table tr', rows => {
        return rows.map(row => {
            const cells = row.querySelectorAll('td');
            return {
                name: cells[0].textContent,
                value: cells[1].textContent
            };
        });
    });

    expect(data).to.deep.equal([
        { name: 'Item 1', value: 'Value 1' },
        { name: 'Item 2', value: 'Value 2' }
    ]);

    await browser.close();
}

runTest();

Здесь с помощью $$eval извлекаются данные из таблицы, и затем они проверяются с использованием expect(data).to.deep.equal(), что гарантирует точное совпадение данных.

Обработка ошибок и асинхронность

Одним из ключевых аспектов работы с Puppeteer и утверждениями является асинхронность. Многие операции, такие как загрузка страниц или получение элементов, требуют ожидания, и ошибки могут возникать, если элементы не появляются вовремя. Важно правильно обрабатывать такие ошибки, используя механизмы try-catch или expect.assertions в Jest.

Пример обработки ошибок:

const puppeteer = require('puppeteer');

async function runTest() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');

    try {
        const element = await page.$('h1');
        if (!element) {
            throw new Error('Элемент не найден');
        }
    } catch (error) {
        console.error('Ошибка при поиске элемента:', error);
    }

    await browser.close();
}

runTest();

Здесь обрабатывается ошибка, если элемент не был найден, и выводится подробное сообщение.

Заключение

Использование утверждений и проверок в тестах Puppeteer играет важную роль в обеспечении качества веб-приложений. Проверки позволяют удостовериться, что элементы страницы правильно отображаются, данные соответствуют ожиданиям, а функциональность работает корректно. Интеграция с библиотеками, такими как Chai или Jest, позволяет значительно улучшить процесс тестирования, делая код более читабельным и поддерживаемым.