Тестирование интерфейсов с поддержкой Right-to-Left (RTL) языков требует особого внимания к деталям, которые часто остаются незамеченными при работе с LTR интерфейсами. RTL-верстка встречается в приложениях, поддерживающих арабский, иврит, персидский и другие языки. Cypress предоставляет возможности для автоматизированного контроля таких интерфейсов, однако подход к тестированию должен учитывать специфику направления текста и элементов.
Для корректного тестирования интерфейсов RTL необходимо:
Установить язык приложения: Многие приложения
поддерживают динамическое переключение языка через конфигурацию или
контекст. В Cypress это можно делать через
cy.visit() с параметром query string или
через локальные настройки:
cy.visit('/?lang=ar');Добавить атрибут dir к корневому
элементу: HTML-атрибут dir="rtl"
управляет направлением текста и расположением блоков. В некоторых
приложениях достаточно добавить его на <html> или
<body>:
cy.get('html').invoke('attr', 'dir', 'rtl');Убедиться, что CSS корректно применяет RTL-стили: Многие библиотеки используют отдельные классы или CSS-файлы для RTL. Проверка правильного подключения CSS — обязательный шаг перед тестированием.
RTL-верстка меняет расположение элементов по горизонтали. В тестах важно контролировать:
Порядок элементов в flex-контейнерах:
Использование CSS-свойств flex-direction и
justify-content может влиять на порядок элементов. Проверку
можно делать с помощью Cypress и jQuery-подобного API:
cy.get('.menu-item').first().should('contain.text', 'الإعدادات'); // первый элемент должен быть "Настройки"Позиционирование с помощью offset() и
position(): Для сложных макетов проверка
визуального расположения элементов через их координаты:
cy.get('.button-prev').then($el => {
expect($el.position().left).to.be.greaterThan(0);
});Перевернутые иконки и стрелки: В RTL интерфейсах
стрелки навигации или иконки могут быть зеркально отражены. Проверку
можно автоматизировать через классы CSS или атрибуты
transform: scaleX(-1).
Выравнивание текста: Свойство CSS
text-align меняется на right для RTL. Cypress
позволяет проверять это:
cy.get('.header-title').should('have.css', 'text-align', 'right');Длинные строки и переносы: В RTL языках слова могут быть длиннее, что приводит к переносу текста. В тестах можно проверять высоту блока и количество строк:
cy.get('.paragraph').invoke('height').should('be.lessThan', 200);Локализация контента: Проверка текста на правильный язык особенно важна для динамических данных:
cy.get('.welcome-message').should('contain.text', 'مرحبا');RTL влияет на позицию клика и поведение drag-and-drop. Cypress использует координаты относительно элемента, поэтому нужно учитывать:
Клики по элементам:
cy.get('.slider').click('right'); // для RTL может соответствовать логическому "вперед"Перетаскивание элементов: События drag-and-drop требуют учёта направления:
cy.get('.item')
.trigger('mousedown', { button: 0 })
.trigger('mousemove', { clientX: -100, clientY: 0 }) // движение влево для RTL
.trigger('mouseup', { force: true });RTL интерфейсы особенно чувствительны к визуальным ошибкам. Использование Cypress с инструментами визуального тестирования помогает выявлять:
Пример интеграции с cypress-image-snapshot:
cy.get('.main-container').toMatchImageSnapshot({
failureThreshold: 0.01,
failureThresholdType: 'percent'
});
data-testid или data-cy).Эти подходы позволяют создавать надёжные Cypress-тесты для RTL-интерфейсов, минимизируя визуальные и функциональные ошибки и обеспечивая корректную работу приложения на языках с правосторонним текстом.