Проверка на истинность/ложность

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


Роль expect и matchers

В типичном проекте на Protractor используется Jasmine или Mocha + Chai. Для Jasmine центральным элементом является функция expect, принимающая фактическое значение и сравнивающая его с ожидаемым с помощью matcher’ов.

Простейшая форма проверки:

expect(value).toBe(true);
expect(value).toBe(false);

Matcher toBe выполняет строгое сравнение (===). Он подходит, когда требуется проверить именно булево значение, а не просто «truthy» или «falsy».


Проверка истинности без строгого сравнения

В ряде случаев результатом выражения может быть не чистый boolean, а значение, приводимое к нему. Для таких ситуаций используются matcher’ы:

expect(value).toBeTruthy();
expect(value).toBeFalsy();

Особенности:

  • toBeTruthy() проходит для любых значений, приводимых к true
  • toBeFalsy() проходит для false, 0, '', null, undefined, NaN

Это удобно при проверке наличия данных, но опасно при логике, где важно строгое булево состояние.


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

Большинство проверок на истинность в Protractor связано с состоянием DOM-элементов. Protractor предоставляет методы, возвращающие Promise<boolean> или уже резолвленные значения (в зависимости от версии).

Примеры типовых проверок:

expect(element(by.id('submit')).isDisplayed()).toBe(true);
expect(element(by.css('.error')).isPresent()).toBe(false);

На практике чаще используются более выразительные формы:

expect(element(by.id('submit')).isDisplayed()).toBeTruthy();
expect(element(by.css('.loader')).isPresent()).toBeFalsy();

Часто используемые булевы методы ElementFinder

Protractor предоставляет набор методов, напрямую предназначенных для логических проверок:

  • isDisplayed() — элемент видим пользователю
  • isPresent() — элемент существует в DOM
  • isEnabled() — элемент доступен для взаимодействия
  • isSelected() — элемент (checkbox, radio) выбран

Пример комплексной проверки:

const checkbox = element(by.css('input[type="checkbox"]'));

expect(checkbox.isPresent()).toBe(true);
expect(checkbox.isEnabled()).toBe(true);
expect(checkbox.isSelected()).toBe(false);

Проверки условий с использованием then

В старых версиях Protractor и при отключённом SELENIUM_PROMISE_MANAGER булевы значения часто обрабатываются через then:

element(by.id('status')).isDisplayed().then(function(result) {
    expect(result).toBe(true);
});

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


Проверка результатов сравнений

Логические проверки часто строятся на сравнении чисел, строк или длин коллекций:

expect(items.count() > 0).toBe(true);
expect(text.includes('Success')).toBeTruthy();

В таких случаях важно помнить, что:

  • count() возвращает Promise
  • сравнение должно происходить после получения значения

Корректный вариант:

items.count().then(function(count) {
    expect(count > 0).toBe(true);
});

Отрицательные проверки

Проверка на ложность часто важнее проверки на истинность, особенно при валидации ошибок, загрузчиков и временных состояний:

expect(errorMessage.isDisplayed()).toBe(false);
expect(loader.isPresent()).toBeFalsy();

Такие проверки помогают убедиться, что приложение не находится в ошибочном или переходном состоянии.


Использование not для инверсии

Jasmine предоставляет модификатор not, позволяющий инвертировать любое утверждение:

expect(isLoggedIn).not.toBe(true);
expect(button.isEnabled()).not.toBeFalsy();

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


Проверка сложных логических выражений

Допускается проверка составных условий, объединённых логическими операторами:

const isVisible = element.isDisplayed();
const isEnabled = element.isEnabled();

Promise.all([isVisible, isEnabled]).then(function(values) {
    const result = values[0] && values[1];
    expect(result).toBe(true);
});

Подобный подход применяется при тестировании состояний, зависящих от нескольких факторов.


Типичные ошибки при проверке true/false

Сравнение с true вместо проверки значения:

expect(value == true).toBe(true);

Корректнее:

expect(value).toBe(true);

Проверка Promise без ожидания:

expect(element.isDisplayed()).toBe(true); // работает только при auto-wait

При ручном управлении асинхронностью требуется then или async/await.


Использование async/await

Современный стиль делает проверки более линейными и читаемыми:

const isVisible = await element(by.id('panel')).isDisplayed();
expect(isVisible).toBe(true);

Для ложных значений:

const exists = await element(by.css('.temp')).isPresent();
expect(exists).toBe(false);

Такой подход минимизирует ошибки, связанные с асинхронностью.


Проверки в пользовательских условиях

Булевы проверки часто применяются в if, но в тестах предпочтительнее использовать assertions:

const isErrorVisible = await error.isDisplayed();

if (isErrorVisible) {
    expect(isErrorVisible).toBe(true);
}

Это гарантирует, что тест явно зафиксирует состояние, а не просто выполнит ветку кода.


Практическое значение

Проверки на истинность и ложность формируют основу логики тестов Protractor. Они используются для:

  • валидации UI-состояний
  • проверки условий отображения
  • контроля доступности элементов
  • подтверждения корректного поведения приложения

Точность выбора matcher’а и понимание различий между true, truthy, false и falsy напрямую влияет на надёжность и предсказуемость автотестов.