1
0
forked from BRT/arc

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.
This commit is contained in:
slava 2026-04-24 22:22:24 +07:00
parent a92610f9e5
commit cd1828e2b5

View File

@ -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()