В автоматизированном тестировании веб-приложений крайне важно не только взаимодействовать с элементами страницы, но и корректно отслеживать изменения состояния приложения, включая смену URL. Protractor, будучи фреймворком для Angular и AngularJS приложений, предоставляет мощные инструменты для работы с ожиданиями и проверкой URL.
browser.wait для отслеживания URLОсновной подход заключается в том, чтобы использовать функцию
browser.wait, которая позволяет задать условие ожидания и
таймаут. Смена URL может быть вызвана навигацией, переходом по ссылке
или редиректом, и для корректного тестирования важно убедиться, что
переход завершён.
Пример базового использования:
const EC = protractor.ExpectedConditions;
const expectedUrl = 'https://example.com/dashboard';
browser.wait(EC.urlIs(expectedUrl), 5000, 'URL не совпадает с ожидаемым');
Здесь ключевые моменты:
EC.urlIs(expectedUrl) — встроенное условие Protractor,
которое проверяет точное совпадение текущего URL с ожидаемым.5000 — таймаут в миллисекундах, через который тест
завершится ошибкой, если URL не изменится.'URL не совпадает с ожидаемым' позволяет
понять причину сбоя в логах.Часто URL может содержать динамические параметры, например
id ресурса. В таких случаях точное сравнение неэффективно.
Для этого используется urlContains или кастомные
функции:
browser.wait(EC.urlContains('/dashboard'), 5000, 'URL не содержит /dashboard');
Преимущества urlContains:
Если требуется более сложная проверка, можно использовать функцию обратного вызова:
browser.wait(() => {
return browser.getCurrentUrl().then(url => url.includes('dashboard'));
}, 5000, 'URL не содержит dashboard');
Такой подход гибкий и позволяет реализовать любые кастомные условия.
В тестах часто требуется выполнить действие, которое инициирует переход, и дождаться завершения навигации:
element(by.buttonText('Войти')).click();
browser.wait(EC.urlContains('/home'), 5000, 'Переход на /home не произошёл');
Важно учитывать, что без явного ожидания проверки URL могут выполняться раньше, чем страница полностью загрузится, что приведёт к нестабильным тестам.
browser.manage().timeouts().implicitlyWait, но для проверки
URL лучше использовать browser.wait.ExpectedConditions вместо
кастомных пауз. browser.sleep снижает стабильность
тестов и увеличивает их время выполнения.browser.getCurrentUrl().then(url => console.log('Текущий URL:', url));
const EC = protractor.ExpectedConditions;
browser.wait(EC.and(
EC.urlContains('/dashboard'),
EC.visibilityOf(element(by.css('.dashboard-container')))
), 5000, 'URL или элемент не загружены');
Если URL не меняется в течение таймаута, тест выбрасывает исключение
TimeoutError. Для обработки ошибок можно использовать блок
try-catch:
try {
browser.wait(EC.urlContains('/home'), 5000);
} catch (e) {
console.error('Ошибка ожидания URL:', e.message);
}
Это особенно полезно в больших тестовых сценариях, где важно продолжать выполнение даже при частичных сбоях.
В приложениях с динамическими маршрутами
(/user/123/profile) проверку URL стоит строить на основе
паттернов или регулярных выражений:
browser.wait(() => {
return browser.getCurrentUrl().then(url => /\/user\/\d+\/profile/.test(url));
}, 5000, 'URL не соответствует шаблону /user/:id/profile');
Такой подход обеспечивает надёжность тестов, независимо от конкретного идентификатора пользователя.
Ожидание изменения URL является критически важной частью тестирования
навигации в веб-приложениях. Protractor предоставляет гибкие средства
для реализации как точного, так и частичного контроля URL, включая
использование встроенных ExpectedConditions и кастомных
проверок. Правильная организация ожиданий повышает стабильность и
предсказуемость тестов, особенно в динамических SPA-приложениях.