Переключение локалей

Переключение локалей в Playwright связано с конфигурацией браузера и среды выполнения тестов. Локаль влияет на формат дат, чисел, валют, текст в интерфейсе, порядок сортировки и язык сообщений. Правильная настройка локали позволяет стабилизировать поведение интерфейса и уменьшить количество тестов со скрытыми региональными зависимостями.

Playwright позволяет задавать локаль на уровне браузера при создании контекста. Основными параметрами выступают locale и timezoneId, а также permissions, если тест использует геолокацию или локализованные API.

Пример конфигурации:

const context = await browser.newContext({
  locale: 'ru-RU',
  timezoneId: 'Europe/Moscow'
});

Значение locale влияет на такие аспекты, как форматирование Intl.DateTimeFormat, Intl.NumberFormat и другие API интернационализации, широко применяемые в современных веб-приложениях.

Проверка локализованного поведения

После установки локали важно удостовериться, что интерфейс корректно отображает язык и форматирование. Например, тестирование даты:

const dateText = await page.textContent('[data-testid="date"]');
expect(dateText).toBe('31.05.2024');

Важный момент: тест не должен зависеть от языка машины разработчика. Все ожидания должны базироваться на явно установленной локали.

Локаль и ввод данных

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

await page.fill('[data-testid="price"]', '1 234,56');

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

Локаль и формат валюты

Многие интерфейсы используют Intl.NumberFormat для форматирования денежных значений. Региональный формат влияет на расположение валютного символа и пробелов:

new Intl.NumberFormat('ru-RU', {
  style: 'currency',
  currency: 'RUB'
}).format(1999);
// "1 999,00 ₽"

Если тесты проверяют отображение цен, понадобится жёсткое ожидание точной строки, иначе возможны ложные срабатывания.

Локаль и сортировка данных

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

Переключение локали во время теста

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

await page.click('[data-testid="locale-switch-ru"]');
await expect(page.locator('h1')).toHaveText('Настройки');

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

Локаль и часовой пояс

Многие ошибки связаны не с языком, а с временной зоной. Playwright позволяет задавать timezoneId независимо от locale. Например, дата, отображаемая в интерфейсе, может отличаться на день при переходе через полуночь в другой временной зоне. Для детерминированности тестов лучшей практикой является установка фиксированного часового пояса.

const context = await browser.newContext({
  locale: 'ru-RU',
  timezoneId: 'Europe/Moscow'
});

Геолокация и региональные функции

Некоторые приложения определяют язык по местоположению. Тогда требуется настроить geolocation и разрешения:

const context = await browser.newContext({
  locale: 'ru-RU',
  geolocation: { latitude: 55.7558, longitude: 37.6173 },
  permissions: ['geolocation']
});

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

Локаль и скриншоты

Скриншоты часто используются для визуального сравнения. Локаль влияет на тексты и форматирование, что делает сравнение чувствительным к региону. Желательно иметь отдельные эталоны для разных локалей или использовать стратегию сравнения, учитывающую только структуру.

Тонкости стабильности тестов

Ключевые аспекты стабильности:

  • Явное указание locale и timezoneId не только в тестах, но и в конфигурации CI.
  • Исключение зависимостей от локали машины разработчика.
  • Учет форматирования чисел и денежных значений.
  • Использование фиктивных данных, заранее подготовленных под нужную локаль.
  • Ожидания текстов и дат должны быть привязаны к установленной локали, а не вычисляться на лету в тесте из системной среды.

Комбинация локали и языка интерфейса

Локаль не всегда равна языку интерфейса. Пример: локаль ru-RU, но интерфейс на английском, либо наоборот. При тестировании часто требуется изменять язык UI через конфигурацию приложения, а локаль использовать только для форматированного вывода. Разделение этих concerns делает тесты более гибкими и предотвращает путаницу.

Использование конфигурации Playwright

Playwright позволяет задать локаль глобально через playwright.config.js, что удобно для больших наборов тестов:

use: {
  locale: 'ru-RU',
  timezoneId: 'Europe/Moscow'
}

Такое решение устраняет дублирование и укрепляет консистентность.

Работа с несколькими локалями

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

  • запуск набора тестов для ru-RU;
  • запуск для en-US;
  • запуск для de-DE.

При большом количестве локалей стоит выделять критические пути, а не множить весь набор тестов.

Локаль и данные

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

Отладка проблем локализации

Наиболее частые проблемы:

  • некорректное форматирование чисел;
  • несоответствие валютных символов;
  • несоответствие языка UI;
  • расхождение дат из-за временной зоны;
  • расхождение сортировки списков.

Для диагностики полезно выводить navigator.language, Intl.DateTimeFormat().resolvedOptions() и Int.NumberFormat().resolvedOptions() через page.evaluate(...). Это позволяет убедиться, что локаль действительно применена.

Вывод о роли локали

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