From cd1828e2b5b8a88e6051671c220dc8354e0e40b1 Mon Sep 17 00:00:00 2001 From: slava Date: Fri, 24 Apr 2026 22:22:24 +0700 Subject: [PATCH] Optimize button verification in payment scripts: - Refactor retry logic for visibility and tappability of key payment buttons. - Enhance error messaging for obstructed or missing buttons. --- android/ozon/PayByPhoneScript.cpp | 39 +++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/android/ozon/PayByPhoneScript.cpp b/android/ozon/PayByPhoneScript.cpp index fed3c9f..a2175a1 100644 --- a/android/ozon/PayByPhoneScript.cpp +++ b/android/ozon/PayByPhoneScript.cpp @@ -311,20 +311,39 @@ void PayByPhoneScript::makePayment( Node bankInput = xmlScreenParser.findFirstEditText(); if (!bankInput.isEmpty()) { qDebug() << "[PayByPhone] Bank search screen detected, entering bank name..."; - AdbUtils::makeTap(deviceId, bankInput.x(), bankInput.y()); - QThread::msleep(500); - // Ввод кириллицы через ADB Keyboard + // Переключаем IME ДО тапа по полю — иначе смена IME после тапа + // закроет системную клавиатуру и WebView резайзится, из-за чего + // сохранённые координаты bankInput уезжают и повторный тап мимо. if (!AdbUtils::enableAdbIMEKeyboard(deviceId)) { m_error = "Не удалось активировать ADB Keyboard (см. логи 'ime list -s' / default_input_method)"; qWarning() << "[PayByPhone]" << m_error; return; } - QThread::msleep(500); + QThread::msleep(800); + + // Перечитываем XML — layout с ADBKeyboard (без UI) отличается от layout + // с системной клавиатурой. Берём актуальные bounds поля. + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + Node freshBankInput = xmlScreenParser.findFirstEditText(); + if (!freshBankInput.isEmpty()) bankInput = freshBankInput; + AdbUtils::makeTap(deviceId, bankInput.x(), bankInput.y()); QThread::msleep(500); AdbUtils::inputAdbIMEText(deviceId, m_bankName); - QThread::msleep(2000); + QThread::msleep(2500); + + // Верифицируем, что текст действительно попал в поле + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + Node verifyInput = xmlScreenParser.findFirstEditText(); + if (verifyInput.text.isEmpty()) { + qWarning() << "[PayByPhone] Поле банка пустое после inputAdbIMEText — ретраим"; + AdbUtils::makeTap(deviceId, bankInput.x(), bankInput.y()); + QThread::msleep(500); + AdbUtils::inputAdbIMEText(deviceId, m_bankName); + QThread::msleep(2500); + } + AdbUtils::disableAdbIMEKeyboard(deviceId); qDebug() << "[PayByPhone] Entered bank name via ADB IME:" << m_bankName; QThread::msleep(2000); @@ -333,6 +352,16 @@ void PayByPhoneScript::makePayment( bool bankFound = false; for (int ba = 0; ba < 10; ++ba) { xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + + // Сначала проверяем, что поле поиска реально содержит введённый текст — + // иначе мы тапаем по первому попавшемуся банку из несфильтрованного списка. + Node searchField = xmlScreenParser.findFirstEditText(); + if (searchField.text.trimmed().isEmpty()) { + qDebug() << "[PayByPhone] Search field still empty, waiting for filter, attempt" << ba + 1 << "/ 10"; + QThread::msleep(1500); + continue; + } + for (const Node &node : xmlScreenParser.findAllNodes()) { if (node.className == "android.widget.Button" && !node.contentDesc.isEmpty()