// // Created by AmirS on 25.04.2025. // #include "XmlParser.h" #include #include #include XmlParser::XmlParser(QObject *parent) : QObject(parent) { } QList XmlParser::parseUiDumpUsingQXml(const QString &filepath) { QFile file(filepath); QList 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& 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 &elements) { for (const UiElement &element: elements) { // Проверка на наличие текста для ввода PIN if (element.text().contains("Введите ПИН")) { return true; } } return false; } bool XmlParser::isBannerOrDialog(const QList &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 &elements) { for (const UiElement &element: elements) { // Проверка на кликабельную кнопку "Все продукты" if (element.text().contains("Все продукты") && element.isClickable()) { return true; } } return false; } bool XmlParser::isDetailCardScreen(const QList &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; }