В автоматизированном тестировании веб-приложений таймауты играют критическую роль. Они определяют, сколько времени тесты будут ожидать появления элементов, завершения асинхронных операций или ответа браузера. Protractor, как инструмент для E2E тестирования Angular и не-Angular приложений, предоставляет гибкую настройку таймаутов на нескольких уровнях.
allScriptsTimeoutallScriptsTimeout задаёт максимальное время ожидания
завершения любого скрипта, выполняемого в браузере через WebDriver. Это
особенно важно при асинхронных операциях Angular-приложений, где
Protractor синхронизируется с зоной Angular.
Пример настройки:
exports.config = {
allScriptsTimeout: 11000, // 11 секунд
};
Если скрипт не завершится за указанное время, тест завершится с ошибкой. Рекомендуется выбирать значение с запасом, чтобы учитывать сложные страницы с большим количеством асинхронных операций.
getPageTimeoutgetPageTimeout определяет время ожидания загрузки
страницы при вызове browser.get(url). Этот параметр
критичен для страниц с медленной загрузкой или большими ресурсами.
Пример использования:
exports.config = {
getPageTimeout: 20000, // 20 секунд
};
Если страница не загрузится за это время, тест упадёт с ошибкой
TimeoutError.
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 проверяет, что элемент видим и
активен.По умолчанию Protractor ожидает завершения всех Angular операций перед взаимодействием с элементами. Для не-Angular страниц необходимо отключить синхронизацию:
browser.waitForAngularEnabled(false);
При этом таймауты ожидания (browser.wait) становятся
единственным механизмом контроля времени.
jasmineNodeOptsДля тестов, использующих Jasmine, есть возможность задать общий
таймаут для каждого it блока через
jasmineNodeOpts.defaultTimeoutInterval:
exports.config = {
jasmineNodeOpts: {
defaultTimeoutInterval: 30000, // 30 секунд
}
};
Это особенно полезно для долгих сценариев, включающих загрузку больших страниц или работу с внешними API.
В реальных проектах таймауты применяются комплексно:
allScriptsTimeout — контроль скриптов в браузере.getPageTimeout — контроль загрузки страниц.browser.wait с ExpectedConditions —
контроль элементов и условий на странице.jasmineNodeOpts.defaultTimeoutInterval — общий лимит на
выполнение теста.Эта комбинация позволяет гибко балансировать между стабильностью тестов и временем их выполнения.
ExpectedConditions) вместо
жёстких пауз (browser.sleep) — это улучшает стабильность
тестов.getPageTimeout и allScriptsTimeout.Тонкая настройка таймаутов в Protractor позволяет минимизировать ложные падения тестов из-за асинхронности и нестабильной загрузки страниц, обеспечивая баланс между скоростью выполнения и надёжностью E2E тестирования.