1
0
forked from BRT/arc
arc/automation_script/XmlParser.cpp
2025-04-27 18:35:22 +04:00

153 lines
5.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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;
}