diff --git a/Index.xhtml b/Index.xhtml index 8d6d1688..972832a4 100644 --- a/Index.xhtml +++ b/Index.xhtml @@ -301,6 +301,34 @@ dataType: "text" }); } + mGlobal.ElementValidateGUISelectorString =function (inGUISelector) { + //Подгрузка массива спецификаций + lSpecificationArray = inGUISelector + ///Загрузка данных + $.ajax({ + type: "POST", + url: 'GUIAction', + data: '{"functionName":"PywinautoExtElementsGetInfo","argsArray":['+lSpecificationArray+']}', + success: + function(lData,l2,l3) + { + lDataJSON=JSON.parse(lData); + if (Array.isArray(lDataJSON.outputObject)) { + lHTMLData="" + for (i=0;i' + } + $(".openrpa-validate-result").html(lHTMLData) + } + if (lDataJSON.hasOwnProperty("Error")) { + mGlobal.ShowModal("GUI Error",lDataJSON.Error); + } + }, + dataType: "text" + }); + } mGlobal.Test = function (inElementId) { //Подгрузка массива спецификаций lSpecificationArray = mGlobal.GUIElement[inElementId].GUISelectorFull @@ -375,6 +403,30 @@ ///Обновить визуализацию mGlobal.CodeList.fRender() + } + ///Добавить действие ожидания в список на исполнение + mGlobal.GUIActionWaitAddToList = function() { + var lActionElementSpecification = $('.rpa-gui-selector')[0].value + var lActionArgumentList = $('.rpa-argument-list')[0].value + if (lActionArgumentList=="") lActionArgumentList="[]" + ///Сформировать строку спецификации действия + lActionSpecificationObject = {"functionName":"PywinautoExtElementWaitAppear","argsArray":[JSON.parse(lActionElementSpecification)]} + lActionSpecificationString = '{"functionName":"PywinautoExtElementWaitAppear","argsArray":['+lActionElementSpecification+']}' + ///Добавить в массив действий + mGlobal.ActionSpecificationList.push(lActionSpecificationObject) + ///Обновить визуализацию + mGlobal.CodeList.fRender() + } + ///Добавить действие сон 2 секунды в список на исполнение + mGlobal.GUIActionSleep2sAddToList = function() { + ///Сформировать строку спецификации действия + lActionSpecificationObject = {"functionName":"GeneralSleep2s","argsArray":[]} + lActionSpecificationString = '{"functionName":"GeneralSleep2s","argsArray":[]}' + ///Добавить в массив действий + mGlobal.ActionSpecificationList.push(lActionSpecificationObject) + ///Обновить визуализацию + mGlobal.CodeList.fRender() + } ///Выполнить список действий mGlobal.GUICodeListRun = function () { @@ -608,6 +660,9 @@
Edit GUI selector
+ +
Validate Result
+
Select action
@@ -639,9 +694,10 @@
-
Code list run result
+
Additional actions
- + +
Code list
diff --git a/winGUI.py b/winGUI.py index 5ffaa8e9..1e40dc66 100644 --- a/winGUI.py +++ b/winGUI.py @@ -192,9 +192,9 @@ def PywinautoExtElementsGet (inSpecificationList,inElement=None): if inElement is None: #сформировать спецификацию на получение элемента lRootElementSpecification=[inSpecificationList[0]] - lChildrenList.append(GetControl(lRootElementSpecification)) - if lChildrenList[0] is not None: - lChildrenList[0] = lChildrenList[0].wrapper_object() + lRootElement=GetControl(lRootElementSpecification) + if lRootElement is not None: + lChildrenList.append(lRootElement.wrapper_object()) #Елемент на вход поступил - выполнить его анализ else: #Получить список элементов @@ -263,6 +263,15 @@ def PywinautoExtElementsGet (inSpecificationList,inElement=None): else: lResultList.extend(lChildrenList) return lResultList +#Получить список информационных объектов, который удовлетворяет условиям +def PywinautoExtElementsGetInfo (inSpecificationList,inElement=None): + #Получить родительский объект если на вход ничего не поступило + lResultList=PywinautoExtElementsGet(inSpecificationList,inElement) + lIterator = 0 + for lItem in lResultList: + lResultList[lIterator]=ElementInfoExportObject(lResultList[lIterator].element_info) + lIterator = lIterator + 1 + return lResultList #Получить элемент через расширенный движок поиска #[ { #"index":<Позиция элемента в родительском объекте>, @@ -275,6 +284,31 @@ def PywinautoExtElementGet (inSpecificationList,inElement=None): if len(lResultList)>0: lResult=lResultList[0] return lResult +#Проверить, существует ли объект +def PywinautoExtElementExist (inSpecificationList): + #pdb.set_trace() + return len(PywinautoExtElementsGet(inSpecificationList))>0 +#Ожидать появления элемента +def PywinautoExtElementWaitAppear(inSpecificationList,inTimeout=60): + lTimeoutSeconds = 0 + while (not PywinautoExtElementExist(inSpecificationList) and inTimeout>lTimeoutSeconds): + lTimeoutSeconds = lTimeoutSeconds + 0.5 + #Заснуть на полсекунды + time.sleep(0.5) + return PywinautoExtElementExist(inSpecificationList) +#Функция, которая попытается восстановить окно, если оно есть, но свернуто (особенность uia backend - он не может прицепиться к окну, если оно свернуто) +def PywinautoExtTryToRestore(inSpecificationList): + #pdb.set_trace() + try: + #Подготовка взодного массива + inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inSpecificationList) + #Выполнить подключение к объекту + lRPAApplication = pywinauto.Application(backend="win32") + lRPAApplication.connect(**inSpecificationList[0]) + lRPAApplication.top_window().restore() + except Exception: + True==False + ################################ #Функция повторяющегося таймера ############################# @@ -371,19 +405,28 @@ def GetControl(inControlSpecificationArray): inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray) #Выполнить идентификацию объектов, если передан массив lResultList=[]; + lTempObject=None if len(inControlSpecificationArray) > 0: #Выполнить подключение к объекту lRPAApplication = pywinauto.Application(backend=mPywinautoActiveBackend) #Проверка разрядности - lRPAApplication.connect(**inControlSpecificationArray[0]) - #lTempObject=lRPAApplication.window(**inControlSpecificationArray[0]) - #Скорректировано из-за недопонимания структуры - lTempObject=lRPAApplication - #Нормализация массива для целей выборки объекта (удаление конфликтующих ключей) - inControlSpecificationArray=ElementSpecificationListNormalize(inControlSpecificationArray) - #Циклическое прохождение к недрам объекта - for lWindowSpecification in inControlSpecificationArray[0:]: - lTempObject=lTempObject.window(**lWindowSpecification) + try: + lRPAApplication.connect(**inControlSpecificationArray[0]) + except Exception as e: + PywinautoExtTryToRestore(inControlSpecificationArray) + try: + lRPAApplication.connect(**inControlSpecificationArray[0]) + except Exception as e: + lRPAApplication = None + if lRPAApplication is not None: + #lTempObject=lRPAApplication.window(**inControlSpecificationArray[0]) + #Скорректировано из-за недопонимания структуры + lTempObject=lRPAApplication + #Нормализация массива для целей выборки объекта (удаление конфликтующих ключей) + inControlSpecificationArray=ElementSpecificationListNormalize(inControlSpecificationArray) + #Циклическое прохождение к недрам объекта + for lWindowSpecification in inControlSpecificationArray[0:]: + lTempObject=lTempObject.window(**lWindowSpecification) return lTempObject #Получить массив свойств и методов у элемента @@ -1037,7 +1080,9 @@ def GeneralClipboardSet(inText): win32clipboard.EmptyClipboard() win32clipboard.SetClipboardText(inText) win32clipboard.CloseClipboard() - +#Уснуть на 2 секунды +def GeneralSleep2s(): + time.sleep(2) #run() lText = "Bitness:" + str(struct.calcsize("P") * 8)