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:
parent
f19137280e
commit
6de3751a60
@ -50,12 +50,30 @@ void GetProfileInfoScript::doStart() {
|
|||||||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Парсим баланс с домашнего экрана
|
// Парсим баланс с домашнего экрана. Если баланс не подгрузился (==0),
|
||||||
const double parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen();
|
// тапаем кнопку обновления и перечитываем дамп. Лоадера у refresh нет,
|
||||||
|
// поэтому ждём фиксированно.
|
||||||
|
double parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen();
|
||||||
qDebug() << "[Dushanbe::GetProfileInfo] Parsed balance:" << parsedBalance;
|
qDebug() << "[Dushanbe::GetProfileInfo] Parsed balance:" << parsedBalance;
|
||||||
if (parsedBalance > 0.0) {
|
if (parsedBalance <= 0.0) {
|
||||||
BankProfileDAO::updateAmount(app.id, parsedBalance);
|
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 в верхней панели
|
// Это первый clickable ImageView в верхней панели
|
||||||
|
|||||||
@ -212,6 +212,33 @@ QString ScreenXmlParser::parseUserNameFromHomeScreen() {
|
|||||||
return {};
|
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 ScreenXmlParser::isSideMenu() {
|
||||||
bool hasVyhod = false;
|
bool hasVyhod = false;
|
||||||
bool hasIdentified = false;
|
bool hasIdentified = false;
|
||||||
|
|||||||
@ -39,6 +39,10 @@ public:
|
|||||||
// Парсит баланс с домашнего экрана
|
// Парсит баланс с домашнего экрана
|
||||||
double parseBalanceFromHomeScreen();
|
double parseBalanceFromHomeScreen();
|
||||||
|
|
||||||
|
// Находит кнопку обновления данных в блоке "TJS\n<дата>" — правый clickable
|
||||||
|
// ImageView (рядом слева сидит глазик-Button, его не трогаем).
|
||||||
|
Node findRefreshButtonOnHomeScreen();
|
||||||
|
|
||||||
// Парсит имя пользователя с домашнего экрана
|
// Парсит имя пользователя с домашнего экрана
|
||||||
QString parseUserNameFromHomeScreen();
|
QString parseUserNameFromHomeScreen();
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,25 @@
|
|||||||
{
|
{
|
||||||
"bank_profiles": [
|
"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",
|
"id": "21aa26c8-ea89-45ea-a283-ee6d55ead82b",
|
||||||
"bank_name": "ozon",
|
"bank_name": "ozon",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user