Навигация: back(), forward(), refresh()

Protractor предоставляет встроенные методы для управления навигацией в браузере, которые напрямую взаимодействуют с объектом browser. Эти методы позволяют имитировать действия пользователя, такие как возврат на предыдущую страницу, переход вперед или обновление текущей страницы. Они особенно полезны при тестировании сложных сценариев, где требуется проверка истории навигации или реакции приложения на обновление страницы.


Метод browser.back()

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

Синтаксис:

browser.back();

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

  • Возврат выполняется асинхронно, поэтому рекомендуется использовать await в сочетании с async функцией.
  • Не вызывает ошибки, если предыдущей страницы нет; браузер просто останется на текущей странице.
  • Полезен для проверки корректного восстановления состояния интерфейса после возврата.

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

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

    await browser.back(); // Возврат на page1
    const currentUrl = await browser.getCurrentUrl();
    expect(currentUrl).toBe('https://example.com/page1');
});

Метод browser.forward()

Метод forward() позволяет перейти на следующую страницу в истории браузера, аналогично кнопке «Вперед».

Синтаксис:

browser.forward();

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

  • Используется после back() для возвращения к предыдущему состоянию.
  • Асинхронен, поддерживает await.
  • Если следующей страницы нет, браузер остается на текущей странице.

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

it('должен перейти вперед после возврата', async () => {
    await browser.get('https://example.com/page1');
    await browser.get('https://example.com/page2');

    await browser.back();    // page1
    await browser.forward(); // page2
    const currentUrl = await browser.getCurrentUrl();
    expect(currentUrl).toBe('https://example.com/page2');
});

Метод browser.refresh()

Метод refresh() выполняет обновление текущей страницы, что позволяет проверить, корректно ли приложение сохраняет состояние после перезагрузки.

Синтаксис:

browser.refresh();

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

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

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

it('должен корректно обновлять страницу', async () => {
    await browser.get('https://example.com/form');
    await element(by.id('inputName')).sendKeys('Test User');

    await browser.refresh(); // Обновление страницы
    const inputValue = await element(by.id('inputName')).getAttribute('value');
    expect(inputValue).toBe(''); // Проверка сброса формы после обновления
});

Советы по использованию навигации в тестах

  • Синхронизация с Angular: Protractor автоматически ожидает завершения асинхронных операций Angular. Для не-Angular приложений нужно использовать browser.waitForAngularEnabled(false).
  • Асинхронность: Все методы навигации возвращают промис, поэтому использование await или .then() обязательно для корректного выполнения.
  • История браузера: Методы back() и forward() работают только в пределах текущей сессии браузера. Если сессия была перезапущена, история теряется.
  • Комбинация с ожиданиями: После навигации рекомендуется использовать ожидания (ExpectedConditions) для элементов, которые должны появиться на новой странице, чтобы избежать гонок.

Примеры комбинированного использования

it('должен тестировать навигацию и обновление страницы', async () => {
    await browser.get('https://example.com/page1');
    await browser.get('https://example.com/page2');
    await browser.get('https://example.com/page3');

    await browser.back();     // page2
    await browser.back();     // page1
    let currentUrl = await browser.getCurrentUrl();
    expect(currentUrl).toBe('https://example.com/page1');

    await browser.forward();  // page2
    currentUrl = await browser.getCurrentUrl();
    expect(currentUrl).toBe('https://example.com/page2');

    await browser.refresh();  // обновление page2
    const title = await browser.getTitle();
    expect(title).toBe('Page 2');
});

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