diff --git a/android/ozon/PayByCardScript.cpp b/android/ozon/PayByCardScript.cpp index b1434be..202d11a 100644 --- a/android/ozon/PayByCardScript.cpp +++ b/android/ozon/PayByCardScript.cpp @@ -272,6 +272,11 @@ void PayByCardScript::makePayment( qDebug() << "[PayByCard] Card number and amount entered"; + // Закрываем системную софт-клавиатуру — иначе она перекрывает кнопку "Перевести" + // внизу экрана (bounds схлопываются до нулевой высоты). + AdbUtils::hideKeyboard(deviceId); + QThread::msleep(800); + // 7. Ждём расчёта комиссии (текст после "Комиссия" перестаёт быть "Рассчитаем...") double fee = 0; bool feeCalculated = false; @@ -312,10 +317,20 @@ void PayByCardScript::makePayment( } // 8. Нажимаем "Перевести" (или "Перевести X ₽") - xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); - Node transferBtn2 = xmlScreenParser.findButtonNode("Перевести", true); - if (transferBtn2.isEmpty()) { - m_error = "Кнопка 'Перевести' не найдена на экране ввода суммы"; + // Ретраим, пока bounds кнопки не будут ненулевыми — клавиатура могла всплыть + // заново (напр. если расчёт комиссии сфокусировал поле суммы). + Node transferBtn2; + for (int attempt = 0; attempt < 5; ++attempt) { + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + transferBtn2 = xmlScreenParser.findButtonNode("Перевести", true); + if (!transferBtn2.isEmpty() && transferBtn2.height() > 0) break; + qDebug() << "[PayByCard] Waiting for tappable 'Перевести', attempt" << attempt + 1 << "/ 5" + << "(bounds collapsed — клавиатура ещё видна?)"; + AdbUtils::hideKeyboard(deviceId); + QThread::msleep(1000); + } + if (transferBtn2.isEmpty() || transferBtn2.height() == 0) { + m_error = "Кнопка 'Перевести' не найдена или перекрыта клавиатурой"; qWarning() << "[PayByCard]" << m_error; return; }