Параметры таймаутов

В автоматизированном тестировании веб-приложений таймауты играют критическую роль. Они определяют, сколько времени тесты будут ожидать появления элементов, завершения асинхронных операций или ответа браузера. Protractor, как инструмент для E2E тестирования Angular и не-Angular приложений, предоставляет гибкую настройку таймаутов на нескольких уровнях.


1. allScriptsTimeout

allScriptsTimeout задаёт максимальное время ожидания завершения любого скрипта, выполняемого в браузере через WebDriver. Это особенно важно при асинхронных операциях Angular-приложений, где Protractor синхронизируется с зоной Angular.

Пример настройки:

exports.config = {
  allScriptsTimeout: 11000, // 11 секунд
};

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


2. getPageTimeout

getPageTimeout определяет время ожидания загрузки страницы при вызове browser.get(url). Этот параметр критичен для страниц с медленной загрузкой или большими ресурсами.

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

exports.config = {
  getPageTimeout: 20000, // 20 секунд
};

Если страница не загрузится за это время, тест упадёт с ошибкой TimeoutError.


3. Таймауты ожиданий (browser.wait и ExpectedConditions)

Protractor предоставляет мощный механизм для явных ожиданий через ExpectedConditions. Эти ожидания позволяют точно управлять временем, которое тест готов ждать появления или исчезновения элементов, доступности кнопок, изменения URL и других условий.

Пример: ожидание элемента до клика

let EC = protractor.ExpectedConditions;
let myButton = element(by.id('submit'));

browser.wait(EC.elementToBeClickable(myButton), 5000, 'Кнопка не стала доступной за 5 секунд');
myButton.click();

Здесь:

  • EC.elementToBeClickable проверяет, что элемент видим и активен.
  • Второй аргумент — максимальное время ожидания (в миллисекундах).
  • Третий аргумент — сообщение об ошибке при тайм-ауте.

4. Настройка таймаутов для Angular и не-Angular приложений

По умолчанию Protractor ожидает завершения всех Angular операций перед взаимодействием с элементами. Для не-Angular страниц необходимо отключить синхронизацию:

browser.waitForAngularEnabled(false);

При этом таймауты ожидания (browser.wait) становятся единственным механизмом контроля времени.


5. Таймауты на уровне конфигурации jasmineNodeOpts

Для тестов, использующих Jasmine, есть возможность задать общий таймаут для каждого it блока через jasmineNodeOpts.defaultTimeoutInterval:

exports.config = {
  jasmineNodeOpts: {
    defaultTimeoutInterval: 30000, // 30 секунд
  }
};

Это особенно полезно для долгих сценариев, включающих загрузку больших страниц или работу с внешними API.


6. Комбинация таймаутов

В реальных проектах таймауты применяются комплексно:

  • allScriptsTimeout — контроль скриптов в браузере.
  • getPageTimeout — контроль загрузки страниц.
  • browser.wait с ExpectedConditions — контроль элементов и условий на странице.
  • jasmineNodeOpts.defaultTimeoutInterval — общий лимит на выполнение теста.

Эта комбинация позволяет гибко балансировать между стабильностью тестов и временем их выполнения.


7. Практические рекомендации

  • Устанавливать таймауты с запасом, но не слишком длинные — слишком большие значения увеличивают время отчёта об ошибках.
  • Использовать явные ожидания (ExpectedConditions) вместо жёстких пауз (browser.sleep) — это улучшает стабильность тестов.
  • Для динамических страниц с медленной загрузкой ресурсов увеличивать getPageTimeout и allScriptsTimeout.
  • Для тестов, затрагивающих не-Angular части приложения, обязательно отключать синхронизацию с Angular.

Тонкая настройка таймаутов в Protractor позволяет минимизировать ложные падения тестов из-за асинхронности и нестабильной загрузки страниц, обеспечивая баланс между скоростью выполнения и надёжностью E2E тестирования.