1
0
forked from BRT/arc

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`.
This commit is contained in:
slava 2026-04-24 16:09:36 +07:00
parent 8c2be04787
commit d480cc51b0
5 changed files with 57 additions and 10 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -26,10 +26,13 @@
#include "dao/SettingsDAO.h"
#include <QTimer>
#include <QCoreApplication>
#include <QSettings>
#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);