1
0
forked from BRT/arc

Refine transaction amount parsing and improve banner closing in Ozon scripts:

- Handle fractional amounts during transaction parsing in mock server.
- Add support for closing Google Play update banners in `Ozon` homepage handling logic.
This commit is contained in:
trnsmkot 2026-04-18 17:27:12 +07:00
parent bc2fc2729d
commit fc1ccb4ae8
2 changed files with 36 additions and 14 deletions

View File

@ -200,14 +200,28 @@ bool CommonScript::runAppAndGoToHomeScreen(
}
bool CommonScript::tryToCloseAllBannersOnHomePage(const QString &deviceId, const int width, const int height) {
Node closeBannerOrDialogNode = xmlScreenParser.tryToFindBannerOrDialog(width, height);
if (closeBannerOrDialogNode.x() != -1 && closeBannerOrDialogNode.y() != -1) {
AdbUtils::makeTap(deviceId, closeBannerOrDialogNode.x(), closeBannerOrDialogNode.y());
return true;
}
bool closedAny = false;
for (int i = 0; i < 5; ++i) {
bool closedThis = false;
// TODO тут все другие банеры попробовать закрыть
return false;
// Баннер Google Play "Доступно обновление" — появляется поверх Ozon при возврате на домашнюю
if (Node gpNode = xmlScreenParser.tryToFindGooglePlayBanner(width, height); !gpNode.isEmpty()) {
qDebug() << "[tryToCloseAllBannersOnHomePage] Google Play update banner detected, closing...";
AdbUtils::makeTap(deviceId, gpNode.x(), gpNode.y());
QThread::msleep(1500);
closedThis = true;
} else if (Node closeBannerOrDialogNode = xmlScreenParser.tryToFindBannerOrDialog(width, height);
closeBannerOrDialogNode.x() != -1 && closeBannerOrDialogNode.y() != -1) {
AdbUtils::makeTap(deviceId, closeBannerOrDialogNode.x(), closeBannerOrDialogNode.y());
QThread::msleep(500);
closedThis = true;
}
if (!closedThis) break;
closedAny = true;
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
}
return closedAny;
}
bool CommonScript::goToAllProducts(

View File

@ -226,11 +226,12 @@ def parse_ozon_rows(xml):
continue
if "Расход" in text or "Доход" in text:
continue
am = re.search(r"([+\-])\s*(\d[\d\s\u202f]*)", text)
am = re.search(r"([+\-])\s*(\d[\d\s\u202f]*(?:[,.]\d{1,2})?)", text)
if not am:
continue
sign = -1 if am.group(1) in ("-", "") else 1
amount = sign * int(re.sub(r"[\s\u202f]", "", am.group(2)))
raw = re.sub(r"[\s\u202f]", "", am.group(2)).replace(",", ".")
amount = sign * (float(raw) if "." in raw else int(raw))
rows.append({"text": text, "cx": (x1+x2)//2, "cy": cy, "amount": amount})
rows.sort(key=lambda r: r["cy"])
return rows
@ -275,7 +276,7 @@ def parse_dushanbe_rows(xml):
for p in parts:
p = p.strip()
try:
amount = int(float(p))
amount = float(p.replace(",", "."))
except ValueError:
pass
if re.match(r"^\s*\d{1,2}:\d{2}(:\d{2})?\s*$", p):
@ -306,7 +307,14 @@ def extract_dushanbe_detail(xml):
def short_label(amount, time_str):
sign = "plus" if amount >= 0 else "minus"
t = time_str.replace(":", "") if time_str else "unk"
return f"{sign}_{abs(amount)}_{t}"
a = abs(amount)
if isinstance(a, float):
rub = int(a)
kop = int(round((a - rub) * 100))
amt = f"{rub}_{kop:02d}" if kop else f"{rub}"
else:
amt = f"{a}"
return f"{sign}_{amt}_{t}"
def collect_tasks(serial, bank, mid, device_tz, kopecks, prefix):
@ -416,7 +424,7 @@ def collect_tasks(serial, bank, mid, device_tz, kopecks, prefix):
while label in seen: label += "_2"
seen.add(label)
tasks.append({"bank_name": bank, "material_id": mid, "type": "FETCH_TRANSACTIONS",
"body": {"amount": row["amount"] * kopecks, "created_at": cat},
"body": {"amount": int(round(row["amount"] * kopecks)), "created_at": cat},
"_tag": f"{prefix}_{task_num:02d}_{label}"})
# Помечаем даты как завершённые: все даты кроме последней на экране
@ -477,7 +485,7 @@ def collect_tasks(serial, bank, mid, device_tz, kopecks, prefix):
if not date_s or not time_s:
print(" SKIP"); continue
amount = int(float(amt_s)) if amt_s else (row["amount"] or 0)
amount = float(amt_s.replace(",", ".")) if amt_s else (row["amount"] or 0)
fmt = "%d.%m.%Y %H:%M:%S" if len(time_s) > 5 else "%d.%m.%Y %H:%M"
# Душанбе показывает время в Asia/Dushanbe (UTC+5), не в таймзоне устройства
dushanbe_tz = timezone(timedelta(hours=5))
@ -494,7 +502,7 @@ def collect_tasks(serial, bank, mid, device_tz, kopecks, prefix):
while label in seen: label += "_2"
seen.add(label)
tasks.append({"bank_name": bank, "material_id": mid, "type": "FETCH_TRANSACTIONS",
"body": {"amount": amount * kopecks, "created_at": cat},
"body": {"amount": int(round(amount * kopecks)), "created_at": cat},
"_tag": f"{prefix}_{task_num:02d}_{label}"})
scroll_count += 1