From 061baeb4df2df444684ebf2e539ac4cbd7107dc0 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Sun, 5 May 2019 15:05:39 +0300 Subject: [PATCH] =?UTF-8?q?#Studio=5F=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=D0=9E=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=D0=92=D0=B5=D0=B7=D0=B4=D0=B5=20#Studio=5F=D0=98=D1=81?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=9E?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=D0=9F=D0=B5=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=B0=D0=BD=D0=B8=D1=8F=D0=A3=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=BD=D0=B5=D0=B9=D0=92=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20#Robot=5F=D0=A1=D0=BF=D0=B5=D1=86?= =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0GetProper?= =?UTF-8?q?ties=20#Robot=5FSelector=5F=D0=A4=D0=B8=D0=BB=D1=8C=D1=82=D1=80?= =?UTF-8?q?=D0=9F=D0=BEFriendlyClass=5FName=5FControlType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Robot/Index.xhtml | 115 +++++++++++++++++++++++++++++++++++++--------- Robot/winGUI.py | 32 ++++++++++++- 2 files changed, 124 insertions(+), 23 deletions(-) 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 '+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 '+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':[]}