1
0
forked from BRT/arc

Improve "Other Bank" button handling in PayByPhoneScript by ensuring full visibility with enhanced bounds checks and increased scroll attempts.

This commit is contained in:
slava 2026-05-14 19:33:44 +07:00
parent 7e5f90a450
commit a8d41baab7

View File

@ -298,23 +298,33 @@ void PayByPhoneScript::makePayment(
if (!bankSelected) {
// Вариант 1: кнопка "Другой банк" (content-desc="other-bank-item", text пустой).
// На устройствах с маленьким экраном кнопка лежит в конце виртуализированного
// списка банков и приходит с bounds=[0,0][0,0] — Node::isEmpty это не отлавливает
// (требует все координаты < 0), и тап уходит в (0,0). Скроллим список вниз,
// пока bounds не станут реальными, и только тогда тапаем.
// списка банков. Возможные состояния:
// - bounds=[0,0][0,0] — ниже видимой области, ещё не материализована
// - bounds=[..,h-20][..,h] — материализована, но обрезана нижним краем экрана
// Node::isEmpty это не ловит, и тап по обрезанному элементу промахивается.
// Скроллим список вниз, пока кнопка не окажется ПОЛНОСТЬЮ в видимой зоне.
auto findOtherBank = [&]() -> Node {
for (const Node &n : xmlScreenParser.findAllNodes()) {
if (n.contentDesc.contains("other-bank-item")) return n;
}
return {};
};
auto isFullyVisible = [&](const Node &n) {
return !n.isEmpty()
&& n.width() > 0
&& n.height() >= 80
&& n.y1() >= 0
&& n.y2() <= height - 40;
};
bool foundOtherBank = false;
Node node = findOtherBank();
for (int scrollAttempt = 0;
!node.isEmpty() && (node.width() == 0 || node.height() == 0) && scrollAttempt < 6;
!isFullyVisible(node) && scrollAttempt < 8;
++scrollAttempt) {
qDebug() << "[PayByPhone] 'Другой банк' has collapsed bounds, scrolling list down, attempt"
<< scrollAttempt + 1 << "/ 6";
qDebug() << "[PayByPhone] 'Другой банк' not fully visible (bounds="
<< node.x1() << "," << node.y1() << "-" << node.x2() << "," << node.y2()
<< "), scrolling list down, attempt" << scrollAttempt + 1 << "/ 8";
AdbUtils::makeSwipe(deviceId, width / 2, height * 3 / 4, width / 2, height / 4);
QThread::msleep(800);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter));
@ -322,7 +332,7 @@ void PayByPhoneScript::makePayment(
node = findOtherBank();
}
if (!node.isEmpty() && node.width() > 0 && node.height() > 0) {
if (isFullyVisible(node)) {
qDebug() << "[PayByPhone] Tapping 'Другой банк' (other-bank-item) at"
<< node.x() << "," << node.y();
AdbUtils::makeTap(deviceId, node.x(), node.y());