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:
parent
a92610f9e5
commit
cd1828e2b5
@ -311,20 +311,39 @@ void PayByPhoneScript::makePayment(
|
|||||||
Node bankInput = xmlScreenParser.findFirstEditText();
|
Node bankInput = xmlScreenParser.findFirstEditText();
|
||||||
if (!bankInput.isEmpty()) {
|
if (!bankInput.isEmpty()) {
|
||||||
qDebug() << "[PayByPhone] Bank search screen detected, entering bank name...";
|
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)) {
|
if (!AdbUtils::enableAdbIMEKeyboard(deviceId)) {
|
||||||
m_error = "Не удалось активировать ADB Keyboard (см. логи 'ime list -s' / default_input_method)";
|
m_error = "Не удалось активировать ADB Keyboard (см. логи 'ime list -s' / default_input_method)";
|
||||||
qWarning() << "[PayByPhone]" << m_error;
|
qWarning() << "[PayByPhone]" << m_error;
|
||||||
return;
|
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());
|
AdbUtils::makeTap(deviceId, bankInput.x(), bankInput.y());
|
||||||
QThread::msleep(500);
|
QThread::msleep(500);
|
||||||
AdbUtils::inputAdbIMEText(deviceId, m_bankName);
|
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);
|
AdbUtils::disableAdbIMEKeyboard(deviceId);
|
||||||
qDebug() << "[PayByPhone] Entered bank name via ADB IME:" << m_bankName;
|
qDebug() << "[PayByPhone] Entered bank name via ADB IME:" << m_bankName;
|
||||||
QThread::msleep(2000);
|
QThread::msleep(2000);
|
||||||
@ -333,6 +352,16 @@ void PayByPhoneScript::makePayment(
|
|||||||
bool bankFound = false;
|
bool bankFound = false;
|
||||||
for (int ba = 0; ba < 10; ++ba) {
|
for (int ba = 0; ba < 10; ++ba) {
|
||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
|
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()) {
|
for (const Node &node : xmlScreenParser.findAllNodes()) {
|
||||||
if (node.className == "android.widget.Button"
|
if (node.className == "android.widget.Button"
|
||||||
&& !node.contentDesc.isEmpty()
|
&& !node.contentDesc.isEmpty()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user