diff --git a/android/ozon/PayByPhoneScript.cpp b/android/ozon/PayByPhoneScript.cpp index e8c0daa..400f3cd 100644 --- a/android/ozon/PayByPhoneScript.cpp +++ b/android/ozon/PayByPhoneScript.cpp @@ -298,33 +298,24 @@ void PayByPhoneScript::makePayment( if (!bankSelected) { // Вариант 1: кнопка "Другой банк" (content-desc="other-bank-item", text пустой). // На устройствах с маленьким экраном кнопка лежит в конце виртуализированного - // списка банков. Возможные состояния: - // - bounds=[0,0][0,0] — ниже видимой области, ещё не материализована - // - bounds=[..,h-20][..,h] — материализована, но обрезана нижним краем экрана - // Node::isEmpty это не ловит, и тап по обрезанному элементу промахивается. - // Скроллим список вниз, пока кнопка не окажется ПОЛНОСТЬЮ в видимой зоне. + // списка и приходит с bounds=[0,0][0,0] — Node::isEmpty это не ловит, тап + // улетает в (0,0). Скроллим список вниз, пока bounds не станут ненулевыми + // (после первого скролла кнопка обычно материализуется у нижнего края, но + // тап по ней работает — это её настоящая позиция в layout). 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; - !isFullyVisible(node) && scrollAttempt < 8; + !node.isEmpty() && (node.width() == 0 || node.height() == 0) && scrollAttempt < 6; ++scrollAttempt) { - qDebug() << "[PayByPhone] 'Другой банк' not fully visible (bounds=" - << node.x1() << "," << node.y1() << "-" << node.x2() << "," << node.y2() - << "), scrolling list down, attempt" << scrollAttempt + 1 << "/ 8"; + qDebug() << "[PayByPhone] 'Другой банк' has collapsed bounds, scrolling list down, attempt" + << scrollAttempt + 1 << "/ 6"; AdbUtils::makeSwipe(deviceId, width / 2, height * 3 / 4, width / 2, height / 4); QThread::msleep(800); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); @@ -332,7 +323,7 @@ void PayByPhoneScript::makePayment( node = findOtherBank(); } - if (isFullyVisible(node)) { + if (!node.isEmpty() && node.width() > 0 && node.height() > 0) { qDebug() << "[PayByPhone] Tapping 'Другой банк' (other-bank-item) at" << node.x() << "," << node.y(); AdbUtils::makeTap(deviceId, node.x(), node.y());