Получение текущего URL

В тестировании веб-приложений на JavaScript одним из частых требований является проверка того, что браузер находится на нужной странице. Для этого используется получение текущего URL. В Protractor для работы с URL применяется объект browser, который предоставляет методы для взаимодействия с окном браузера и навигации.

Метод browser.getCurrentUrl()

Основной инструмент для получения текущего URL — метод browser.getCurrentUrl(). Этот метод возвращает Promise, который разрешается в строку с адресом текущей страницы.

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

it('Должен получить текущий URL', async () => {
    await browser.get('https://example.com/login');
    const currentUrl = await browser.getCurrentUrl();
    console.log('Текущий URL:', currentUrl);
});
  • browser.get(url) — открывает указанный URL в браузере.
  • browser.getCurrentUrl() — возвращает URL текущей страницы.
  • Для работы с результатом используется await или метод .then() для обработки промиса.

Асинхронность и ожидания

Protractor работает с асинхронными операциями через async/await или через промисы. При проверке URL важно учитывать, что страница может загружаться не мгновенно.

Пример с ожиданием изменения URL после действия на странице:

it('URL изменяется после нажатия кнопки', async () => {
    await browser.get('https://example.com/login');
    const loginButton = element(by.id('loginButton'));
    await loginButton.click();

    // Ждем, пока URL изменится на страницу профиля
    await browser.wait(async () => {
        const url = await browser.getCurrentUrl();
        return url.includes('/profile');
    }, 5000, 'URL не изменился на /profile за 5 секунд');

    const currentUrl = await browser.getCurrentUrl();
    console.log('Новый URL:', currentUrl);
});
  • browser.wait(conditionFn, timeout, message) — позволяет ждать выполнения определённого условия.
  • conditionFn должен возвращать Promise или булево значение.
  • В данном примере проверяется, что URL содержит /profile.

Использование в ассерциях

Полученный URL часто проверяется с помощью библиотек ассерций, таких как Jasmine или Chai:

it('URL должен быть страницей логина', async () => {
    await browser.get('https://example.com/login');
    const currentUrl = await browser.getCurrentUrl();
    expect(currentUrl).toBe('https://example.com/login');
});
  • expect(actual).toBe(expected) — проверяет полное совпадение URL.
  • Можно использовать toContain(substring) для проверки, что URL содержит определённую часть.

Советы по надежности тестов

  1. Ожидания загрузки страницы Для динамических приложений Angular Protractor автоматически ждёт завершения асинхронных операций, но для сторонних страниц рекомендуется использовать browser.wait() или проверки наличия элементов.

  2. Избегание магических строк Желательно хранить ожидаемые URL в константах или файлах конфигурации, чтобы облегчить поддержку тестов при изменении маршрутов.

const LOGIN_PAGE_URL = 'https://example.com/login';
expect(await browser.getCurrentUrl()).toBe(LOGIN_PAGE_URL);
  1. Работа с маршрутами Angular Для приложений на Angular можно проверять не полный URL, а его часть после домена, что упрощает тестирование локальных и дев-окружений:
const currentRoute = await browser.getCurrentUrl();
expect(currentRoute).toContain('/dashboard');

Отличие browser.getCurrentUrl() от browser.get()

  • browser.get(url) открывает указанную страницу и возвращает промис после её загрузки.
  • browser.getCurrentUrl() не открывает страницу, а только получает адрес текущей вкладки.

Логирование и отладка

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

const url = await browser.getCurrentUrl();
console.log('Проверяем текущий URL:', url);

Совместимость с Protractor и Angular

Protractor интегрирован с Angular, поэтому browser.getCurrentUrl() автоматически учитывает завершение асинхронных операций Angular, что делает проверку URL более стабильной на страницах с динамическим контентом.


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