cy.go() для навигации

Cypress предоставляет встроенные методы для управления навигацией в браузере во время тестирования. Метод cy.go() используется для программного перехода по истории браузера, позволяя перемещаться вперёд или назад без явного клика по элементам интерфейса. Этот инструмент особенно полезен для проверки поведения приложения при использовании кнопок «Назад» и «Вперед», а также для тестирования маршрутов в одностраничных приложениях (SPA).


Основной синтаксис

cy.go(directionOrIndex, options)
  • directionOrIndex — параметр, определяющий направление перехода. Может принимать значения:

    • 'back' — переход на одну страницу назад (аналог кнопки браузера «Назад»).
    • 'forward' — переход на одну страницу вперёд (аналог кнопки браузера «Вперед»).
    • Целое число n — смещение по истории. Отрицательное значение -n соответствует переходу назад на n шагов, положительное n — вперед на n шагов.
  • options — необязательный объект с настройками, включая timeout. Используется для контроля времени ожидания завершения навигации.

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

cy.visit('/home')
cy.visit('/about')
cy.go('back')      // вернётся на /home
cy.go('forward')   // снова откроется /about
cy.go(-1)          // аналог 'back'
cy.go(1)           // аналог 'forward'

Особенности работы

  1. Асинхронность: cy.go() является асинхронной командой Cypress и автоматически ждёт завершения загрузки страницы или выполнения маршрута. Нет необходимости добавлять дополнительные ожидания.

  2. Совместимость с SPA: В одностраничных приложениях переход по истории может не инициировать перезагрузку страницы. Cypress корректно отслеживает изменение URL и состояние приложения при помощи встроенного слежения за window.history.

  3. История браузера: Метод использует внутренний стек истории браузера. Если попытаться перейти дальше доступной истории, Cypress выбросит ошибку. Например, вызов cy.go('forward') на последней странице истории приведёт к сбою теста.

  4. Интеграция с другими командами: Часто cy.go() используется совместно с cy.url() или cy.location() для проверки корректного перехода:

cy.visit('/page1')
cy.visit('/page2')
cy.go('back')
cy.url().should('include', '/page1')
cy.go('forward')
cy.url().should('include', '/page2')

Использование с отрицательными и положительными индексами

Метод позволяет указывать целые числа для перемещения на несколько шагов по истории сразу:

cy.visit('/step1')
cy.visit('/step2')
cy.visit('/step3')
cy.go(-2) // вернётся на /step1
cy.go(1)  // откроется /step2
  • Отрицательные числа эквивалентны 'back', но позволяют сразу откатить несколько шагов.
  • Положительные числа работают аналогично 'forward'.

Настройка таймаута

Переход может занять разное время в зависимости от загрузки страницы или асинхронных запросов. cy.go() поддерживает опцию timeout, чтобы явно указать максимальное время ожидания:

cy.go('back', { timeout: 10000 }) // ждёт до 10 секунд

Если страница не загрузилась за указанное время, тест завершится с ошибкой.


Частые ошибки и подводные камни

  • Переход за пределы истории: попытка перемещения вперёд на страницу, которой нет в стеке истории, вызовет ошибку.
  • Неправильный тип аргумента: строка должна быть 'back' или 'forward', число — целым. Любое другое значение приведёт к сбою.
  • Использование без cy.visit(): если история браузера пустая, вызов cy.go() не имеет смысла и тест упадёт.
  • Загрузка динамического контента: в SPA нужно проверять изменения контента после cy.go(), так как URL может измениться без полной перезагрузки страницы.

Практические примеры

Тест навигации в SPA с динамическим контентом:

cy.visit('/products')
cy.get('[data-cy=product-1]').click()
cy.url().should('include', '/products/1')
cy.go('back')
cy.url().should('include', '/products')
cy.go('forward')
cy.get('[data-cy=product-detail]').should('be.visible')

Проверка нескольких шагов истории:

cy.visit('/step1')
cy.visit('/step2')
cy.visit('/step3')
cy.go(-2)
cy.url().should('include', '/step1')
cy.go(2)
cy.url().should('include', '/step3')

Использование cy.go() обеспечивает прямой контроль над навигацией в браузере, позволяет тестировать кнопки «Назад» и «Вперед», а также проверять корректность маршрутизации в одностраничных приложениях без необходимости взаимодействия с элементами интерфейса. Правильное применение метода помогает создавать стабильные, надёжные и читаемые тесты, минимизируя зависимость от временных задержек и асинхронных процессов.