From bee92482372ace391046d8f58b5734d55336d8f9 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Sat, 8 Jun 2019 23:11:01 +0300 Subject: [PATCH] =?UTF-8?q?#=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20Exception?= =?UTF-8?q?s=20=D0=B2=20=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B5,=20=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=D1=82=20=D0=BF=D0=BE=20=D1=81=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D1=83=20#Robot/GUI.UIOSelector=5FExist?= =?UTF-8?q?=5FBool=20-=20=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=8A=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B0=20#Robot/GUI.UIOSelectorsSecs=5FWaitAppear?= =?UTF-8?q?=5FList=20-=20=D0=9E=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=8D=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=BD=D0=B0=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=82=D1=8F=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8=20Secs=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BA=D1=83=D0=BD=D0=B4=20(=D0=95=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=8F=D0=B2=D0=B8=D1=82=D1=81=D1=8F=20=D1=80=D0=B0=D0=BD=D1=8C?= =?UTF-8?q?=D1=88=D0=B5=20-=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F)=20#R?= =?UTF-8?q?obot/GUI.UIOSelectorSecs=5FWaitAppear=5FBool=20-=20=D0=9E=D0=B6?= =?UTF-8?q?=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=8F=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D1=82?= =?UTF-8?q?=D1=8F=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8=20Secs=20=D1=81=D0=B5?= =?UTF-8?q?=D0=BA=D1=83=D0=BD=D0=B4=20(=D0=95=D1=81=D0=BB=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D1=80=D0=B0=D0=BD=D1=8C=D1=88=D0=B5=20-?= =?UTF-8?q?=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=20=D0=B8=D0=B7=20=D0=BE=D0=B6?= =?UTF-8?q?=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F)=20#UpdateGitIgnore=20Sign?= =?UTF-8?q?ed-off-by:=20Ivan=20Maslov=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 +++++- Robot/GUI.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 82 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 9f631c3d..0573fc7f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,11 @@ /**/__pycache__/** #Игнорируем папки распакованного блокнота Resources/Editor/Notepad++_7_7_x64/* -/Orchestrator/Reports \ No newline at end of file +/Orchestrator/Reports +/Robot/Reports +/Studio/Reports +/**/OpenRPAOrchestrator.exe +/**/OpenRPAStudio.exe +/**/OpenRPARobot.exe +/**/breakpoints.lst +/Orchestrator/screenshot.png \ No newline at end of file diff --git a/Robot/GUI.py b/Robot/GUI.py index 191971ac..9ecb44d5 100644 --- a/Robot/GUI.py +++ b/Robot/GUI.py @@ -97,8 +97,10 @@ mDefaultPywinautoBackend="win32" #] ################ #return: List of UI Object +#inElement - Входной элемент - показатель, что не требуется выполнять коннект к процессу +#inFlagRaiseException - Флаг True - выкинуть ошибку в случае обнаружении пустого списка #old name - PywinautoExtElementsGet -def UIOSelector_Get_UIOList (inSpecificationList,inElement=None): +def UIOSelector_Get_UIOList (inSpecificationList,inElement=None,inFlagRaiseException=True): lResultList=[] lChildrenList=[] #Получить родительский объект если на вход ничего не поступило @@ -148,7 +150,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None): lChildrenItemNewSpecificationList[0]["depth_start"]=lChildrenItemNewSpecificationList[0]["depth_start"]-1 #pdb.set_trace() #Циклический вызов для всех детей со скорректированной спецификацией - lResultList.extend(UIOSelector_Get_UIOList(lChildrenItemNewSpecificationList,lChildrenItem)) + lResultList.extend(UIOSelector_Get_UIOList(lChildrenItemNewSpecificationList,lChildrenItem,inFlagRaiseException)) #Фильтрация if lFlagGoCheck: lFlagAddChild=True @@ -177,28 +179,93 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None): if lFlagAddChild: lChildrenList.append(lChildrenItem) #Выполнить рекурсивный вызов (уменьшение количества спецификаций), если спецификация больше одного элемента + #????????Зачем в условии ниже is not None ??????????? if len(inSpecificationList)>1 and len(lChildrenList)>0 is not None: #Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект for lChildElement in lChildrenList: - lResultList.extend(UIOSelector_Get_UIOList(inSpecificationList[1:],lChildElement)) + lResultList.extend(UIOSelector_Get_UIOList(inSpecificationList[1:],lChildElement,inFlagRaiseException)) else: lResultList.extend(lChildrenList) + #Условие, если результирующий список пустой и установлен флаг создания ошибки (и inElement is None - не следствие рекурсивного вызова) + if inElement is None and len(lResultList)==0 and inFlagRaiseException: + raise pywinauto.findwindows.ElementNotFoundError("Robot can't find element by the UIOSelector") return lResultList ################################################################################################# #Get first (in more than one) UIO (UI Object) #inSpecificationList - UIOSelector +#inElement - Входной элемент - показатель, что не требуется выполнять коннект к процессу +#inFlagRaiseException - Флаг True - выкинуть ошибку в случае обнаружении пустого списка #old name - PywinautoExtElementGet -def UIOSelector_Get_UIO (inSpecificationList,inElement=None): +def UIOSelector_Get_UIO (inSpecificationList,inElement=None,inFlagRaiseException=True): lResult=None #Получить родительский объект если на вход ничего не поступило - lResultList=UIOSelector_Get_UIOList(inSpecificationList,inElement) + lResultList=UIOSelector_Get_UIOList(inSpecificationList,inElement,False) if len(lResultList)>0: lResult=lResultList[0] - else: + #Условие, если результирующий список пустой и установлен флаг создания ошибки (и inElement is None - не следствие рекурсивного вызова) + if lResult is None and inFlagRaiseException: raise pywinauto.findwindows.ElementNotFoundError("Robot can't find element by the UIOSelector") return lResult - +################################################################################################# +#Check if UIO exist (Identified by the UIOSelector) +#inSpecificationList - UIOSelector +#old name - - +def UIOSelector_Exist_Bool (inSpecificationList): + lResult=False + #Получить родительский объект если на вход ничего не поступило + lResultList=UIOSelector_Get_UIOList(inSpecificationList,inElement,False) + if len(lResultList)>0: + lResult=True + return lResult +################################################################################################# +#Wait for UIO is appear (at least one of them or all at the same time) +#inSpecificationListList - List of the UIOSelector +#inWaitSecs - Время ожидания объекта в секундах +#inFlagWaitAllInMoment - доп. условие - ожидать появление всех UIOSelector одновременно +#return: [0,1,2] - index of UIOSpecification, which is appear +#old name - - +def UIOSelectorsSecs_WaitAppear_List (inSpecificationListList,inWaitSecs,inFlagWaitAllInMoment=False): + lResultFlag=False + lSecsSleep = 1 #Настроечный параметр + lSecsDone = 0 + lResultList = None + #Цикл проверки + while lResultFlag == False and lSecsSleep0: + #Условие выполнено + lResultFlag=True + #Если флаг не изменился - увеличить время и уснуть + if lResultFlag == False: + lSecsDone=lSecsDone+lSecsSleep + sleep(lSecsSleep) + return lResultList +################################################################################################# +#Wait for UIO is appear (at least one of them or all at the same time) +#inSpecificationList - UIOSelector +#inWaitSecs - Время ожидания объекта в секундах +#return: Bool - True - UIO is appear +#old name - - +def UIOSelectorSecs_WaitAppear_Bool (inSpecificationList,inWaitSecs): + lWaitAppearList=UIOSelectorsSecs_WaitAppear_List([inSpecificationList],inWaitSecs) + lResult=False + if len(lWaitAppearList)>0: + lResult=True + return lResult ################################################################################################# #Get process bitness (32 or 64) #inSpecificationList - UIOSelector