diff --git a/Robot/Index.xhtml b/Robot/Index.xhtml
index 83ce655a..b30172ba 100644
--- a/Robot/Index.xhtml
+++ b/Robot/Index.xhtml
@@ -12,6 +12,7 @@
var mGlobal={}
$(document)
.ready(function() {
+
mGlobal.GUIElement={}
mGlobal.GenerateUniqueID=function(inPrefix="ID") {
return inPrefix+Math.round(Math.random()*1000)+"-"+Math.round(Math.random()*10000)+"-"+Math.round(Math.random()*1000)
@@ -31,6 +32,39 @@
document.execCommand('copy');
document.body.removeChild(el);
};
+
+ ///Функция клонирования объекта
+ mGlobal.iSysClone=function(obj,lIsCloneSubProperty,lSubItemCallback) {
+ ///Выполнить инициализацию переменной, если она не была передана
+ if (typeof(lIsCloneSubProperty)=="undefined") {
+ lIsCloneSubProperty=true;
+ }
+ ///Вернуть значение, если передан простой тип данных
+ if (null == obj || "object" != typeof obj) return obj;
+ ///Выполнить инициализацию новой переменной
+ var copy = obj.constructor();
+ ///Циклический обход по всем свойствам объекта
+ for (var attr in obj) {
+ ///Исключить присваивание тех свойств, которые унаследованы от прототипа
+ if (obj.hasOwnProperty(attr)) {
+ ///Проверить, является ли вложенное свойство объектом
+ if (typeof(obj[attr])=="object" && lIsCloneSubProperty) {
+ ///Рекурсивный вызов клонирования дочернего элемента
+ copy[attr] = mGlobal.iSysClone(obj[attr],lIsCloneSubProperty);
+ } else {
+ ///Клонируемое свойство не является объектом - выполнить копирование
+ copy[attr] = obj[attr];
+ }
+ ///Вызов callback функции в которую передается текущий атрибут
+ if (typeof(lSubItemCallback)!="undefined") {
+ lSubItemCallback(copy[attr]);
+ }
+ }
+ }
+ ///Вернуть результат функции клонирования
+ return copy;
+ }
+
///Функция запуска поиска по окну
mGlobal.Actions.fAutomationSearchMouseElementHierarchyRun= function(inElementId)
{
@@ -69,6 +103,9 @@
mGlobal.ElementTree.fClear();
///Прогрузить новое дерево
mGlobal.ElementTree.fRender(lStructureToRender);
+ if (lResponseJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lResponseJSON.Error);
+ }
},
dataType: "text"
});
@@ -193,6 +230,10 @@
}
lHTMLTree+=''
$("#"+inElementId+" .content").append(lHTMLTree)
+ ///Отображение ошибки
+ if (lResponseJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lResponseJSON.Error);
+ }
},
dataType: "text"
});
@@ -221,9 +262,10 @@
$(".rpa-object-tree .item").css("background-color","");
$("#"+inElementId).css("background-color","RGB(128,128,128)");
///Создать урезанную версию селектора
- lTextAreaSpecificationArray=Array.from(lSpecificationArray);
+ lTextAreaSpecificationArray=mGlobal.iSysClone(lSpecificationArray,true);
for (var i = 0; i< lTextAreaSpecificationArray.length; i++) {
- Object.assign(lTextAreaSpecificationArray[i],lTextAreaSpecificationArray[i]);
+ //lTextAreaSpecificationArray[i]=mGlobal.iSysClone(lTextAreaSpecificationArray[i],true)
+ //Object.assign(lTextAreaSpecificationArray[i],lTextAreaSpecificationArray[i]);
///Очистить ненужные ключи для выборки
delete lTextAreaSpecificationArray[i]['rich_text']
delete lTextAreaSpecificationArray[i]['process_id']
@@ -253,21 +295,26 @@
function(lData,l2,l3)
{
var lHTMLList='
'
- var lJSONData = JSON.parse(lData).outputObject
- var lSpecificationArray=Object.keys(lJSONData)
- for (i=0;i
\
- \
-
'+lItemKey+': '+JSON.stringify(lItemValue)+'
\
-
\
- '
- }
- lHTMLList+=''
- $(".rpa-property-list").html(lHTMLList)
-
+ var lResponseJSON = JSON.parse(lData)
+ ///Ошибка
+ if (lResponseJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lResponseJSON.Error);
+ } else {
+ var lJSONData = JSON.parse(lData).outputObject
+ var lSpecificationArray=Object.keys(lJSONData)
+ for (i=0;i\
+ \
+
'+lItemKey+': '+JSON.stringify(lItemValue)+'
\
+
\
+ '
+ }
+ lHTMLList+=''
+ $(".rpa-property-list").html(lHTMLList)
+ }
},
dataType: "text"
});
@@ -282,6 +329,11 @@
function(lData,l2,l3)
{
console.log('Success handle:'+inHandleId)
+ var lResponseJSON = JSON.parse(lData)
+ ///Ошибка
+ if (lResponseJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lResponseJSON.Error);
+ }
},
dataType: "text"
});
@@ -298,6 +350,7 @@
function(lData,l2,l3)
{
lDataJSON=JSON.parse(lData);
+ ///Показать ошибку, если таковая возникла
if (lDataJSON.hasOwnProperty("Error")) {
mGlobal.ShowModal("GUI Error",lDataJSON.Error);
}
@@ -364,7 +417,7 @@
function(lData,l2,l3)
{
//lDataJSON=JSON.parse(lData.outputObject);
- lDataJSON=JSON.parse(lData)
+ var lDataJSON=JSON.parse(lData)
var lDataKeyList=lDataJSON.outputObject
var lValueList=[]
for (var i = 0; i< lDataKeyList.length;i++) {
@@ -378,6 +431,10 @@
values: lValueList
})
;
+ ///Показать ошибку, если таковая возникла
+ if (lDataJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lDataJSON.Error);
+ }
},
dataType: "text"
});
@@ -408,6 +465,10 @@
values: lValueList
})
;
+ ///Показать ошибку, если таковая возникла
+ if (lDataJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lDataJSON.Error);
+ }
},
dataType: "text"
});
@@ -461,9 +522,12 @@
success:
function(lData,l2,l3)
{
- lDataJSON=JSON.parse(lData)
+ var lDataJSON=JSON.parse(lData)
$(".gui-code-list-run-result").html(lDataJSON.outputObject)
-
+ ///Показать ошибку, если таковая возникла
+ if (lDataJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lDataJSON.Error);
+ }
},
dataType: "text"
});
@@ -502,9 +566,12 @@
success:
function(lData,l2,l3)
{
- lDataJSON=JSON.parse(lData)
+ var lDataJSON=JSON.parse(lData)
$(".gui-result").html(lDataJSON.outputObject)
-
+ ///Показать ошибку, если таковая возникла
+ if (lDataJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lDataJSON.Error);
+ }
},
dataType: "text"
});
@@ -545,6 +612,10 @@
mGlobal.ElementTree.fClear();
///Прогрузить новое дерево
mGlobal.ElementTree.fRender(lResponseJSON.outputObject);
+ ///Показать ошибку, если таковая возникла
+ if (lResponseJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lResponseJSON.Error);
+ }
},
dataType: "text"
});
diff --git a/Robot/winGUI.py b/Robot/winGUI.py
index c7b67a1a..4106acbe 100644
--- a/Robot/winGUI.py
+++ b/Robot/winGUI.py
@@ -259,6 +259,14 @@ def PywinautoExtElementsGet (inSpecificationList,inElement=None):
if 'class_name' in inSpecificationList[0]:
if lChildrenItem.element_info.class_name != inSpecificationList[0]["class_name"]:
lFlagAddChild=False
+ #Фильтрация по friendly_class_name
+ if 'friendly_class_name' in inSpecificationList[0]:
+ if lChildrenItem.friendly_class_name() != inSpecificationList[0]["friendly_class_name"]:
+ lFlagAddChild=False
+ #Фильтрация по control_type
+ if 'control_type' in inSpecificationList[0]:
+ if lChildrenItem.element_info.control_type != inSpecificationList[0]["control_type"]:
+ lFlagAddChild=False
#####
#Все проверки пройдены - флаг добавления
if lFlagAddChild:
@@ -459,7 +467,23 @@ def ElementRunAction(inControlSpecificationArray,inActionName,inArgumentList=[],
#Получить метод для вызова
lFunction = getattr(lObject, inActionName)
#Выполнить действие
- return lFunction(*inArgumentList,**inkwArgumentObject)
+ #Обернуто в безопасную обработку, тк для некоторых объектов метод не работает и может выдавать ошибку типа: NotImplementedError: This method not work properly for WinForms DataGrid, use cells()
+ try:
+ return lFunction(*inArgumentList,**inkwArgumentObject)
+ except Exception as e:
+ #Если ошибка возникла на action get_properties
+ if inActionName=="get_properties":
+ lResult={}
+ #Ручное формирование
+ lResult["class_name"]=lObject.class_name()
+ lResult["friendly_class_name"]=lObject.friendly_class_name()
+ lResult["texts"]=lObject.texts()
+ lResult["control_id"]=lObject.control_id()
+ lResult["control_count"]=lObject.control_count()
+ lResult["automation_id"]=lObject.automation_id()
+ return lResult
+ else:
+ raise e
def ElementGetInfo(inControlSpecificationArray):
#Подготовка входного массива
@@ -1100,6 +1124,12 @@ lText = "Bitness:" + str(struct.calcsize("P") * 8)
buffer = ""
lJSONInputString=""
+
+#Алгоритм включения debug режима (если передано ключевое слово debug как параметр)
+#Если есть хотя бы один параметр (sys.argv[1+])
+if len(sys.argv) > 1:
+ if sys.argv[1] == "debug":
+ mFlagIsDebug=True
#Выполнить чтение буфера, если не отладка библиотеки
if not mFlagIsDebug:
#{'functionName':'', 'argsArray':[]}