История браузера и её навигация

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


Методы навигации

WebdriverIO использует объект browser для управления навигацией. Основные методы:

  • browser.url(path) Переход по указанному URL. Аргумент path может быть как относительным (/login), так и абсолютным (https://example.com/login). Пример:

    await browser.url('/dashboard');
  • browser.back() Возврат к предыдущей странице в истории браузера, аналог кнопки «Назад». Пример:

    await browser.back();
  • browser.forward() Переход к следующей странице в истории браузера, если ранее использовался back(). Пример:

    await browser.forward();
  • browser.refresh() Перезагрузка текущей страницы. Полезно для проверки состояния элементов после обновления страницы. Пример:

    await browser.refresh();

Проверка URL и заголовка страницы

Для проверки корректного перехода и состояния страницы используются следующие методы:

  • browser.getUrl() Возвращает текущий URL. Можно использовать для ассертов в тестах.

    const currentUrl = await browser.getUrl();
    expect(currentUrl).toContain('/dashboard');
  • browser.getTitle() Возвращает заголовок текущей страницы, что удобно для проверки правильной загрузки нужной страницы.

    const title = await browser.getTitle();
    expect(title).toBe('Панель управления');

Работа с историей через window.history

WebdriverIO позволяет выполнять JavaScript в контексте страницы через browser.execute(), что даёт доступ к объекту window.history. Основные методы:

  • history.back() и history.forward() Аналогично browser.back() и browser.forward(), но вызываются внутри браузера.

    await browser.execute(() => window.history.back());
  • history.go(n) Позволяет перемещаться на n шагов в истории: отрицательное число для возврата назад, положительное — вперёд.

    await browser.execute(() => window.history.go(-2));
  • history.length Возвращает количество страниц в истории текущего окна.

    const historyLength = await browser.execute(() => window.history.length);

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

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

await browser.url('/profile');
await browser.waitUntil(
  async () => (await browser.getTitle()) === 'Профиль пользователя',
  {
    timeout: 5000,
    timeoutMsg: 'Страница профиля не загрузилась за 5 секунд'
  }
);

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


Практические сценарии использования

  1. Тестирование кнопок навигации Проверка работы кнопок «Назад» и «Вперед»:

    await browser.url('/page1');
    await browser.url('/page2');
    await browser.back();
    expect(await browser.getUrl()).toContain('/page1');
    await browser.forward();
    expect(await browser.getUrl()).toContain('/page2');
  2. Перезагрузка и сохранение состояния Проверка того, что состояние элементов сохраняется после перезагрузки:

    await $('#checkbox').click();
    await browser.refresh();
    const isChecked = await $('#checkbox').isSelected();
    expect(isChecked).toBe(true);
  3. История многостраничных приложений Эмуляция сложного перехода:

    await browser.url('/step1');
    await browser.url('/step2');
    await browser.url('/step3');
    await browser.back();
    expect(await browser.getUrl()).toContain('/step2');
    await browser.back();
    expect(await browser.getUrl()).toContain('/step1');

Рекомендации по использованию

  • Использовать browser.url() для перехода на новые страницы, а не execute() с window.location, так как первый метод корректно обрабатывает асинхронность и ожидания.
  • Комбинировать методы навигации с ожиданиями (waitUntil, waitForExist) для стабильных тестов.
  • Для сложных сценариев с историей использовать execute() с window.history.go(n) для точного управления перемещением по истории.
  • Проверять URL и заголовок страницы после каждого перехода для предотвращения ошибок из-за некорректного перехода.

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