# Ozon — экраны и дампы Чек-лист экранных дампов для банка **Ozon** (`appCode: ozon`, пакет `ru.ozon.fintech.finance`). Используется, когда выходит новая версия приложения и нужно понять, **какие экраны переснять**. ## Как пользоваться при выходе новой версии 1. Завести папку `assets/ozon/<новая_версия>/` (по образцу `assets/ozon/19.19.1/`). Платёжные экраны — в подпапку `pay/`. 2. Пройти по чек-листу ниже и снять XML+скриншот каждого экрана на устройстве с новой версией под теми же именами. Удобно скриптом `assets/ozon/19.19.1/capture.sh <имя>` (кладёт `<имя>.png` + `<имя>.xml`; для платёжных — `pay/<имя>`). 3. Сверить новый дамп с картинкой ниже. 4. Если вёрстка/тексты разошлись с парсером — поправить `android/ozon/ScreenXmlParser.cpp` и при необходимости завести новый трек в `android/ozon/AppVersionTrack.h`. ## Версионирование Парсер Ozon **версионируется**: `android/ozon/AppVersionTrack.h`, треки **Legacy** (< 19.19.1, старый UI с подписями в `text`) / **V19_19_1** (>= 19.19.1, по умолчанию). Скрипты выставляют трек один раз: `setVersionTrack(trackForVersion(app.appVersion))`. Новый трек добавляется **только** если вёрстка реально разошлась — иначе хватает свежих эталонных дампов в `assets/ozon/<версия>/`. **Ключевое расхождение 19.19.1:** приложение переехало на Compose-семантику — интерактив (кнопки, вкладки, цифры пин-пада) больше не несёт видимый `text`, а отдаёт стабильные тест-id в `content-desc`. Детекторы сделаны обратносовместимыми (матч сначала по `text`, затем fallback на `content-desc`), правки применены в `findPinCodeNodes` / `isHomeScreen` / `PayBy{Card,Phone}Script`. Подробности — `assets/ozon/19.19.1/NOTES.md`. **Картинка под каждым экраном — самый свежий доступный дамп** (приоритет `19.19.1` → корень `assets/ozon/`). Подпись «Текущий дамп» показывает, из какой версии реально взята картинка. Экраны без дампа под новую версию помечены 🔲 «ещё не снято под 19.19.1»; без эталона вообще — ⚠️. --- ## 0. Общие баннеры / оверлеи Всплывают поверх любого экрана и должны закрываться во всех задачах для прохождения флоу. Снимаются ситуативно (когда поймаются на экране) — под 19.19.1 пока не пересняты. #### Реклама на главной — `home_ad_1` 🔲 Рекламный bottom-sheet (`tryToFindAdBanner()`, `resource-id design_bottom_sheet`). - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - home_ad_1 #### Обновление Google Play — `google_play` 🔲 In-app update bottom-sheet (`tryToFindGooglePlayBanner()`). - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - google_play #### Баннер ипотеки — `banner_ipoteka` 🔲 Промо-баннер на главной. - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - banner_ipoteka #### Баннер карты — `card_banner` 🔲 Промо-баннер «Заказать карту» на главной. - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - card_banner #### Выбор (bottom-sheet) — `select_bank` 🔲 Шторка выбора (`tryToFindSelectBottomSheet()`). Не путать с экраном выбора банка СБП (`pay/pay_buy_phone_select_bank`). - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - select_bank #### Онбординг «Обновили главную» ⚠️ `resource-id onboarding_viewpager`, кнопка «Пропустить» (`tryToFindOnboardingBanner()`). - [ ] **Эталонный дамп ещё не снят** - Текущий дамп: _нет_ #### Баннер безопасности ⚠️ «Мы заботимся о вашей безопасности» (`tryToFindSecurityBanner()`). - [ ] **Эталонный дамп ещё не снят** - Текущий дамп: _нет_ #### Системный диалог разрешений ⚠️ `com.google.android.permissioncontroller`, кнопка «ЗАПРЕТИТЬ» (`tryToFindSystemPermissionDenyButton()`). - [ ] **Эталонный дамп ещё не снят** - Текущий дамп: _нет_ > Замечено в 19.19.1, но ещё не снято как эталон: шторка «Разрешите доступ к камере» > (для QR/паспорта, кнопка «Не сейчас») и баннер «Разрешите доступ к контактам» на экране > «Кому перевести» — обе закрываются по «Не сейчас». --- ## 1. Мастер установок (`BankSetupWizard`) Цепочка: `runPinCheck → runProfileCheck → runCardCheck` (`views/bank/BankSetupWizard.cpp`). ### 1.1. Пин-код / вход (`LoginAndCheckAccountsScript`) #### Главный экран — `home_page` Кнопки «Перевести» + «Пополнить» (`isHomeScreen()`). В 19.19.1 — `content-desc` `transfer-button-shared` / `replenish-button`, вкладки `Главная|FINANCE_TAB1…5`. - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - home_page #### Главный экран (альт. вид) — `home_page_2` 🔲 Альтернативное состояние главной. - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - home_page_2 #### Ввод PIN — `pin_code` Экран ввода пин-кода (`tryToFindPinCode()` по тексту «Не помню код-пароль»). В 19.19.1 цифры в `content-desc="key N"` (см. `findPinCodeNodes`). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pin_code #### Запрос биометрии — `ask_biometry` 🔲 Диалог предложения включить биометрию. - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - ask_biometry ### 1.2. Профиль (`GetProfileInfoScript`) #### Профиль / Аккаунт — `profile` Заголовок «Аккаунт» + кнопка «Выйти» (`isProfileScreen()`), ФИО и телефон. На 19.19.1 парсинг работает (телефон режется по «… Номер телефона»). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - profile ### 1.3. Карты (`GetCardInfoScript`) #### Карта — `card_screen` Основное состояние экрана карты (реквизиты маскированы, кнопка «Показать»). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - card_screen #### Карта (развёрнута) — `card_screen_open` Реквизиты раскрыты («Показать» → полный номер/срок/CVV, кнопка «Скрыть»). `findFullCardNumber` читает номер. - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - card_screen_open #### Карта (свёрнута) — `card_screen_hide` Реквизиты скрыты (маскированы). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - card_screen_hide #### Реквизиты счёта ⚠️ Заголовок «Реквизиты счёта» (`isAccountRequisitesScreen()`, `parseAccountNumberFromRequisites()`). Флоу в `GetCardInfoScript` сейчас закомментирован. - [ ] **Эталонный дамп ещё не снят** - Текущий дамп: _нет_ --- ## 2. fetch_transactions (`EventType::FetchTransactions` → `GetLastTransactionsScript`) ### 2.1. Список истории #### Страница платежей — `payments_page` Раздел «Платежи и переводы» (он же старт платёжных флоу: «По номеру телефона», «По номеру карты», «Между счетами»). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - payments_page #### Последние транзакции — `last_transactions` Список операций — WebView «Операции» (`isTransactionListScreen()`, `findTransactionButtons()` поддерживает текст в Button и во вложенной View с ₽). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - last_transactions #### Баннер в списке транзакций — `transaction_banner` 🔲 Промо-баннер «Аналитика финансов» внутри списка операций. В 19.19.1 виден inline на дампе `last_transactions` (отдельный кроп не снимался). - [ ] Снять под 19.19.1 (отдельно) - Текущий дамп: **текущий (без версии)** - transaction_banner ### 2.2. Детали транзакции #### Детали транзакции — `transaction_info` Дата+время, имя, телефон, сумма (`parseTransactionDetail()`). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - transaction_info #### Детали транзакции (СБП) — `transaction_info_spb` 🔲 Версия деталей для перевода через СБП в другой банк. - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - transaction_info_spb #### Документ операции — `transaction_document` Чек/документ по операции (PDF-картинка, OCR). На СБП-чеке есть «ID операции». - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - transaction_document --- ## 3. create_transaction (`EventType::CreateTransaction`) ### 3.1. Платёж по карте (`PayByCardScript`) #### Перевод по номеру карты — `pay/pay_by_card` Экран «Перевод по номеру карты» (`movable-pan-iframe`), поле «Номер карты получателя». - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_by_card #### Ввод суммы — `pay/pay_by_card_enter_sum` Карта распознана (банк-получатель), сумма введена, посчитана комиссия, кнопка «Перевести N ₽». - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_by_card_enter_sum #### Успех — `pay/pay_by_card_success` Экран «Успешно −N ₽» (включая комиссию). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_by_card_success ### 3.2. Платёж по телефону (`PayByPhoneScript`) #### Перевод по номеру — `pay/pay_buy_phone` Экран «Кому перевести»: поле «Номер телефона получателя» + последние переводы. - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_buy_phone #### Ввод суммы — `pay/pay_buy_phone_enter_sum` Экран «По номеру телефона»: счёт списания, получатель (с банком/СБП), «Сумма до …». - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_buy_phone_enter_sum #### Выбор банка — `pay/pay_buy_phone_select_bank` Список банков получателя (СБП): Озон/Альфа/Т-Банк/«Другой банк» (`other-bank-item`). Банки — кнопки с числовым `content-desc` (ID банка). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_buy_phone_select_bank #### Выбор банка — поиск — `pay/pay_buy_phone_select_bank_1` Экран поиска банка после «Другой банк» (EditText hint «Название банка»). Ввод кириллицы — только через ADBKeyboard (`com.android.adbkeyboard`); `adb input text` кириллицу не умеет. - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_buy_phone_select_bank_1 #### Банк по умолчанию — `pay/pay_buy_phone_default_bank` 🔲 Экран с предустановленным банком получателя (путь «старого» номера — не снимался). - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - pay_buy_phone_default_bank #### Проверка данных — `pay/pay_buy_phone_check_data` Экран «Подтвердите перевод»: банк получателя, счёт списания, сумма (то же, что `confirm_payment`). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_buy_phone_check_data #### Перевод на новый номер — `pay/pay_to_new_number` Экран «Кому перевести» с введённым новым номером. - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_to_new_number #### Перевод на старый номер — `pay/pay_to_old_number` 🔲 Выбор ранее использованного номера (по решению не снимался — всегда вводим новый номер). - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - pay_to_old_number #### Отправлено — `pay/pay_buy_phone_sent_success` Экран успешной отправки перевода по номеру (то же, что `confirm_payment_success`). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - pay_buy_phone_sent_success ### 3.3. Подтверждение (общее для обоих) #### Подтверждение платежа — `pay/confirm_payment` Экран «Подтвердите перевод», кнопка «Перевести N ₽». - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - confirm_payment #### Подтверждение — успех — `pay/confirm_payment_success` Чек «Успешно −N ₽» (СБП), с него снимается ID операции (через документ/OCR). - [x] Снято под 19.19.1 - Текущий дамп: **19.19.1** - confirm_payment_success #### Подтверждение — ошибка — `pay/confirm_payment_error` 🔲 Экран ошибки подтверждения платежа (сложно воспроизвести). - [ ] Снять под 19.19.1 - Текущий дамп: **текущий (без версии)** - confirm_payment_error --- ## Сводные галереи (только экраны, используемые в коде) _Эталонные дампы, на которые сейчас нет активного кода (детектор не вызывается), в эти таблицы не включены._ ### Задача `fetch_profile` — вход, профиль, карты (`FetchProfile`) | | | | | | | | | |---|---|---|---|---|---|---|---| |
home_page
19.19.1 |
profile
19.19.1 |
card_screen
19.19.1 | | | | | | ### Задача `fetch_transactions` (`FetchTransactions`) | | | | | | | | | |---|---|---|---|---|---|---|---| |
payments_page
19.19.1 |
last_transactions
19.19.1 |
transaction_info
19.19.1 |
transaction_document
19.19.1 | | | | | ### Задача `create_transaction` (`CreateTransaction`) | | | | | | | | | |---|---|---|---|---|---|---|---| |
pay_by_card
19.19.1 |
pay_by_card_enter_sum
19.19.1 |
pay_by_card_success
19.19.1 |
pay_buy_phone
19.19.1 |
pay_buy_phone_enter_sum
19.19.1 |
pay_buy_phone_select_bank
19.19.1 |
pay_to_new_number
19.19.1 | | |
select_bank_1
19.19.1 |
pay_buy_phone_sent_success
19.19.1 |
confirm_payment
19.19.1 |
confirm_payment_success
19.19.1 | | | | |