From a8d41baab725d2072743c7c5352e1077ebc200a0 Mon Sep 17 00:00:00 2001 From: slava Date: Thu, 14 May 2026 19:33:44 +0700 Subject: [PATCH] Improve "Other Bank" button handling in `PayByPhoneScript` by ensuring full visibility with enhanced bounds checks and increased scroll attempts. --- android/ozon/PayByPhoneScript.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/android/ozon/PayByPhoneScript.cpp b/android/ozon/PayByPhoneScript.cpp index e005169..e8c0daa 100644 --- a/android/ozon/PayByPhoneScript.cpp +++ b/android/ozon/PayByPhoneScript.cpp @@ -298,23 +298,33 @@ void PayByPhoneScript::makePayment( if (!bankSelected) { // Вариант 1: кнопка "Другой банк" (content-desc="other-bank-item", text пустой). // На устройствах с маленьким экраном кнопка лежит в конце виртуализированного - // списка банков и приходит с bounds=[0,0][0,0] — Node::isEmpty это не отлавливает - // (требует все координаты < 0), и тап уходит в (0,0). Скроллим список вниз, - // пока bounds не станут реальными, и только тогда тапаем. + // списка банков. Возможные состояния: + // - bounds=[0,0][0,0] — ниже видимой области, ещё не материализована + // - bounds=[..,h-20][..,h] — материализована, но обрезана нижним краем экрана + // Node::isEmpty это не ловит, и тап по обрезанному элементу промахивается. + // Скроллим список вниз, пока кнопка не окажется ПОЛНОСТЬЮ в видимой зоне. auto findOtherBank = [&]() -> Node { for (const Node &n : xmlScreenParser.findAllNodes()) { if (n.contentDesc.contains("other-bank-item")) return n; } return {}; }; + auto isFullyVisible = [&](const Node &n) { + return !n.isEmpty() + && n.width() > 0 + && n.height() >= 80 + && n.y1() >= 0 + && n.y2() <= height - 40; + }; bool foundOtherBank = false; Node node = findOtherBank(); for (int scrollAttempt = 0; - !node.isEmpty() && (node.width() == 0 || node.height() == 0) && scrollAttempt < 6; + !isFullyVisible(node) && scrollAttempt < 8; ++scrollAttempt) { - qDebug() << "[PayByPhone] 'Другой банк' has collapsed bounds, scrolling list down, attempt" - << scrollAttempt + 1 << "/ 6"; + qDebug() << "[PayByPhone] 'Другой банк' not fully visible (bounds=" + << node.x1() << "," << node.y1() << "-" << node.x2() << "," << node.y2() + << "), scrolling list down, attempt" << scrollAttempt + 1 << "/ 8"; AdbUtils::makeSwipe(deviceId, width / 2, height * 3 / 4, width / 2, height / 4); QThread::msleep(800); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); @@ -322,7 +332,7 @@ void PayByPhoneScript::makePayment( node = findOtherBank(); } - if (!node.isEmpty() && node.width() > 0 && node.height() > 0) { + if (isFullyVisible(node)) { qDebug() << "[PayByPhone] Tapping 'Другой банк' (other-bank-item) at" << node.x() << "," << node.y(); AdbUtils::makeTap(deviceId, node.x(), node.y());