# Отчёт E2E/UX-аудита APPartment

Дата проверки: 5 августа 2026 года  
Сайт: https://appartment.co.il/  
Версия в интерфейсе: `v1.68.0`  
Среда: production, авторизованный клиентский аккаунт  
Инструменты: Playwright 1.59.0, Chromium 147, Firefox 148, axe-core 4.11

## 1. Итог

Основные публичные и авторизованные сценарии работоспособны. Сайт стабильно отдаёт страницы, поддерживает desktop/mobile, авторизация по SMS работает, кабинет открывается, калькуляторы рассчитывают результаты, cookie-consent сохраняется, а базовые RU/EN/HE-переключения на основном разделе корректны.

В базовом проходе обнаружено 9 подтверждённых проблем:

- 5 высокого приоритета: битая внутренняя ссылка, две группы ошибок локализации, невидимые линии графика и загрузка около 40 МБ изображений на странице районов;
- 3 среднего приоритета: недоступные для screen reader элементы управления, недостаточный контраст, проблемы заголовков и названий вкладок;
- 1 UX-замечание низкого приоритета: страница доступности одновременно показывает три языка независимо от выбранной локали.

Дополнительный end-to-end сценарий Ирины выявил ещё 6 проблем результата: 5 высокого и 1 среднего приоритета. Главные из них — скрытый в UI ответ AI о бюджете, потеря персональных требований, недетерминированный разбор одинакового запроса и расхождение характеристик одного проекта между Results/Favorites.

Критических дефектов уровня потери данных, падения сайта или невозможности авторизоваться не найдено. Перед активным продвижением EN/RU-версий рекомендуется исправить все P1.

## 2. Покрытие

| Область | Покрытие | Результат |
|---|---:|---|
| Маршруты | 49 уникальных маршрутов, 98 desktop/mobile-снимков | 48 маршрутов `200`, 1 связанный из UI маршрут `404` |
| Внутренние ссылки | 80 уникальных URL | 79 исправны, 1 битая |
| Авторизация | Телефон → SMS → cookie → `/api/auth/me` | Пройдено, роль `Client` |
| Кабинет | Dashboard, результаты, избранное, встречи, сообщения, настройки, AI, onboarding | Страницы открываются, состояния форм работают |
| Калькуляторы | Ипотека, бюджет, инвестиции, налог | Все рассчитывают результаты без JS-ошибок |
| Локализация | 32 ключевых маршрута в EN и HE плюс полный RU-проход | Основной раздел исправен; developers и media имеют дефекты |
| Адаптивность | 1440×1000 и 390×844 | Горизонтального overflow не найдено |
| Изображения | 98 вариантов страниц | Битых изображений не найдено |
| Доступность | 8 ключевых страниц × desktop/mobile | 6 типов нарушений WCAG |
| Браузеры | Chromium и Firefox | Smoke пройден без JS-ошибок |
| WebKit/Safari | Запуск браузера | Не выполнен: на тестовом хосте отсутствуют системные библиотеки WebKit |

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

## 3. Подтверждённые дефекты

### APP-001 — «Все проекты района» ведёт на 404

Приоритет: **P1 / высокий**  
Область: навигация, районы, проекты  
Воспроизводимость: 100%, desktop и mobile

Шаги:

1. Открыть `/bat-yam/districts/ramat-yosef?lang=ru`.
2. Прокрутить до блока «Проекты в районе».
3. Нажать «Все проекты района →».

Фактический результат: открывается `/bat-yam/projects?neighborhood=ramat-yosef`, сервер отвечает `404`. Прямые карточки двух проектов открываются с `200`.

Ожидаемый результат: список проектов района с применённым фильтром `ramat-yosef`.

![404 после перехода к проектам района](artifacts/evidence/bug-broken-all-projects-link.png)

Рекомендация: реализовать `/bat-yam/projects` либо заменить ссылку на существующий каталог с корректным параметром фильтра.

### APP-002 — `/developers` игнорирует RU и EN

Приоритет: **P1 / высокий**  
Область: локализация, маркетинговая страница для застройщиков  
Воспроизводимость: 100%

Шаги:

1. Открыть `/developers?lang=ru` или `/developers?lang=en`.
2. Сравнить язык документа и основной контент.

Фактический результат: HTML объявлен как `ru/ltr` или `en/ltr`, но основная страница остаётся на иврите. В RU-варианте найдено 1843 ивритских символа и ни одного кириллического; в EN — 1843 ивритских символа. Из-за `ltr` иврит также получает неверное направление документа.

Ожидаемый результат: переведённый RU/EN-контент с согласованными `lang` и `dir`.

![RU URL показывает иврит](artifacts/evidence/bug-developers-ru-renders-hebrew.png)

Рекомендация: подключить словари страницы к общему locale state; если переводов пока нет, ограничить переключатель или явно показать fallback, не меняя `html lang` на неверное значение.

### APP-003 — Media остаётся русским при EN/HE

Приоритет: **P1 / высокий**  
Область: локализация, media hub и категории  
Воспроизводимость: 100%

Затронуты как минимум `/media`, `/media/guides`, `/media/qa`. При `lang=en` оболочка и footer становятся английскими, но H1, категории, карточки и статья остаются русскими. При `lang=he` направление меняется на RTL, однако основной контент остаётся русским.

![Английская оболочка с русским Media](artifacts/evidence/bug-media-en-russian-content.png)

![Ивритская RTL-оболочка с русским Media](artifacts/evidence/bug-media-he-russian-content.png)

Рекомендация: либо добавить переводы контента и категорий, либо сохранить единый русский locale для непереведённых страниц и скрыть недоступные варианты языка.

### APP-004 — сравнительный график цен не показывает линии

Приоритет: **P1 / высокий**  
Область: статистика рынка  
Воспроизводимость: 100%, после ожидания 6 секунд, с cookie-banner и без него

Шаги:

1. Открыть `/bat-yam/statistics?lang=ru`.
2. Прокрутить до «Рост цен на недвижимость».
3. Переключать интервалы 5/10/15 лет.

Фактический результат: видны оси, легенда «Израиль / Россия / Украина» и показатель `+108%`, но линии и заливки серий визуально отсутствуют. SVG-path с данными присутствуют в DOM, однако не рисуются в видимой области.

Ожидаемый результат: три различимые линии/области с динамикой цен.

![Пустой сравнительный график](artifacts/evidence/bug-statistics-comparison-lines-invisible.png)

Рекомендация: проверить SVG `clipPath`, уникальность ID градиентов/масок между несколькими Recharts-графиками, а также размеры `ResponsiveContainer` при full-page render.

### APP-005 — страница районов загружает около 40 МБ изображений

Приоритет: **P1 / высокий**  
Область: производительность, mobile data usage  
Маршрут: `/bat-yam/districts`

Фактический результат: первичная загрузка передаёт около 40,2 МБ. Одновременно загружаются 15 JPEG-фонов районов размером примерно 2,2–3,17 МБ каждый, в том числе на mobile. Они подключены как CSS-ресурсы, поэтому стандартная lazy-loading логика для `img` не применяется. Синтетический CLS: `0.177` desktop и `0.370` mobile.

Ожидаемый результат: оптимизированные AVIF/WebP-превью, responsive sizes и отложенная загрузка карточек вне viewport; желательный initial payload — существенно меньше 5 МБ.

![Страница районов на mobile](artifacts/evidence/performance-districts-mobile.png)

Точные ресурсы: [districts-network-resources.json](artifacts/districts-network-resources.json).

### APP-006 — элементы управления не имеют доступных имён

Приоритет: **P2 / средний**, но **WCAG impact critical**  
Область: доступность

Автоматический axe-аудит подтвердил:

- `/bat-yam/statistics`: 2 `select` без accessible name на desktop и 3 на mobile;
- ипотечный калькулятор: 2 текстовых поля без `label` и 2 slider thumb без `aria-label`/`aria-labelledby`;
- `/account/settings`: 2 icon/toggle-кнопки без распознаваемого имени;
- карточка проекта: 4 безымянные кнопки на desktop и 6 на mobile;
- `/developers`: вложенный focusable control внутри `button`.

Это мешает навигации с screen reader и может создавать неоднозначный keyboard focus.

![Поля ипотечного калькулятора](artifacts/evidence/a11y-calculator-unlabelled-controls.png)

![Настройки аккаунта, чувствительные данные скрыты](artifacts/evidence/account-settings-unsaved-redacted.png)

Рекомендация: связать поля с видимыми `<label>` через `for/id`, добавить slider `aria-label` и `aria-valuetext`, дать icon buttons локализованные `aria-label`, убрать вложенные интерактивные элементы.

### APP-007 — недостаточный цветовой контраст

Приоритет: **P2 / средний**  
Область: доступность, читаемость

Axe обнаружил 129 элементов с недостаточным контрастом на 12 проверенных комбинациях page/profile. Пример: серый текст `#62748e` на фоне `#f0f4f8` имеет контраст `4.31:1` при требуемом `4.5:1`. Наиболее много срабатываний на районах, статистике, settings и карточке проекта.

Рекомендация: пересмотреть secondary text tokens и прогнать контраст всей палитры для light/dark блоков.

### APP-008 — некорректная структура H1 и generic title

Приоритет: **P2 / средний**  
Область: семантика, SEO, навигация по вкладкам

Найдено:

- без H1: четыре калькулятора и `/account/onboarding/results`;
- два H1: `/bat-yam/analytics`, `/developers`, `/premium`;
- три H1: `/accessibility`;
- одинаковый title `APPartment | Найди квартиру в один клик` используется для главной, статистики, четырёх калькуляторов, onboarding, presales, этапов покупки и большинства страниц кабинета.

Ожидается один смысловой H1 на страницу и уникальный локализованный `<title>` для публичных маршрутов.

### APP-009 — страница доступности всегда показывает три языка

Приоритет: **P3 / низкий, UX**  
Область: локализация

При `lang=ru` пользователь сначала видит полный блок на иврите, затем английский и только потом русский. Документ содержит три H1 и занимает большую высоту на mobile. Axe-нарушений на самой странице не найдено, поэтому это не функциональная ошибка, а проблема подачи.

![Три языка на странице доступности](artifacts/evidence/ux-accessibility-trilingual-mobile.png)

Рекомендация: показывать выбранный язык первым либо разделить документ на locale-specific версии с переключателем.

## 4. Что работает корректно

### Авторизация и кабинет

- SMS-код принят; server-side cookie создана и проверена через `/api/auth/me` (`200`, `Client`).
- `/account`, результаты, избранное, встречи, сообщения, настройки и onboarding открываются без JS-ошибок.
- В settings кнопка «Сохранить» выключена без изменений и включается после редактирования. Сохранение намеренно не выполнялось.
- AI-чат пройден от естественного запроса до сохранённой подборки. Подробности и обнаруженные дефекты вынесены в [сценарий Ирины](IRINA-JOURNEY.md).

### Калькуляторы

Все четыре калькулятора проходят шаги и реагируют на ввод:

- [результат ипотечного калькулятора](artifacts/evidence/calculator-mortgage-result.png);
- [результат расчёта бюджета](artifacts/evidence/calculator-budget-result.png);
- [результат инвестиционного калькулятора](artifacts/evidence/calculator-invest-result.png);
- [реакция налогового калькулятора на 4 млн ₪](artifacts/evidence/calculator-tax-4m.png).

Ошибок JavaScript при расчётах не зафиксировано.

### Навигация и адаптивность

- Основное меню, mobile drawer и ссылки кабинета открываются.
- Mobile drawer перекрывает контент и блокирует фон ожидаемым образом: [скриншот](artifacts/evidence/mobile-menu-open.png).
- Горизонтального overflow на 98 проверенных вариантах страниц не найдено.
- Битых изображений не найдено.
- Cookie-banner появляется до решения, «Принять все» сохраняется и после reload не показывается: [первый показ](artifacts/evidence/cookie-banner-mobile-before.png).

Небольшое UX-замечание: в mobile drawer подпись «Калькулятор инвестиций» визуально обрезается до «Калькулятор инвест…».

### Локализация

- Главная страница корректно переключается: `ru/ltr`, `en/ltr`, `he/rtl`.
- На большинстве проверенных разделов `html lang` и `dir` соответствуют выбранной локали.
- Исключения перечислены в APP-002, APP-003 и APP-009.

### Стабильность и браузеры

- На всех основных маршрутах Chromium и Firefox получены `200`, необработанных `pageerror` нет.
- Отменённые Next.js RSC-prefetch запросы при закрытии страницы не классифицированы как дефекты.
- WebKit не стартовал из-за отсутствующих библиотек Linux-хоста; это ограничение тестовой среды, а не сайта.

## 5. Производительность

Синтетический прогон выполнен без throttling из близкого к серверу окружения, поэтому цифры нельзя напрямую сравнивать с реальным 4G.

| Профиль | Средний Load | Средний LCP | Максимальный CLS | Среднее число ресурсов |
|---|---:|---:|---:|---:|
| Desktop | 576 мс | 601 мс | 0.177 | 103 |
| Mobile | 510 мс | 619 мс | 0.370 | 61 |

Главный выброс — `/bat-yam/districts`: около 40,2 МБ, 140 ресурсов desktop и 93 mobile. Остальные выбранные страницы передали примерно 0,49–1,23 МБ и показали стабильный layout.

Полные метрики: [performance-audit.json](artifacts/performance-audit.json).

## 6. UX-оценка

Сильные стороны:

- единая визуальная система и понятное разделение аналитики, калькуляторов и кабинета;
- хороший responsive layout без горизонтального скролла;
- ясные пошаговые калькуляторы и summary-панели;
- информативные empty states в кабинете;
- cookie-consent и accessibility widget доступны на всех ключевых страницах;
- RU/HE интерфейс в основных разделах выглядит последовательно.

Зоны улучшения:

- локализация отдельных автономных разделов не синхронизирована с оболочкой;
- большое фиксированное cookie-сообщение на первом mobile viewport закрывает значительную часть контента, хотя его состояние сохраняется корректно;
- secondary text местами слишком бледный;
- часть страниц перегружена длинными блоками и требует более явной локальной навигации/оглавления;
- устаревшие демонстрационные даты пресейлов остаются заметными, хотя disclaimer сообщает, что предложения демонстрационные.

## 7. Рекомендуемый порядок исправлений

1. Показывать полный ответ AI о бюджете и добавить прозрачные финансовые допущения.
2. Сохранять обязательные/желательные критерии и объяснять соответствие каждой квартиры.
3. Унифицировать данные проекта в Results/Favorites.
4. Исправить ссылку `/bat-yam/projects?neighborhood=...`.
5. Исправить locale handling на `/developers` и Media.
6. Восстановить видимость сравнительных линий статистики.
7. Оптимизировать и лениво загружать изображения районов.
8. Добавить accessible names/labels и исправить вложенные controls.
9. Поднять контраст secondary text tokens.
10. Нормализовать H1 и уникальные `<title>`.
11. Улучшить подачу accessibility statement и мелкие mobile-тексты.

После P1/P2 рекомендуется повторить regression suite и провести отдельный ручной прогон VoiceOver/NVDA плюс Safari/iOS на реальном устройстве.

## 8. Артефакты

- [Все 98 базовых desktop/mobile-скриншотов](artifacts/screenshots/)
- [Папка с адресными доказательствами](artifacts/evidence/)
- [Первичный route audit](artifacts/route-audit.json)
- [Расширенный audit кабинета и скрытых маршрутов](artifacts/deep-audit.json)
- [Функциональные проверки](artifacts/functional-audit.json)
- [Проверка 80 внутренних ссылок](artifacts/link-audit.json)
- [Локализация EN/HE](artifacts/localization-audit.json)
- [Accessibility audit](artifacts/accessibility-audit.json)
- [Cross-browser smoke](artifacts/cross-browser-audit.json)
- [Результаты калькуляторов](artifacts/calculator-results.json)

## 9. Персональный сценарий Ирины

Проверен полный mobile journey: подробный запрос AI → честный no-match → выбор компромисса → 2 проекта / 3 квартиры → сохранение результата между сеансами → добавление лучшей квартиры в избранное.

Итог: **сценарий достижим частично, 6/10**. Техническая цепочка работает, но пользователь не видит сформированный AI расчёт бюджета, важные требования теряются, а данные проекта расходятся между «Результатами» и «Избранным».

Полный outcome-отчёт со скриншотами: [«Ирина выбирает семейную квартиру с AI»](IRINA-JOURNEY.md).
