Protractor изначально поставляется с встроенной системой ожиданий и утверждений через Jasmine, однако в ряде случаев удобнее использовать библиотеку 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 предоставляет три основных стиля ассертов: 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 позволяют проверять наличие
нескольких значений без строгого порядка.
Одним из сложных аспектов работы с 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() для обработки промисов, что усложняет чтение
кода.
Чтобы 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-as-promised.Использование Chai превращает тесты на Protractor из громоздких и сложных в более лаконичные и поддерживаемые, особенно при работе с динамическим контентом и коллекциями элементов.