Навигация по страницам

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

Основные методы навигации

1. url() Метод используется для перехода на указанную страницу. Он принимает строку с абсолютным или относительным URL.

await browser.url('https://example.com/login');

Если передан относительный путь, WebdriverIO добавляет его к базовому URL, указанному в конфигурации. Метод возвращает объект Promise, что требует использования await для корректного ожидания завершения навигации.

2. back() и forward() Позволяют управлять историей браузера аналогично кнопкам «Назад» и «Вперед».

await browser.back();    // Переход к предыдущей странице
await browser.forward(); // Переход к следующей странице

Эти методы полезны при тестировании сценариев с многошаговой навигацией, когда необходимо проверить корректность работы истории браузера.

3. refresh() Обновляет текущую страницу, аналогично кнопке обновления браузера.

await browser.refresh();

Этот метод гарантирует повторное выполнение всех сетевых запросов и загрузку динамического контента.

Работа с ожиданиями при навигации

Навигация в браузере часто сопровождается асинхронными операциями: загрузкой элементов, выполнением AJAX-запросов, отображением модальных окон. WebdriverIO предоставляет мощные методы ожидания для синхронизации действий теста с состоянием страницы:

  • waitUntil() – позволяет ожидать выполнение произвольного условия.
  • waitForExist() / waitForDisplayed() – удобны для проверки появления элементов после перехода.
const loginButton = await $('#login');
await loginButton.waitForDisplayed({ timeout: 5000 });

Использование этих методов снижает вероятность нестабильности тестов, связанных с асинхронной загрузкой страницы.

Управление окнами и вкладками

WebdriverIO поддерживает работу с несколькими окнами или вкладками через методы:

  • getWindowHandle() – возвращает идентификатор текущего окна.
  • getWindowHandles() – возвращает массив всех открытых окон.
  • switchToWindow(handle) – переключается на указанное окно.
const handles = await browser.getWindowHandles();
await browser.switchToWindow(handles[1]);

Это особенно важно при тестировании всплывающих окон или внешних ссылок, открывающихся в новом табе.

Навигация внутри одного приложения

Для одностраничных приложений (SPA) часто используется фреймворк типа React или Vue. В таких случаях переход между страницами реализуется через изменение состояния приложения, а URL может оставаться прежним. WebdriverIO позволяет работать с динамическим контентом с помощью ожиданий и проверки URL:

await browser.url('/dashboard');
await browser.waitUntil(
    async () => (await browser.getUrl()).includes('dashboard'),
    { timeout: 5000, timeoutMsg: 'Страница Dashboard не загрузилась' }
);

Практические рекомендации

  • Использовать абсолютные URL при необходимости перехода на внешние сайты, относительные – внутри тестируемого приложения.
  • Всегда синхронизировать действия с загрузкой страницы или появлением ключевых элементов.
  • Проверять URL после перехода для уверенности, что браузер достиг нужного состояния.
  • При работе с несколькими окнами аккуратно хранить идентификаторы окон, чтобы не потерять контекст.

Примеры сложной навигации

  1. Переход на страницу, выполнение действия, возврат:
await browser.url('/products');
const productLink = await $('a.product');
await productLink.click();
await browser.back();
  1. Переход между вкладками с проверкой URL:
const handlesBefore = await browser.getWindowHandles();
await browser.newWindow('https://example.com');
const handlesAfter = await browser.getWindowHandles();
const newTab = handlesAfter.find(h => !handlesBefore.includes(h));
await browser.switchToWindow(newTab);
await expect(await browser.getUrl()).toContain('example.com');
  1. Обновление страницы и ожидание появления контента:
await browser.refresh();
await $('#main-content').waitForDisplayed({ timeout: 7000 });

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