336 lines
21 KiB
Markdown
336 lines
21 KiB
Markdown
# 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
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/home_ad_1.png" width="250" alt="home_ad_1">
|
||
|
||
#### Обновление Google Play — `google_play` 🔲
|
||
In-app update bottom-sheet (`tryToFindGooglePlayBanner()`).
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/google_play.png" width="250" alt="google_play">
|
||
|
||
#### Баннер ипотеки — `banner_ipoteka` 🔲
|
||
Промо-баннер на главной.
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/banner_ipoteka.png" width="250" alt="banner_ipoteka">
|
||
|
||
#### Баннер карты — `card_banner` 🔲
|
||
Промо-баннер «Заказать карту» на главной.
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/card_banner.png" width="250" alt="card_banner">
|
||
|
||
#### Выбор (bottom-sheet) — `select_bank` 🔲
|
||
Шторка выбора (`tryToFindSelectBottomSheet()`). Не путать с экраном выбора банка СБП
|
||
(`pay/pay_buy_phone_select_bank`).
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/select_bank.png" width="250" alt="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**
|
||
- <img src="../assets/ozon/19.19.1/home_page.png" width="250" alt="home_page">
|
||
|
||
#### Главный экран (альт. вид) — `home_page_2` 🔲
|
||
Альтернативное состояние главной.
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/home_page_2.png" width="250" alt="home_page_2">
|
||
|
||
#### Ввод PIN — `pin_code`
|
||
Экран ввода пин-кода (`tryToFindPinCode()` по тексту «Не помню код-пароль»). В 19.19.1
|
||
цифры в `content-desc="key N"` (см. `findPinCodeNodes`).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pin_code.png" width="250" alt="pin_code">
|
||
|
||
#### Запрос биометрии — `ask_biometry` 🔲
|
||
Диалог предложения включить биометрию.
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/ask_biometry.png" width="250" alt="ask_biometry">
|
||
|
||
### 1.2. Профиль (`GetProfileInfoScript`)
|
||
|
||
#### Профиль / Аккаунт — `profile`
|
||
Заголовок «Аккаунт» + кнопка «Выйти» (`isProfileScreen()`), ФИО и телефон. На 19.19.1
|
||
парсинг работает (телефон режется по «… Номер телефона»).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/profile.png" width="250" alt="profile">
|
||
|
||
### 1.3. Карты (`GetCardInfoScript`)
|
||
|
||
#### Карта — `card_screen`
|
||
Основное состояние экрана карты (реквизиты маскированы, кнопка «Показать»).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/card_screen.png" width="250" alt="card_screen">
|
||
|
||
#### Карта (развёрнута) — `card_screen_open`
|
||
Реквизиты раскрыты («Показать» → полный номер/срок/CVV, кнопка «Скрыть»).
|
||
`findFullCardNumber` читает номер.
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/card_screen_open.png" width="250" alt="card_screen_open">
|
||
|
||
#### Карта (свёрнута) — `card_screen_hide`
|
||
Реквизиты скрыты (маскированы).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/card_screen_hide.png" width="250" alt="card_screen_hide">
|
||
|
||
#### Реквизиты счёта ⚠️
|
||
Заголовок «Реквизиты счёта» (`isAccountRequisitesScreen()`, `parseAccountNumberFromRequisites()`).
|
||
Флоу в `GetCardInfoScript` сейчас закомментирован.
|
||
- [ ] **Эталонный дамп ещё не снят**
|
||
- Текущий дамп: _нет_
|
||
|
||
---
|
||
|
||
## 2. fetch_transactions (`EventType::FetchTransactions` → `GetLastTransactionsScript`)
|
||
|
||
### 2.1. Список истории
|
||
|
||
#### Страница платежей — `payments_page`
|
||
Раздел «Платежи и переводы» (он же старт платёжных флоу: «По номеру телефона»,
|
||
«По номеру карты», «Между счетами»).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/payments_page.png" width="250" alt="payments_page">
|
||
|
||
#### Последние транзакции — `last_transactions`
|
||
Список операций — WebView «Операции» (`isTransactionListScreen()`, `findTransactionButtons()`
|
||
поддерживает текст в Button и во вложенной View с ₽).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/last_transactions.png" width="250" alt="last_transactions">
|
||
|
||
#### Баннер в списке транзакций — `transaction_banner` 🔲
|
||
Промо-баннер «Аналитика финансов» внутри списка операций. В 19.19.1 виден inline на дампе
|
||
`last_transactions` (отдельный кроп не снимался).
|
||
- [ ] Снять под 19.19.1 (отдельно)
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/transaction_banner.png" width="250" alt="transaction_banner">
|
||
|
||
### 2.2. Детали транзакции
|
||
|
||
#### Детали транзакции — `transaction_info`
|
||
Дата+время, имя, телефон, сумма (`parseTransactionDetail()`).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/transaction_info.png" width="250" alt="transaction_info">
|
||
|
||
#### Детали транзакции (СБП) — `transaction_info_spb` 🔲
|
||
Версия деталей для перевода через СБП в другой банк.
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/transaction_info_spb.png" width="250" alt="transaction_info_spb">
|
||
|
||
#### Документ операции — `transaction_document`
|
||
Чек/документ по операции (PDF-картинка, OCR). На СБП-чеке есть «ID операции».
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/transaction_document.png" width="250" alt="transaction_document">
|
||
|
||
---
|
||
|
||
## 3. create_transaction (`EventType::CreateTransaction`)
|
||
|
||
### 3.1. Платёж по карте (`PayByCardScript`)
|
||
|
||
#### Перевод по номеру карты — `pay/pay_by_card`
|
||
Экран «Перевод по номеру карты» (`movable-pan-iframe`), поле «Номер карты получателя».
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_by_card.png" width="250" alt="pay_by_card">
|
||
|
||
#### Ввод суммы — `pay/pay_by_card_enter_sum`
|
||
Карта распознана (банк-получатель), сумма введена, посчитана комиссия, кнопка «Перевести N ₽».
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_by_card_enter_sum.png" width="250" alt="pay_by_card_enter_sum">
|
||
|
||
#### Успех — `pay/pay_by_card_success`
|
||
Экран «Успешно −N ₽» (включая комиссию).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_by_card_success.png" width="250" alt="pay_by_card_success">
|
||
|
||
### 3.2. Платёж по телефону (`PayByPhoneScript`)
|
||
|
||
#### Перевод по номеру — `pay/pay_buy_phone`
|
||
Экран «Кому перевести»: поле «Номер телефона получателя» + последние переводы.
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_buy_phone.png" width="250" alt="pay_buy_phone">
|
||
|
||
#### Ввод суммы — `pay/pay_buy_phone_enter_sum`
|
||
Экран «По номеру телефона»: счёт списания, получатель (с банком/СБП), «Сумма до …».
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_enter_sum.png" width="250" alt="pay_buy_phone_enter_sum">
|
||
|
||
#### Выбор банка — `pay/pay_buy_phone_select_bank`
|
||
Список банков получателя (СБП): Озон/Альфа/Т-Банк/«Другой банк» (`other-bank-item`).
|
||
Банки — кнопки с числовым `content-desc` (ID банка).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_select_bank.png" width="250" alt="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**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_select_bank_1.png" width="250" alt="pay_buy_phone_select_bank_1">
|
||
|
||
#### Банк по умолчанию — `pay/pay_buy_phone_default_bank` 🔲
|
||
Экран с предустановленным банком получателя (путь «старого» номера — не снимался).
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/pay/pay_buy_phone_default_bank.png" width="250" alt="pay_buy_phone_default_bank">
|
||
|
||
#### Проверка данных — `pay/pay_buy_phone_check_data`
|
||
Экран «Подтвердите перевод»: банк получателя, счёт списания, сумма (то же, что `confirm_payment`).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_check_data.png" width="250" alt="pay_buy_phone_check_data">
|
||
|
||
#### Перевод на новый номер — `pay/pay_to_new_number`
|
||
Экран «Кому перевести» с введённым новым номером.
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_to_new_number.png" width="250" alt="pay_to_new_number">
|
||
|
||
#### Перевод на старый номер — `pay/pay_to_old_number` 🔲
|
||
Выбор ранее использованного номера (по решению не снимался — всегда вводим новый номер).
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/pay/pay_to_old_number.png" width="250" alt="pay_to_old_number">
|
||
|
||
#### Отправлено — `pay/pay_buy_phone_sent_success`
|
||
Экран успешной отправки перевода по номеру (то же, что `confirm_payment_success`).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_sent_success.png" width="250" alt="pay_buy_phone_sent_success">
|
||
|
||
### 3.3. Подтверждение (общее для обоих)
|
||
|
||
#### Подтверждение платежа — `pay/confirm_payment`
|
||
Экран «Подтвердите перевод», кнопка «Перевести N ₽».
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/confirm_payment.png" width="250" alt="confirm_payment">
|
||
|
||
#### Подтверждение — успех — `pay/confirm_payment_success`
|
||
Чек «Успешно −N ₽» (СБП), с него снимается ID операции (через документ/OCR).
|
||
- [x] Снято под 19.19.1
|
||
- Текущий дамп: **19.19.1**
|
||
- <img src="../assets/ozon/19.19.1/pay/confirm_payment_success.png" width="250" alt="confirm_payment_success">
|
||
|
||
#### Подтверждение — ошибка — `pay/confirm_payment_error` 🔲
|
||
Экран ошибки подтверждения платежа (сложно воспроизвести).
|
||
- [ ] Снять под 19.19.1
|
||
- Текущий дамп: **текущий (без версии)**
|
||
- <img src="../assets/ozon/pay/confirm_payment_error.png" width="250" alt="confirm_payment_error">
|
||
|
||
---
|
||
|
||
## Сводные галереи (только экраны, используемые в коде)
|
||
|
||
_Эталонные дампы, на которые сейчас нет активного кода (детектор не вызывается), в эти таблицы не включены._
|
||
|
||
### Задача `fetch_profile` — вход, профиль, карты (`FetchProfile`)
|
||
|
||
| | | | | | | | |
|
||
|---|---|---|---|---|---|---|---|
|
||
| <img src="../assets/ozon/19.19.1/home_page.png" width="100"><br><sub>home_page</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/profile.png" width="100"><br><sub>profile</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/card_screen.png" width="100"><br><sub>card_screen</sub><br><sub>19.19.1</sub> | | | | | |
|
||
|
||
### Задача `fetch_transactions` (`FetchTransactions`)
|
||
|
||
| | | | | | | | |
|
||
|---|---|---|---|---|---|---|---|
|
||
| <img src="../assets/ozon/19.19.1/payments_page.png" width="100"><br><sub>payments_page</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/last_transactions.png" width="100"><br><sub>last_transactions</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/transaction_info.png" width="100"><br><sub>transaction_info</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/transaction_document.png" width="100"><br><sub>transaction_document</sub><br><sub>19.19.1</sub> | | | | |
|
||
|
||
### Задача `create_transaction` (`CreateTransaction`)
|
||
|
||
| | | | | | | | |
|
||
|---|---|---|---|---|---|---|---|
|
||
| <img src="../assets/ozon/19.19.1/pay/pay_by_card.png" width="100"><br><sub>pay_by_card</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/pay_by_card_enter_sum.png" width="100"><br><sub>pay_by_card_enter_sum</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/pay_by_card_success.png" width="100"><br><sub>pay_by_card_success</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/pay_buy_phone.png" width="100"><br><sub>pay_buy_phone</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_enter_sum.png" width="100"><br><sub>pay_buy_phone_enter_sum</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_select_bank.png" width="100"><br><sub>pay_buy_phone_select_bank</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/pay_to_new_number.png" width="100"><br><sub>pay_to_new_number</sub><br><sub>19.19.1</sub> | |
|
||
| <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_select_bank_1.png" width="100"><br><sub>select_bank_1</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/pay_buy_phone_sent_success.png" width="100"><br><sub>pay_buy_phone_sent_success</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/confirm_payment.png" width="100"><br><sub>confirm_payment</sub><br><sub>19.19.1</sub> | <img src="../assets/ozon/19.19.1/pay/confirm_payment_success.png" width="100"><br><sub>confirm_payment_success</sub><br><sub>19.19.1</sub> | | | | |
|