1
0
forked from BRT/arc

Add logic to refresh balance on the home screen:

- Introduce `findRefreshButtonOnHomeScreen` in `ScreenXmlParser` for locating the refresh button.
- Update `GetProfileInfoScript` to tap refresh button and retry balance parsing when balance is zero.
- Extend mock server profiles with additional test data.
This commit is contained in:
slava 2026-04-29 22:02:53 +07:00
parent f19137280e
commit 6de3751a60
4 changed files with 73 additions and 4 deletions

View File

@ -50,12 +50,30 @@ void GetProfileInfoScript::doStart() {
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
}
// Парсим баланс с домашнего экрана
const double parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen();
// Парсим баланс с домашнего экрана. Если баланс не подгрузился (==0),
// тапаем кнопку обновления и перечитываем дамп. Лоадера у refresh нет,
// поэтому ждём фиксированно.
double parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen();
qDebug() << "[Dushanbe::GetProfileInfo] Parsed balance:" << parsedBalance;
if (parsedBalance > 0.0) {
BankProfileDAO::updateAmount(app.id, parsedBalance);
if (parsedBalance <= 0.0) {
Node refreshBtn = xmlScreenParser.findRefreshButtonOnHomeScreen();
if (refreshBtn.x() > 0) {
qDebug() << "[Dushanbe::GetProfileInfo] Balance is 0, tapping refresh and retrying";
AdbUtils::makeTap(m_deviceId, refreshBtn.x(), refreshBtn.y());
QThread::msleep(3000);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen();
qDebug() << "[Dushanbe::GetProfileInfo] Parsed balance after refresh:" << parsedBalance;
}
if (parsedBalance <= 0.0) {
m_error = "Balance is zero after refresh: " + m_deviceId + " " + m_appCode;
qWarning() << m_error;
AdbUtils::tryToKillApplication(m_deviceId, app.package);
emit finishedWithResult(m_error);
return;
}
}
BankProfileDAO::updateAmount(app.id, parsedBalance);
// Тапаем по кнопке меню (гамбургер, левый верхний угол)
// Это первый clickable ImageView в верхней панели

View File

@ -212,6 +212,33 @@ QString ScreenXmlParser::parseUserNameFromHomeScreen() {
return {};
}
Node ScreenXmlParser::findRefreshButtonOnHomeScreen() {
// В блоке content-desc="TJS\n<дата>" три clickable дочерних элемента:
// View с балансом, Button (глазик) и ImageView (рефреш). Тапать нужно
// именно ImageView — он правее глазика и единственный ImageView внутри
// bounds parent'а.
Node parent;
for (const Node &node : m_nodes) {
if (node.contentDesc.startsWith("TJS") && node.contentDesc.contains('\n')) {
parent = node;
break;
}
}
if (parent.x1() < 0) return {};
Node best;
for (const Node &node : m_nodes) {
if (!node.clickable) continue;
if (node.className != "android.widget.ImageView") continue;
if (node.x1() < parent.x1() || node.x2() > parent.x2()) continue;
if (node.y1() < parent.y1() || node.y2() > parent.y2()) continue;
if (best.x1() < 0 || node.x1() > best.x1()) {
best = node;
}
}
return best;
}
bool ScreenXmlParser::isSideMenu() {
bool hasVyhod = false;
bool hasIdentified = false;

View File

@ -39,6 +39,10 @@ public:
// Парсит баланс с домашнего экрана
double parseBalanceFromHomeScreen();
// Находит кнопку обновления данных в блоке "TJS\n<дата>" — правый clickable
// ImageView (рядом слева сидит глазик-Button, его не трогаем).
Node findRefreshButtonOnHomeScreen();
// Парсит имя пользователя с домашнего экрана
QString parseUserNameFromHomeScreen();

View File

@ -1,5 +1,25 @@
{
"bank_profiles": [
{
"id": "047fd3d6-f2a2-40e0-9a39-1d11422e8832",
"bank_name": "dushanbe_city_bank",
"state": "enabled",
"phone_number": "+992185555519",
"first_name": "Мехрубон",
"middle_name": null,
"last_name": "Имомкулзода",
"currency": 972,
"device_id": "986cb259-dfec-4421-8735-4fb126cd1917",
"device_label": "Pixel 7",
"materials": [
{
"id": "83606831-7688-42cf-b2d7-2034e04f68f2",
"state": "enabled",
"card_number": "9762000207113258",
"currency": 972
}
]
},
{
"id": "21aa26c8-ea89-45ea-a283-ee6d55ead82b",
"bank_name": "ozon",