From d480cc51b0576c8c5ae43205b02cd2eb08fa2438 Mon Sep 17 00:00:00 2001 From: slava Date: Fri, 24 Apr 2026 16:09:36 +0700 Subject: [PATCH] Enhance input field detection and retry logic across payment scripts: - Add retry loops for input fields in `PayByPhoneScript` and `PayByCardScript` to improve reliability. - Update window title in `MainWindow` with version info from `config.ini`. --- android/dushanbe/PayByCardScript.cpp | 10 ++++++++-- android/dushanbe/PayByPhoneScript.cpp | 10 ++++++++-- android/ozon/PayByCardScript.cpp | 22 +++++++++++++++++++--- android/ozon/PayByPhoneScript.cpp | 20 ++++++++++++++++++-- views/MainWindow.cpp | 5 ++++- 5 files changed, 57 insertions(+), 10 deletions(-) diff --git a/android/dushanbe/PayByCardScript.cpp b/android/dushanbe/PayByCardScript.cpp index ecf0deb..994e4cd 100644 --- a/android/dushanbe/PayByCardScript.cpp +++ b/android/dushanbe/PayByCardScript.cpp @@ -230,8 +230,14 @@ void PayByCardScript::makePayment( QThread::msleep(1000); // 6. Вводим сумму в поле "Сумма" (hint содержит "Сумма") - xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); - Node sumEditText = xmlScreenParser.findEditTextByHint(QString::fromUtf8("Сумма")); + Node sumEditText; + for (int attempt = 0; attempt < 10; ++attempt) { + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + sumEditText = xmlScreenParser.findEditTextByHint(QString::fromUtf8("Сумма")); + if (!sumEditText.isEmpty()) break; + qDebug() << "[Dushanbe::PayByCard] Waiting for sum input, attempt" << attempt + 1 << "/ 10"; + QThread::msleep(1500); + } if (sumEditText.isEmpty()) { m_error = "Sum input field not found"; qWarning() << "[Dushanbe::PayByCard]" << m_error; diff --git a/android/dushanbe/PayByPhoneScript.cpp b/android/dushanbe/PayByPhoneScript.cpp index d1c2590..e1a003e 100644 --- a/android/dushanbe/PayByPhoneScript.cpp +++ b/android/dushanbe/PayByPhoneScript.cpp @@ -231,8 +231,14 @@ void PayByPhoneScript::makePayment( QThread::msleep(1000); // 6. Вводим сумму в поле "Сумма" - xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); - Node sumEditText = xmlScreenParser.findEditTextByHint(QString::fromUtf8("Сумма")); + Node sumEditText; + for (int attempt = 0; attempt < 10; ++attempt) { + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + sumEditText = xmlScreenParser.findEditTextByHint(QString::fromUtf8("Сумма")); + if (!sumEditText.isEmpty()) break; + qDebug() << "[Dushanbe::PayByPhone] Waiting for sum input, attempt" << attempt + 1 << "/ 10"; + QThread::msleep(1500); + } if (sumEditText.isEmpty()) { m_error = "Sum input field not found"; qWarning() << "[Dushanbe::PayByPhone]" << m_error; diff --git a/android/ozon/PayByCardScript.cpp b/android/ozon/PayByCardScript.cpp index 6b52426..121778e 100644 --- a/android/ozon/PayByCardScript.cpp +++ b/android/ozon/PayByCardScript.cpp @@ -223,7 +223,16 @@ void PayByCardScript::makePayment( qDebug() << "[PayByCard] Card payment screen loaded successfully"; // 5. Вводим номер карты в поле "Номер карты получателя" - Node cardInput = xmlScreenParser.findEditTextByHint("Номер карты получателя"); + Node cardInput; + for (int attempt = 0; attempt < 10; ++attempt) { + if (!checkApp()) return; + cardInput = xmlScreenParser.findEditTextByHint("Номер карты получателя"); + if (!cardInput.isEmpty()) break; + qDebug() << "[PayByCard] Waiting for 'Номер карты получателя' input, attempt" << attempt + 1 << "/ 10"; + QThread::msleep(1500); + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + } + if (cardInput.isEmpty()) { m_error = "Поле 'Номер карты получателя' не найдено"; qWarning() << "[PayByCard]" << m_error; @@ -236,9 +245,16 @@ void PayByCardScript::makePayment( QThread::msleep(2000); // 6. Ждём распознавания карты и вводим сумму - xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + Node sumInput; + for (int attempt = 0; attempt < 10; ++attempt) { + if (!checkApp()) return; + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + sumInput = xmlScreenParser.findEditTextByHint("Сумма от"); + if (!sumInput.isEmpty()) break; + qDebug() << "[PayByCard] Waiting for 'Сумма от' input, attempt" << attempt + 1 << "/ 10"; + QThread::msleep(1500); + } - Node sumInput = xmlScreenParser.findEditTextByHint("Сумма от"); if (sumInput.isEmpty()) { m_error = "Поле ввода суммы не найдено"; qWarning() << "[PayByCard]" << m_error; diff --git a/android/ozon/PayByPhoneScript.cpp b/android/ozon/PayByPhoneScript.cpp index a0c00cf..01c45ee 100644 --- a/android/ozon/PayByPhoneScript.cpp +++ b/android/ozon/PayByPhoneScript.cpp @@ -367,7 +367,15 @@ void PayByPhoneScript::makePayment( } // 7. Вводим сумму - Node sumInput = xmlScreenParser.findFirstEditText(); + Node sumInput; + for (int attempt = 0; attempt < 10; ++attempt) { + if (!checkApp()) return; + sumInput = xmlScreenParser.findFirstEditText(); + if (!sumInput.isEmpty()) break; + qDebug() << "[PayByPhone] Waiting for sum input field, attempt" << attempt + 1 << "/ 10"; + QThread::msleep(1500); + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + } if (sumInput.isEmpty()) { m_error = "Поле ввода суммы не найдено"; qWarning() << "[PayByPhone]" << m_error; @@ -412,7 +420,15 @@ void PayByPhoneScript::makePayment( } // 8. Нажимаем "Перевести ..." (ищем по первому слову) - Node transferConfirmBtn = xmlScreenParser.findButtonNode("Перевести", true); + Node transferConfirmBtn; + for (int attempt = 0; attempt < 10; ++attempt) { + if (!checkApp()) return; + transferConfirmBtn = xmlScreenParser.findButtonNode("Перевести", true); + if (!transferConfirmBtn.isEmpty()) break; + qDebug() << "[PayByPhone] Waiting for 'Перевести ...' button, attempt" << attempt + 1 << "/ 10"; + QThread::msleep(1500); + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); + } if (transferConfirmBtn.isEmpty()) { m_error = "Кнопка 'Перевести ...' не найдена на экране подтверждения"; qWarning() << "[PayByPhone]" << m_error; diff --git a/views/MainWindow.cpp b/views/MainWindow.cpp index 1a37a53..b9526f4 100644 --- a/views/MainWindow.cpp +++ b/views/MainWindow.cpp @@ -26,10 +26,13 @@ #include "dao/SettingsDAO.h" #include #include +#include #include "widget/common/FlowLayout.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { - setWindowTitle("ARC"); + const QSettings settings("config.ini", QSettings::IniFormat); + const QString version = settings.value("common/version").toString(); + setWindowTitle(version.isEmpty() ? "ARC" : QString("ARC v%1").arg(version)); // Инициализируем таймер обновления timer = new QTimer(this);