1
0
forked from BRT/arc

Update Ozon screen dump checklist for version 19.19.1: add versioning details, revise instructions, and integrate Compose-specific parsing notes. Include new capture script for automated screenshot and UI dump generation.

This commit is contained in:
slava 2026-06-06 16:15:02 +05:00
parent fac49447bf
commit ce3bc99ca8
53 changed files with 382 additions and 157 deletions

View File

@ -45,6 +45,11 @@ void GetCardInfoScript::doStart() {
const TaskDumpMeta dumpMeta{{}, 0, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion}; const TaskDumpMeta dumpMeta{{}, 0, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion};
TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_CARDS", m_deviceId, dumpMeta, &m_error); TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_CARDS", m_deviceId, dumpMeta, &m_error);
// Версионный трек приложения → версионно-зависимый парсинг (см. AppVersionTrack.h).
xmlScreenParser.setVersionTrack(Ozon::trackForVersion(app.appVersion));
qDebug() << "[Ozon::GetCardInfo] appVersion=" << app.appVersion
<< "→ track" << Ozon::trackName(xmlScreenParser.versionTrack());
// Читаем текущий экран // Читаем текущий экран
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));

View File

@ -112,6 +112,11 @@ void GetLastTransactionsScript::doStart() {
const TaskDumpMeta dumpMeta{m_materialId, firstAmount, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion}; const TaskDumpMeta dumpMeta{m_materialId, firstAmount, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion};
TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_TRANSACTIONS", m_deviceId, dumpMeta, &m_error); TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_TRANSACTIONS", m_deviceId, dumpMeta, &m_error);
// Версионный трек приложения → версионно-зависимый парсинг (см. AppVersionTrack.h).
xmlScreenParser.setVersionTrack(Ozon::trackForVersion(app.appVersion));
qDebug() << "[Ozon::GetLastTransactions] appVersion=" << app.appVersion
<< "→ track" << Ozon::trackName(xmlScreenParser.versionTrack());
if (!navigateToTransactionList(device, app)) { if (!navigateToTransactionList(device, app)) {
emit finishedWithResult(m_error); emit finishedWithResult(m_error);
return; return;

View File

@ -40,6 +40,11 @@ void GetProfileInfoScript::doStart() {
const TaskDumpMeta dumpMeta{{}, 0, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion}; const TaskDumpMeta dumpMeta{{}, 0, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion};
TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_PROFILE_INFO", m_deviceId, dumpMeta, &m_error); TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_PROFILE_INFO", m_deviceId, dumpMeta, &m_error);
// Версионный трек приложения → версионно-зависимый парсинг (см. AppVersionTrack.h).
xmlScreenParser.setVersionTrack(Ozon::trackForVersion(app.appVersion));
qDebug() << "[Ozon::GetProfileInfo] appVersion=" << app.appVersion
<< "→ track" << Ozon::trackName(xmlScreenParser.versionTrack());
// Читаем текущий экран // Читаем текущий экран
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));

View File

@ -43,6 +43,11 @@ void LoginAndCheckAccountsScript::doStart() {
const TaskDumpMeta dumpMeta{{}, 0, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion}; const TaskDumpMeta dumpMeta{{}, 0, {}, {}, app.bankProfileId, app.phone, device.id, app.appVersion};
TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_PROFILE", m_deviceId, dumpMeta, &m_error); TaskDumpRecorder::Scope dumpScope("ozon", "FETCH_PROFILE", m_deviceId, dumpMeta, &m_error);
// Версионный трек приложения → версионно-зависимый парсинг (см. AppVersionTrack.h).
xmlScreenParser.setVersionTrack(Ozon::trackForVersion(app.appVersion));
qDebug() << "[Ozon::LoginAndCheckAccounts] appVersion=" << app.appVersion
<< "→ track" << Ozon::trackName(xmlScreenParser.versionTrack());
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) { if (!runAppAndGoToHomeScreen(m_deviceId, app.package, app.pinCode, device.screenWidth, device.screenHeight)) {

View File

@ -94,6 +94,11 @@ void PayByCardScript::doStart() {
const TaskDumpMeta dumpMeta{m_account.materialId, m_amount, {}, m_cardNumber, app.bankProfileId, app.phone, device.id, app.appVersion}; const TaskDumpMeta dumpMeta{m_account.materialId, m_amount, {}, m_cardNumber, app.bankProfileId, app.phone, device.id, app.appVersion};
TaskDumpRecorder::Scope dumpScope("ozon", "CREATE_TRANSACTION_CARD", adbId, dumpMeta, &m_error); TaskDumpRecorder::Scope dumpScope("ozon", "CREATE_TRANSACTION_CARD", adbId, dumpMeta, &m_error);
// Версионный трек приложения → версионно-зависимый парсинг (см. AppVersionTrack.h).
xmlScreenParser.setVersionTrack(Ozon::trackForVersion(app.appVersion));
qDebug() << "[Ozon::PayByCard] appVersion=" << app.appVersion
<< "→ track" << Ozon::trackName(xmlScreenParser.versionTrack());
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
// Закрываем рекламный bottom sheet // Закрываем рекламный bottom sheet
@ -162,6 +167,10 @@ void PayByCardScript::makePayment(
}; };
// 1. Нажимаем "Перевести" на домашнем экране // 1. Нажимаем "Перевести" на домашнем экране
Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false); Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false);
if (transferBtn.isEmpty()) {
// Compose-UI Ozon (>= 19.x): у кнопки пустой text, тест-id в content-desc.
transferBtn = xmlScreenParser.findNodeByContentDesc("transfer-button-shared");
}
if (transferBtn.isEmpty()) { if (transferBtn.isEmpty()) {
m_error = "Кнопка 'Перевести' не найдена на домашнем экране"; m_error = "Кнопка 'Перевести' не найдена на домашнем экране";
qWarning() << "[PayByCard]" << m_error; qWarning() << "[PayByCard]" << m_error;

View File

@ -103,6 +103,11 @@ void PayByPhoneScript::doStart() {
const TaskDumpMeta dumpMeta{m_account.materialId, m_amount, m_phone, {}, app.bankProfileId, app.phone, device.id, app.appVersion}; const TaskDumpMeta dumpMeta{m_account.materialId, m_amount, m_phone, {}, app.bankProfileId, app.phone, device.id, app.appVersion};
TaskDumpRecorder::Scope dumpScope("ozon", "CREATE_TRANSACTION_PHONE", adbId, dumpMeta, &m_error); TaskDumpRecorder::Scope dumpScope("ozon", "CREATE_TRANSACTION_PHONE", adbId, dumpMeta, &m_error);
// Версионный трек приложения → версионно-зависимый парсинг (см. AppVersionTrack.h).
xmlScreenParser.setVersionTrack(Ozon::trackForVersion(app.appVersion));
qDebug() << "[Ozon::PayByPhone] appVersion=" << app.appVersion
<< "→ track" << Ozon::trackName(xmlScreenParser.versionTrack());
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(adbId, ++m_counter));
// Закрываем рекламный bottom sheet // Закрываем рекламный bottom sheet
@ -176,6 +181,10 @@ void PayByPhoneScript::makePayment(
// открывает промо "До 3 000 за рекомендацию". Тапаем в левую четверть, чтобы // открывает промо "До 3 000 за рекомендацию". Тапаем в левую четверть, чтобы
// гарантированно попасть мимо бейджа. // гарантированно попасть мимо бейджа.
Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false); Node transferBtn = xmlScreenParser.findButtonNode("Перевести", false);
if (transferBtn.isEmpty()) {
// Compose-UI Ozon (>= 19.x): у кнопки пустой text, тест-id в content-desc.
transferBtn = xmlScreenParser.findNodeByContentDesc("transfer-button-shared");
}
if (transferBtn.isEmpty()) { if (transferBtn.isEmpty()) {
m_error = "Кнопка 'Перевести' не найдена на домашнем экране"; m_error = "Кнопка 'Перевести' не найдена на домашнем экране";
qWarning() << "[PayByPhone]" << m_error; qWarning() << "[PayByPhone]" << m_error;

View File

@ -257,13 +257,17 @@ Node ScreenXmlParser::findNodeByContentDesc(const QString &contentDesc) {
} }
bool ScreenXmlParser::isHomeScreen() { bool ScreenXmlParser::isHomeScreen() {
// Домашний экран Ozon Банка: одновременно присутствуют кнопки "Перевести" и "Пополнить" // Домашний экран Ozon Банка: одновременно присутствуют кнопки "Перевести" и "Пополнить".
// Старый UI отдавал их видимым text. Compose-сборки Ozon (>= 19.x) text не отдают —
// у кнопок пустой text, а тест-id лежит в content-desc (transfer-button-shared /
// replenish-button). Поддерживаем оба варианта.
bool hasTransfer = false; bool hasTransfer = false;
bool hasTopUp = false; bool hasTopUp = false;
for (const Node &node: m_nodes) { for (const Node &node: m_nodes) {
const QString t = node.text.trimmed(); const QString t = node.text.trimmed();
if (t == "Перевести") hasTransfer = true; const QString cd = node.contentDesc.trimmed();
if (t == "Пополнить") hasTopUp = true; if (t == "Перевести" || cd == "transfer-button-shared") hasTransfer = true;
if (t == "Пополнить" || cd == "replenish-button") hasTopUp = true;
if (hasTransfer && hasTopUp) return true; if (hasTransfer && hasTopUp) return true;
} }
return false; return false;
@ -605,8 +609,11 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
static const QRegularExpression digitRx(R"(^(?:key\s+)?(\d)$)", QRegularExpression::CaseInsensitiveOption); static const QRegularExpression digitRx(R"(^(?:key\s+)?(\d)$)", QRegularExpression::CaseInsensitiveOption);
for (const Node &node : m_nodes) { for (const Node &node : m_nodes) {
if (!node.clickable || node.width() <= 0 || node.height() <= 0) continue; if (!node.clickable || node.width() <= 0 || node.height() <= 0) continue;
const QString t = node.text.trimmed(); // Цифра живёт в text ("1"/"key 1") в старом UI, либо — в Compose-сборках Ozon
if (const auto match = digitRx.match(t); match.hasMatch()) { // (>= 19.x) — в content-desc ("key 1") при пустом text.
auto match = digitRx.match(node.text.trimmed());
if (!match.hasMatch()) match = digitRx.match(node.contentDesc.trimmed());
if (match.hasMatch()) {
digitMap[match.captured(1)] = node; digitMap[match.captured(1)] = node;
} }
} }

View File

@ -5,6 +5,7 @@
#include "android/xml/Node.h" #include "android/xml/Node.h"
#include "db/MaterialInfo.h" #include "db/MaterialInfo.h"
#include "db/TransactionInfo.h" #include "db/TransactionInfo.h"
#include "AppVersionTrack.h"
namespace Ozon { namespace Ozon {
@ -16,6 +17,13 @@ public:
~ScreenXmlParser() override; ~ScreenXmlParser() override;
// Версионный трек приложения проставляется один раз в начале скрипта:
// parser.setVersionTrack(Ozon::trackForVersion(app.appVersion));
// Версионно-зависимые методы парсинга используют m_track как явный шов
// (см. AppVersionTrack.h). По умолчанию — новейший известный формат.
void setVersionTrack(AppVersionTrack track) { m_track = track; }
AppVersionTrack versionTrack() const { return m_track; }
Node tryToFindBannerOrDialog(int width, int height); Node tryToFindBannerOrDialog(int width, int height);
Node tryToFindSecurityBanner(); Node tryToFindSecurityBanner();
@ -133,6 +141,7 @@ public:
private: private:
QList<Node> m_nodes; QList<Node> m_nodes;
QDomElement m_xml; QDomElement m_xml;
AppVersionTrack m_track = AppVersionTrack::V19_19_1;
QList<Node> findPinCodeNodes(const QString &pinCode); QList<Node> findPinCodeNodes(const QString &pinCode);
}; };

View File

@ -0,0 +1,103 @@
# Ozon 19.19.1 — расхождения вёрстки с парсером
Устройство: Pixel 7, Android 17. Версия Ozon: **19.19.1** (versionCode 16030308).
Пакет: `ru.ozon.fintech.finance`.
Общий вывод: приложение переехало на **Compose-семантику** — интерактивные контролы
(кнопки, вкладки) больше не несут видимый `text`, а выставляют стабильные тест-id в
`content-desc`. Текстовый контент (балансы, заголовки, строки списков) по-прежнему в `text`.
Парсер во многих местах матчит по `node.text` → ломается. Чинить переходом на `content-desc`.
## Найденные расхождения
### 1. PIN-пад (`findPinCodeNodes`, способ 1) — экран `pin_code`
- Было: цифра в `text="key 1"` (регулярка `^(?:key\s+)?(\d)$` по `node.text`).
- Стало: `text=""`, цифра в **`content-desc="key 1"`** (class Button).
- Эффект: способ 1 находит 0 цифр, спасает только геометрический fallback (способ 2) — хрупко
(кнопка отпечатка `bioauth` 86×87 почти попадает в группу «квадратных»).
- Фикс: в способе 1 матчить регуляркой и `node.text`, и `content-desc`.
### 2. Главный экран (`isHomeScreen`) — экран `home_page`
- Было: требует одновременно `text=="Перевести"` и `text=="Пополнить"`.
- Стало: этих текстов нет. Кнопки — `content-desc`: `transfer-button-shared` (Перевести),
`replenish-button` (Пополнить), `qr-code-button` (Оплата QR).
- Нижняя навигация — `content-desc`: `Главная|FINANCE_TAB1``Ещё|FINANCE_TAB5`.
- Эффект: `isHomeScreen()` всегда возвращает false → флоу не стартует.
- Фикс: детектить по `content-desc` (`transfer-button-shared`+`replenish-button` или `FINANCE_TAB1`).
### 2b. `findButtonNode("Перевести")` на главной — PayByPhone/PayByCard старт
- `findButtonNode()` матчит ТОЛЬКО `node.text` (class Button). Кнопка «Перевести» на главной —
`content-desc="transfer-button-shared"`, `text=""` → возвращает пусто.
- Эффект: `PayByPhoneScript` (стр.178) и `PayByCardScript` (стр.164) падают на старте:
«Кнопка 'Перевести' не найдена на домашнем экране». Аналогично «Пополнить» = `replenish-button`.
- Фикс: тапать кнопку действия на главной по `content-desc` (`transfer-button-shared` /
`replenish-button` / `qr-code-button`), либо расширить `findButtonNode` на `content-desc`.
## ПРИМЕНЁННЫЕ ПРАВКИ (собрано и проверено на дампах 19.19.1)
Все детекторы сделаны обратносовместимыми (сначала `text`, затем fallback на `content-desc`) —
старые сборки Ozon продолжают работать.
1. `ScreenXmlParser::findPinCodeNodes` (способ 1) — цифра матчится и в `text`, и в `content-desc`
(`key N`). На дампе нашёл 10/10 цифр.
2. `ScreenXmlParser::isHomeScreen` — детект по `text` ИЛИ `content-desc`
(`transfer-button-shared` / `replenish-button`). На дампе → true.
3. `PayByPhoneScript` + `PayByCardScript` — домашняя «Перевести»: fallback
`findNodeByContentDesc("transfer-button-shared")` после пустого `findButtonNode`.
### Каркас версионности — `android/ozon/AppVersionTrack.h` (по образцу Dushanbe)
- `enum AppVersionTrack { Legacy (<19.19.1), V19_19_1 (>=19.19.1, новейший по умолчанию) }`.
- `trackForVersion(appVersion)` через `QVersionNumber`; неизвестная/новее порога → новейший трек.
- `ScreenXmlParser`: `setVersionTrack()`/`versionTrack()`, член `m_track = V19_19_1`.
- Во всех 6 скриптах: `xmlScreenParser.setVersionTrack(Ozon::trackForVersion(app.appVersion))`
+ лог `appVersion → track` сразу после `dumpScope`.
- Веток по `m_track` пока НЕТ (детекторы обратносовместимы) — трек это явный шов под будущие
расхождения и маркер в логах. Как добавлять новую версию — см. комментарий в AppVersionTrack.h.
## Проверено на 19.19.1 и РАБОТАЕТ без правок
- `isProfileScreen()` — тексты «Аккаунт»+«Выйти» на месте.
- `parseProfilePhone()` — режет склейку «+7 953 803 83 18 Номер телефона» по подстроке.
- `parseProfileFullName()` — ФИО «Галина Терехина» берётся как TextView между «Аккаунт» и телефоном.
- `findUserNameOnHomeScreen()` — «Галина Т.» в верхней зоне.
- Карта: «Показать»/«Реквизиты карты»/`findFullCardNumber` — номер `2204 3210 8610 9865`,
срок `12/35`, CVV `774` читаются. Тексты в `text`.
- `isTransactionListScreen()` — WebView text=«Операции».
- `findTransactionButtons()` — находит строки; поддерживает оба варианта (текст в Button и во вложенной View с ₽).
- `parseTransactionDetail()` — дата `26.05.2026, 18:56`, телефон `+7 (950) 128-60-90`, имя над телефоном.
## Платёжный флоу — проверено реальными переводами (по скрипту)
Сделаны 2 реальных перевода с устройства: СБП 50₽ на Альфа (+7 985 553-28-96) и
по карте 100₽+45₽ комиссия на карту Альфа 2200 1545 1435 0684.
- Старт «Перевести» на главной — см. расхождение 2b (content-desc).
- Дальше всё на текстовых маркерах РАБОТАЕТ: «Платежи и переводы», «По номеру телефона»,
«По номеру карты», «Перевод по номеру карты», «Номер карты получателя», «Сумма от»,
«Продолжить», «Подтвердите перевод», «Перевести N ₽», «Успешно».
- Выбор банка (СБП): список — кнопки с числовым `content-desc` (ID банка, напр. Альфа=100000000008),
«Другой банк» = `content-desc="other-bank-item"`. Скрипт это уже поддерживает.
- Ввод названия банка кириллицей — ТОЛЬКО через ADBKeyboard (`com.android.adbkeyboard`):
`adb shell input text` кидает NullPointerException на кириллице. Скрипт использует
`enableAdbIMEKeyboard`/`inputAdbIMEText` — корректно.
- OCR ID операции: на СБП-чеке (Документы) есть «ID операции A6I5...» — `extractTransactionId` сработает.
На внутреннем Ozon-чеке поля «ID операции» НЕТ (см. transaction_document).
## Снятые дампы (assets/ozon/19.19.1/)
Корень: pin_code, home_page, profile, card_screen, card_screen_open, card_screen_hide,
payments_page, last_transactions (+ баннер «Аналитика финансов» = transaction_banner inline),
transaction_info, transaction_document.
pay/: pay_buy_phone, pay_to_new_number, pay_buy_phone_select_bank, pay_buy_phone_select_bank_1,
pay_buy_phone_enter_sum, confirm_payment (=pay_buy_phone_check_data), confirm_payment_success
(=pay_buy_phone_sent_success), pay_by_card, pay_by_card_enter_sum, pay_by_card_success.
## Ещё не снято
- account_requisites ⚠️ (флоу в коде закомментирован) — пропущено
- transaction_info_spb — пропущено по решению (есть свежая СБП-операция, если понадобится)
- pay_buy_phone_default_bank — пропущено (всегда вводим новый номер)
- confirm_payment_error — экран ошибки, сложно воспроизвести
- home_page_2, ask_biometry
- Баннеры/оверлеи: home_ad_1, google_play, banner_ipoteka, card_banner, select_bank,
onboarding ⚠️, security ⚠️, system_permission ⚠️ (всплывают ситуативно)

19
assets/ozon/19.19.1/capture.sh Executable file
View File

@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Снимок экрана Ozon: PNG + uiautomator XML под одним именем.
# Использование: ./capture.sh <имя> -> assets/ozon/19.19.1/<имя>.png|.xml
# ./capture.sh pay/<имя> -> кладёт в подпапку pay/
set -euo pipefail
NAME="${1:?usage: capture.sh <name>}"
DIR="$(cd "$(dirname "$0")" && pwd)"
OUT="$DIR/$NAME"
mkdir -p "$(dirname "$OUT")"
# screenshot
adb exec-out screencap -p > "$OUT.png"
# ui hierarchy
adb shell uiautomator dump /sdcard/window_dump.xml >/dev/null 2>&1
adb pull /sdcard/window_dump.xml "$OUT.xml" >/dev/null 2>&1
PXSIZE=$(stat -f%z "$OUT.png" 2>/dev/null || echo 0)
echo "saved: $NAME.png (${PXSIZE}b) + $NAME.xml"

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

File diff suppressed because one or more lines are too long

View File

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

View File

@ -13,7 +13,7 @@
"device_label": "Pixel 7", "device_label": "Pixel 7",
"materials": [ "materials": [
{ {
"id": "d49d3d02-ecce-4e00-97d5-0c52da6fd0db", "id": "e1234f11-b99d-4930-9f86-75148601f683",
"state": "enabled", "state": "enabled",
"card_number": "2204321035207919", "card_number": "2204321035207919",
"currency": 643 "currency": 643

View File

@ -345,6 +345,21 @@ def current_profile():
}) })
@app.get("/api/v1/profile/get_info")
def profile_get_info():
return ok({"id": _profile_id})
@app.post("/api/v1/profile/ping")
def profile_ping():
return ok({})
@app.get("/api/v1/profile/ping")
def profile_ping_get():
return ok({})
@app.post("/api/v1/profile/bank_profile") @app.post("/api/v1/profile/bank_profile")
def bank_profile_create(): def bank_profile_create():
body = request.get_json(silent=True) or {} body = request.get_json(silent=True) or {}