Protractor — это фреймворк для автоматизированного тестирования веб-приложений на базе Angular и AngularJS, построенный поверх Selenium WebDriver. Одной из ключевых операций при тестировании является переход по URL, поскольку большинство сценариев тестирования начинается с открытия страницы приложения.
В Protractor для навигации используется объект browser.
Основной метод для перехода на конкретный URL — это
browser.get(). Его синтаксис:
browser.get('https://example.com');
Особенности метода:
browser.get(url) возвращает Promise,
который завершится после полной загрузки страницы.browser.waitForAngularEnabled(false):browser.waitForAngularEnabled(false);
browser.get('https://non-angular-site.com');
После загрузки страницы browser.get() позволяет
продолжать работу с элементами DOM.
browser.navigate().to(url) Этот метод
аналогичен browser.get(), но предоставляет дополнительные
возможности цепочки навигации:browser.navigate().to('https://example.com');
browser.navigate().back() Позволяет
вернуться на предыдущую страницу в истории браузера.browser.navigate().back();
browser.navigate().forward() Двигает
браузер вперед по истории.browser.navigate().forward();
browser.refresh() Перезагружает
текущую страницу, сохраняя состояние сессии.browser.refresh();
Protractor автоматически ждет завершения асинхронных процессов Angular, однако иногда требуется дополнительно использовать Explicit Waits, чтобы убедиться, что определенные элементы доступны после перехода. Пример:
const EC = protractor.ExpectedConditions;
const elementToWait = element(by.css('.main-content'));
browser.get('https://example.com');
browser.wait(EC.visibilityOf(elementToWait), 5000);
Здесь browser.wait() ожидает видимость элемента в
течение 5 секунд, предотвращая ошибки из-за попытки взаимодействия с
элементом до его появления.
В современных приложениях URL часто формируются динамически. Protractor поддерживает использование переменных и шаблонных строк:
const userId = 42;
browser.get(`https://example.com/users/${userId}`);
При работе с параметризованными маршрутами это позволяет создавать универсальные тесты для разных данных без дублирования кода.
Для проверки, что браузер перешел на нужную страницу, используется
метод browser.getCurrentUrl():
browser.getCurrentUrl().then((url) => {
expect(url).toContain('/users/42');
});
Такой подход позволяет валидировать корректность перехода и интегрировать проверки в тестовые сценарии.
const urls = {
home: 'https://example.com',
login: 'https://example.com/login',
userProfile: (id) => `https://example.com/users/${id}`
};
Использование методов навигации
browser.navigate().back() и
browser.navigate().forward() помогает тестировать сценарии
с историей браузера, что важно для SPA-приложений.
При тестировании не-Angular страниц
browser.waitForAngularEnabled(false) нужно включать
до вызова перехода и включать обратно после завершения работы
со страницей, чтобы не нарушить синхронизацию с Angular на других
страницах.
it('должен переходить между страницами и проверять URL', async () => {
await browser.get('https://example.com/login');
await element(by.id('login-button')).click();
await browser.waitForAngular();
expect(await browser.getCurrentUrl()).toContain('/dashboard');
await browser.navigate().back();
expect(await browser.getCurrentUrl()).toContain('/login');
await browser.navigate().forward();
expect(await browser.getCurrentUrl()).toContain('/dashboard');
await browser.refresh();
const mainElement = element(by.css('.dashboard-content'));
const EC = protractor.ExpectedConditions;
await browser.wait(EC.visibilityOf(mainElement), 5000);
});
Этот пример демонстрирует полный цикл навигации: переход на страницу, проверку URL, работу с историей браузера и использование ожиданий.
Переход по URL в Protractor является фундаментальной операцией для
построения стабильных тестов. Понимание различий между
browser.get() и browser.navigate(), правильное
управление ожиданиями и работа с динамическими URL позволяет создавать
надежные автоматизированные сценарии для любых веб-приложений.