Переход назад и вперёд

В автоматизированном тестировании веб-приложений управление историей браузера является важным инструментом для проверки поведения страниц при навигации. Protractor предоставляет встроенные методы для управления переходами назад и вперёд, которые напрямую используют возможности Selenium WebDriver.

Метод browser.navigate().back()

Метод back() имитирует нажатие кнопки «Назад» в браузере. Это позволяет тесту возвращаться на предыдущую страницу, сохраняя состояние сессии и куки. Использование выглядит следующим образом:

it('должен вернуться на предыдущую страницу', async () => {
    await browser.get('https://example.com/page1');
    await browser.get('https://example.com/page2');
    
    await browser.navigate().back();
    
    const url = await browser.getCurrentUrl();
    expect(url).toBe('https://example.com/page1');
});

Особенности:

  • Переход выполняется асинхронно, поэтому рекомендуется использовать await.
  • Метод возвращает Promise<void>; результат перехода проверяется через URL или элементы страницы.
  • Если предыдущей страницы нет (например, тест начинается с первой страницы), переход не вызовет ошибку, но URL останется текущим.

Метод browser.navigate().forward()

Метод forward() используется для движения по истории браузера вперёд. Чаще всего применяется после вызова back(), чтобы вернуться на следующую страницу:

it('должен перейти вперёд по истории браузера', async () => {
    await browser.get('https://example.com/page1');
    await browser.get('https://example.com/page2');
    
    await browser.navigate().back();
    await browser.navigate().forward();
    
    const url = await browser.getCurrentUrl();
    expect(url).toBe('https://example.com/page2');
});

Ключевые моменты:

  • forward() работает только после того, как была осуществлена навигация назад.
  • Поддерживает асинхронную работу через await.
  • Позволяет тестировать поведение страниц при последовательной навигации без повторной загрузки тестируемых URL.

Комбинация back() и forward() с ожиданиями

При тестировании динамических страниц необходимо учитывать время загрузки элементов после навигации. В Protractor это обеспечивается встроенными ожиданиями:

const EC = protractor.ExpectedConditions;

it('должен корректно обновлять элементы при переходе назад и вперёд', async () => {
    await browser.get('https://example.com/page1');
    await element(by.id('nextPageButton')).click();
    
    await browser.navigate().back();
    await browser.wait(EC.presenceOf(element(by.id('page1Element'))), 5000);
    
    await browser.navigate().forward();
    await browser.wait(EC.presenceOf(element(by.id('page2Element'))), 5000);
    
    const text = await element(by.id('page2Element')).getText();
    expect(text).toContain('Страница 2');
});

Важные моменты при работе с динамическим контентом:

  • Всегда проверять наличие ключевых элементов после навигации.
  • Использование ExpectedConditions предотвращает ложные ошибки теста, связанные с задержкой рендеринга.
  • Комбинация навигации и ожиданий повышает стабильность тестов при проверке SPA (Single Page Application).

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

  • Тестирование формы с многошаговым процессом: переход назад позволяет проверить корректное восстановление введённых данных.
  • Проверка истории SPA: при работе с Angular или другими фреймворками важно убедиться, что состояние приложения сохраняется при навигации.
  • Валидация URL и элементов: сочетание getCurrentUrl() и поиска элементов позволяет контролировать корректность отображения страниц после переходов.

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

  • Всегда использовать await для методов back() и forward().
  • После навигации выполнять проверки состояния страницы через URL и DOM-элементы.
  • Для SPA обязательно применять ожидания (ExpectedConditions), чтобы избежать проблем с асинхронным рендерингом.
  • Не полагаться только на URL для проверки успешной навигации, лучше сочетать с проверкой ключевых элементов страницы.

Методы навигации back() и forward() в Protractor являются простыми, но мощными инструментами, позволяющими моделировать поведение реального пользователя и проверять правильность работы веб-приложений при переходах между страницами.