Использование Chai как альтернативы

Protractor изначально поставляется с встроенной системой ожиданий и утверждений через Jasmine, однако в ряде случаев удобнее использовать библиотеку Chai, предоставляющую более выразительный синтаксис для ассертов и дополнительные возможности для работы с промисами.

Установка Chai и необходимых плагинов

Для интеграции Chai в проект с Protractor необходимо установить саму библиотеку и, при работе с асинхронными операциями, плагин chai-as-promised, который позволяет корректно проверять промисы:

npm install chai chai-as-promised --save-dev

В тестовом файле подключение выглядит следующим образом:

const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
const expect = chai.expect;

Ассерты с Chai

Chai предоставляет три основных стиля ассертов: should, expect и assert. Наиболее популярный в Protractor — expect, так как он позволяет писать читаемые цепочки проверок.

Пример базовой проверки текста элемента:

const elem = element(by.css('.header-title'));
expect(elem.getText()).to.eventually.equal('Добро пожаловать');

Здесь ключевой момент — использование .eventually, которое обеспечивает правильную работу с промисами, возвращаемыми методами Protractor.

Работа с условиями и состояниями элементов

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

const button = element(by.id('submit-btn'));

expect(button.isDisplayed()).to.eventually.be.true;
expect(button.getAttribute('disabled')).to.eventually.be.null;
expect(button.getText()).to.eventually.contain('Отправить');

Использование цепочек to.be.true, to.be.null и to.contain делает код более читаемым по сравнению со стандартными методами Jasmine.

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

При работе с коллекциями элементов удобно проверять количество и содержимое:

const items = element.all(by.css('.list-item'));

expect(items.count()).to.eventually.equal(5);
expect(items.getText()).to.eventually.include.members(['Элемент 1', 'Элемент 2']);

Методы include.members позволяют проверять наличие нескольких значений без строгого порядка.

Асинхронные операции и Chai-as-Promised

Одним из сложных аспектов работы с Protractor является проверка асинхронных операций. Chai-as-Promised упрощает синтаксис:

const input = element(by.model('username'));

input.sendKeys('admin');
expect(input.getAttribute('value')).to.eventually.equal('admin');

Без chai-as-promised пришлось бы использовать .then() для обработки промисов, что усложняет чтение кода.

Интеграция с Protractor конфигурацией

Чтобы Chai использовалась во всех тестах, удобно добавить глобальное подключение в файл конфигурации Protractor:

onPrepare: function() {
    const chai = require('chai');
    const chaiAsPromised = require('chai-as-promised');
    chai.use(chaiAsPromised);
    global.expect = chai.expect;
}

После этого expect доступен в любом тестовом файле без повторного импорта.

Расширение возможностей через плагины

Chai поддерживает множество плагинов для проверки типов данных, регулярных выражений и других расширенных условий. Например:

const chaiThings = require('chai-things');
chai.use(chaiThings);

const users = element.all(by.repeater('user in users'));
expect(users).to.eventually.all.have.property('isActive').that.is.true;

Использование chai-things позволяет выполнять проверки на каждом элементе массива, упрощая тестирование коллекций данных.

Преимущества использования Chai в Protractor

  • Более читаемый и выразительный синтаксис.
  • Поддержка асинхронных проверок через chai-as-promised.
  • Возможность расширения через плагины для сложных проверок.
  • Унификация стиля тестов при работе с разными фреймворками.

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