153 lines
5.4 KiB
C++
153 lines
5.4 KiB
C++
//
|
||
// Created by AmirS on 25.04.2025.
|
||
//
|
||
|
||
#include "XmlParser.h"
|
||
#include <QFile>
|
||
#include <QXmlStreamReader>
|
||
#include <QDebug>
|
||
|
||
XmlParser::XmlParser(QObject *parent) : QObject(parent) {
|
||
}
|
||
|
||
QList<UiElement> XmlParser::parseUiDumpUsingQXml(const QString &filepath) {
|
||
QFile file(filepath);
|
||
QList<UiElement> elements;
|
||
if (!file.open(QIODevice::ReadOnly)) {
|
||
qDebug() << "Не удалось открыть XML файл:" << filepath;
|
||
return elements;
|
||
}
|
||
|
||
QXmlStreamReader xmlReader(&file);
|
||
|
||
while (!xmlReader.atEnd()) {
|
||
xmlReader.readNext();
|
||
|
||
if (xmlReader.hasError()) {
|
||
qDebug() << "Ошибка парсинга XML в линии" << xmlReader.lineNumber() << ":"
|
||
<< xmlReader.errorString();
|
||
qCritical() << "Ошибка парсинга XML: " << xmlReader.errorString()
|
||
<< ", далее вернем пустой элемент";
|
||
return {}; // Возвращаем пустоту в случае ошибки
|
||
}
|
||
|
||
// Проверка на начало элемента
|
||
if (xmlReader.isStartElement()) {
|
||
if (xmlReader.name() == "node") {
|
||
// Создаем элемент из текущего узла
|
||
UiElement element = UiElement::fromXmlNode(xmlReader);
|
||
elements.append(element);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (xmlReader.hasError()) {
|
||
qWarning() << "Ошибка парсинга XML в конце:" << xmlReader.errorString();
|
||
qDebug() << "Ошибка парсинга XML в конце:" << xmlReader.errorString();
|
||
}
|
||
|
||
return elements;
|
||
}
|
||
|
||
bool XmlParser::isSecurityBanner(const QList<UiElement>& elements) {
|
||
bool found = false;
|
||
|
||
// Проверка на текст "Мы заботимся о вашей безопасности"
|
||
for (const UiElement& el : elements) {
|
||
if (el.text() == "Мы заботимся о вашей безопасности" && !el.text().isEmpty()) {
|
||
found = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Если не нашли текст, ищем кнопку "Отложить"
|
||
if (!found) {
|
||
for (const UiElement& el : elements) {
|
||
if (el.text() == "Отложить" && el.isClickable() && el.className() == "android.widget.Button") {
|
||
found = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return found;
|
||
}
|
||
|
||
bool XmlParser::isPinCodeScreen(const QList<UiElement> &elements) {
|
||
for (const UiElement &element: elements) {
|
||
// Проверка на наличие текста для ввода PIN
|
||
if (element.text().contains("Введите ПИН")) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool XmlParser::isBannerOrDialog(const QList<UiElement> &elements) {
|
||
bool found = false;
|
||
|
||
// 1. Проверка на наличие кнопок "Позже" и "Закрыть"
|
||
for (const UiElement &element: elements) {
|
||
// Проверка, что кнопка кликабельна и имеет текст "Позже" или "Закрыть"
|
||
if (element.isClickable()) {
|
||
if ((element.text() == "Позже" || element.text() == "Закрыть") &&
|
||
element.className() == "android.widget.Button") {
|
||
found = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 2. Если не нашли "Позже" или "Закрыть", ищем кнопку без текста в правой верхней части экрана
|
||
if (!found) {
|
||
for (const UiElement &element: elements) {
|
||
if (element.isClickable() && element.className() == "android.widget.Button" &&
|
||
element.text().isEmpty()) {
|
||
// Проверка, что кнопка в правой верхней части экрана
|
||
// ~ Координаты в правом верхнем углу
|
||
if (element.x1() > 800 && element.y1() < 200) {
|
||
found = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return found;
|
||
}
|
||
|
||
bool XmlParser::isMainScreen(const QList<UiElement> &elements) {
|
||
for (const UiElement &element: elements) {
|
||
// Проверка на кликабельную кнопку "Все продукты"
|
||
if (element.text().contains("Все продукты") && element.isClickable()) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool XmlParser::isDetailCardScreen(const QList<UiElement> &elements) {
|
||
bool isDetailCardScreen = false;
|
||
|
||
// 1. Проверка на текст "Мои продукты"
|
||
for (const UiElement &el: elements) {
|
||
if (el.text().contains("Мои продукты") && !el.text().isEmpty()) {
|
||
isDetailCardScreen = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 2. Если не нашли "Мои продукты", проверяем наличие кликабельной кнопки "Оплатить"
|
||
if (!isDetailCardScreen) {
|
||
for (const UiElement &el: elements) {
|
||
if (el.text() == "Оплатить" && el.isClickable() && el.className() == "android.widget.Button") {
|
||
// Кнопка "Оплатить" найдена и кликабельна
|
||
isDetailCardScreen = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return isDetailCardScreen;
|
||
}
|