Ожидание URL изменения

В автоматизированном тестировании веб-приложений крайне важно не только взаимодействовать с элементами страницы, но и корректно отслеживать изменения состояния приложения, включая смену 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

Часто URL может содержать динамические параметры, например id ресурса. В таких случаях точное сравнение неэффективно. Для этого используется urlContains или кастомные функции:

browser.wait(EC.urlContains('/dashboard'), 5000, 'URL не содержит /dashboard');

Преимущества urlContains:

  • Подходит для динамических страниц, где часть URL изменяется.
  • Позволяет избегать лишней жёсткой привязки к точной строке.

Если требуется более сложная проверка, можно использовать функцию обратного вызова:

browser.wait(() => {
    return browser.getCurrentUrl().then(url => url.includes('dashboard'));
}, 5000, 'URL не содержит dashboard');

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

Ожидание смены URL после действия

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

element(by.buttonText('Войти')).click();

browser.wait(EC.urlContains('/home'), 5000, 'Переход на /home не произошёл');

Важно учитывать, что без явного ожидания проверки URL могут выполняться раньше, чем страница полностью загрузится, что приведёт к нестабильным тестам.

Советы по стабильности тестов

  1. Явное ожидание всегда лучше имплицитного. Protractor поддерживает browser.manage().timeouts().implicitlyWait, но для проверки URL лучше использовать browser.wait.
  2. Использовать ExpectedConditions вместо кастомных пауз. browser.sleep снижает стабильность тестов и увеличивает их время выполнения.
  3. Логирование текущего URL для диагностики.
browser.getCurrentUrl().then(url => console.log('Текущий URL:', url));
  1. Комбинирование условий. Иногда полезно сочетать ожидание 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);
}

Это особенно полезно в больших тестовых сценариях, где важно продолжать выполнение даже при частичных сбоях.

Практика работы с динамическими URL

В приложениях с динамическими маршрутами (/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-приложениях.