#Robot_GUI_refactoring_100%

dev-linux
Ivan Maslov 6 years ago
parent e32681f90a
commit eb05fcd322

@ -30,6 +30,7 @@ from threading import Timer
#UIOTree - Recursive Dict of Dict ... (UI Parent -> Child hierarchy) #UIOTree - Recursive Dict of Dict ... (UI Parent -> Child hierarchy)
#UIOInfo - Dict of UIO attributes #UIOInfo - Dict of UIO attributes
#UIOActivity - Activity of the UIO (UI object) from the Pywinauto module #UIOActivity - Activity of the UIO (UI object) from the Pywinauto module
#UIOEI - UI Object info object
#inActivitySpecificationDict: #inActivitySpecificationDict:
#{ #{
@ -95,7 +96,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None):
if inElement is None: if inElement is None:
#сформировать спецификацию на получение элемента #сформировать спецификацию на получение элемента
lRootElementSpecification=[inSpecificationList[0]] lRootElementSpecification=[inSpecificationList[0]]
lRootElement=GetControl(lRootElementSpecification) lRootElement=PWASpecification_Get_UIO(lRootElementSpecification)
if lRootElement is not None: if lRootElement is not None:
lChildrenList.append(lRootElement.wrapper_object()) lChildrenList.append(lRootElement.wrapper_object())
#Елемент на вход поступил - выполнить его анализ #Елемент на вход поступил - выполнить его анализ
@ -138,7 +139,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None):
lChildrenItemNewSpecificationList[0]["depth_start"]=lChildrenItemNewSpecificationList[0]["depth_start"]-1 lChildrenItemNewSpecificationList[0]["depth_start"]=lChildrenItemNewSpecificationList[0]["depth_start"]-1
#pdb.set_trace() #pdb.set_trace()
#Циклический вызов для всех детей со скорректированной спецификацией #Циклический вызов для всех детей со скорректированной спецификацией
lResultList.extend(PywinautoExtElementsGet(lChildrenItemNewSpecificationList,lChildrenItem)) lResultList.extend(UIOSelector_Get_UIOList(lChildrenItemNewSpecificationList,lChildrenItem))
#Фильтрация #Фильтрация
if lFlagGoCheck: if lFlagGoCheck:
lFlagAddChild=True lFlagAddChild=True
@ -170,7 +171,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None):
if len(inSpecificationList)>1 and len(lChildrenList)>0 is not None: if len(inSpecificationList)>1 and len(lChildrenList)>0 is not None:
#Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект #Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект
for lChildElement in lChildrenList: for lChildElement in lChildrenList:
lResultList.extend(PywinautoExtElementsGet(inSpecificationList[1:],lChildElement)) lResultList.extend(UIOSelector_Get_UIOList(inSpecificationList[1:],lChildElement))
else: else:
lResultList.extend(lChildrenList) lResultList.extend(lChildrenList)
return lResultList return lResultList
@ -182,7 +183,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None):
def UIOSelector_Get_UIO (inSpecificationList,inElement=None): def UIOSelector_Get_UIO (inSpecificationList,inElement=None):
lResult=None lResult=None
#Получить родительский объект если на вход ничего не поступило #Получить родительский объект если на вход ничего не поступило
lResultList=PywinautoExtElementsGet(inSpecificationList,inElement) lResultList=UIOSelector_Get_UIOList(inSpecificationList,inElement)
if len(lResultList)>0: if len(lResultList)>0:
lResult=lResultList[0] lResult=lResultList[0]
return lResult return lResult
@ -198,7 +199,7 @@ def PWASpecification_Get_UIO(inControlSpecificationArray):
if "backend" in inControlSpecificationArray[0]: if "backend" in inControlSpecificationArray[0]:
lBackend=inControlSpecificationArray[0]["backend"] lBackend=inControlSpecificationArray[0]["backend"]
#Подготовка входного массива #Подготовка входного массива
inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray) inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray)
#Выполнить идентификацию объектов, если передан массив #Выполнить идентификацию объектов, если передан массив
lResultList=[]; lResultList=[];
lTempObject=None lTempObject=None
@ -209,7 +210,7 @@ def PWASpecification_Get_UIO(inControlSpecificationArray):
try: try:
lRPAApplication.connect(**inControlSpecificationArray[0]) lRPAApplication.connect(**inControlSpecificationArray[0])
except Exception as e: except Exception as e:
PywinautoExtTryToRestore(inControlSpecificationArray) UIOSelector_TryRestore_Dict(inControlSpecificationArray)
try: try:
lRPAApplication.connect(**inControlSpecificationArray[0]) lRPAApplication.connect(**inControlSpecificationArray[0])
except Exception as e: except Exception as e:
@ -219,7 +220,7 @@ def PWASpecification_Get_UIO(inControlSpecificationArray):
#Скорректировано из-за недопонимания структуры #Скорректировано из-за недопонимания структуры
lTempObject=lRPAApplication lTempObject=lRPAApplication
#Нормализация массива для целей выборки объекта (удаление конфликтующих ключей) #Нормализация массива для целей выборки объекта (удаление конфликтующих ключей)
inControlSpecificationArray=ElementSpecificationListNormalize(inControlSpecificationArray) inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray)
#Циклическое прохождение к недрам объекта #Циклическое прохождение к недрам объекта
for lWindowSpecification in inControlSpecificationArray[0:]: for lWindowSpecification in inControlSpecificationArray[0:]:
lTempObject=lTempObject.window(**lWindowSpecification) lTempObject=lTempObject.window(**lWindowSpecification)
@ -247,8 +248,8 @@ def UIOSelector_SearchChildByMouse_UIO(inElementSpecification):
(lX,lY) = win32api.GetCursorPos() (lX,lY) = win32api.GetCursorPos()
lElementFounded={} lElementFounded={}
#Создать карту пикселей и элементов #Создать карту пикселей и элементов
#####Внимание! Функция GUISearchElementByRootXY не написана #####Внимание! Функция UIOXY_SearchChild_ListDict не написана
lElementFoundedList=GUISearchElementByRootXY(PywinautoExtElementGet(inElementSpecification),lX,lY) lElementFoundedList=UIOXY_SearchChild_ListDict(UIOSelector_Get_UIO(inElementSpecification),lX,lY)
#print(lElementFoundedList) #print(lElementFoundedList)
lElementFounded=lElementFoundedList[-1]["element"] lElementFounded=lElementFoundedList[-1]["element"]
#Подсветить объект, если он мышь раньше стояла на другом объекте #Подсветить объект, если он мышь раньше стояла на другом объекте
@ -256,7 +257,7 @@ def UIOSelector_SearchChildByMouse_UIO(inElementSpecification):
lGUISearchElementSelected = lElementFounded lGUISearchElementSelected = lElementFounded
#Доработанная функция отрисовки #Доработанная функция отрисовки
if lElementFounded is not None: if lElementFounded is not None:
draw_outline_new(lElementFounded) UIO_Highlight(lElementFounded)
else: else:
#Была нажата клавиша Ctrl - выйти из цикла #Была нажата клавиша Ctrl - выйти из цикла
lFlagLoop=False; lFlagLoop=False;
@ -291,7 +292,7 @@ def UIOSelector_SearchChildByMouse_UIOTree(inElementSpecification):
# lElement = None # lElement = None
#else: #else:
#Получить информацию про объект #Получить информацию про объект
lItemInfo2.append(ElementInfoExportObject(lElement.element_info)) lItemInfo2.append(UIOEI_Convert_UIOInfo(lElement.element_info))
#Дообогатить информацией об индексе ребенка в родительском объекте #Дообогатить информацией об индексе ребенка в родительском объекте
if "index" in lListItem: if "index" in lListItem:
if lListItem["index"] is not None: if lListItem["index"] is not None:
@ -348,10 +349,10 @@ def UIO_GetCtrlIndex_Int(inElement):
#old name - PywinautoExtElementsGetInfo #old name - PywinautoExtElementsGetInfo
def UIOSelector_Get_UIOInfoList (inSpecificationList,inElement=None): def UIOSelector_Get_UIOInfoList (inSpecificationList,inElement=None):
#Получить родительский объект если на вход ничего не поступило #Получить родительский объект если на вход ничего не поступило
lResultList=PywinautoExtElementsGet(inSpecificationList,inElement) lResultList=UIOSelector_Get_UIOList(inSpecificationList,inElement)
lIterator = 0 lIterator = 0
for lItem in lResultList: for lItem in lResultList:
lResultList[lIterator]=ElementInfoExportObject(lResultList[lIterator].element_info) lResultList[lIterator]=UIOEI_Convert_UIOInfo(lResultList[lIterator].element_info)
lIterator = lIterator + 1 lIterator = lIterator + 1
return lResultList return lResultList
@ -360,7 +361,7 @@ def UIOSelector_Get_UIOInfoList (inSpecificationList,inElement=None):
#inSpecificationList - UIOSelector #inSpecificationList - UIOSelector
#old name - PywinautoExtElementExist #old name - PywinautoExtElementExist
def UIOSelector_IsExist_Bool (inSpecificationList): def UIOSelector_IsExist_Bool (inSpecificationList):
return len(PywinautoExtElementsGet(inSpecificationList))>0 return len(UIOSelector_Get_UIOList(inSpecificationList))>0
#################################################################################################### ####################################################################################################
#Wait for the UIO by the UIOSelector appear #Wait for the UIO by the UIOSelector appear
@ -369,11 +370,11 @@ def UIOSelector_IsExist_Bool (inSpecificationList):
#old name - PywinautoExtElementWaitAppear #old name - PywinautoExtElementWaitAppear
def UIOSelector_WaitAppear_Dict(inSpecificationList,inTimeout=60): def UIOSelector_WaitAppear_Dict(inSpecificationList,inTimeout=60):
lTimeoutSeconds = 0 lTimeoutSeconds = 0
while (not PywinautoExtElementExist(inSpecificationList) and inTimeout>lTimeoutSeconds): while (not UIOSelector_IsExist_Bool(inSpecificationList) and inTimeout>lTimeoutSeconds):
lTimeoutSeconds = lTimeoutSeconds + 0.5 lTimeoutSeconds = lTimeoutSeconds + 0.5
#Заснуть на полсекунды #Заснуть на полсекунды
time.sleep(0.5) time.sleep(0.5)
return PywinautoExtElementExist(inSpecificationList) return UIOSelector_IsExist_Bool(inSpecificationList)
#################################################################################################### ####################################################################################################
#Try to restore (maximize) window, if it's was minimized #Try to restore (maximize) window, if it's was minimized
@ -384,7 +385,7 @@ def UIOSelector_TryRestore_Dict(inSpecificationList):
lResult={} lResult={}
try: try:
#Подготовка взодного массива #Подготовка взодного массива
inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inSpecificationList) inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inSpecificationList)
#Выполнить подключение к объекту. Восстановление необходимо только в бэке win32, #Выполнить подключение к объекту. Восстановление необходимо только в бэке win32,
#так как в uia свернутое окно не распознается #так как в uia свернутое окно не распознается
lRPAApplication = pywinauto.Application(backend="win32") lRPAApplication = pywinauto.Application(backend="win32")
@ -399,7 +400,7 @@ def UIOSelector_TryRestore_Dict(inSpecificationList):
#old name - ElementActionGetList #old name - ElementActionGetList
def UIOSelector_Get_UIOActivityList (inControlSpecificationArray): def UIOSelector_Get_UIOActivityList (inControlSpecificationArray):
#Получить объект #Получить объект
lObject=PywinautoExtElementGet(inControlSpecificationArray) lObject=UIOSelector_Get_UIO(inControlSpecificationArray)
lActionList=dir(lObject) lActionList=dir(lObject)
lResult=dir(lObject) lResult=dir(lObject)
#Выполнить чистку списка от неактуальных методов #Выполнить чистку списка от неактуальных методов
@ -420,7 +421,7 @@ def UIOSelector_Get_UIOActivityList (inControlSpecificationArray):
def UIOSelectorUIOActivity_Run_Dict(inControlSpecificationArray,inActionName,inArgumentList=[],inkwArgumentObject={}): def UIOSelectorUIOActivity_Run_Dict(inControlSpecificationArray,inActionName,inArgumentList=[],inkwArgumentObject={}):
lResult={} lResult={}
#Определить объект #Определить объект
lObject=PywinautoExtElementGet(inControlSpecificationArray) lObject=UIOSelector_Get_UIO(inControlSpecificationArray)
#Получить метод для вызова #Получить метод для вызова
lFunction = getattr(lObject, inActionName) lFunction = getattr(lObject, inActionName)
#Выполнить действие #Выполнить действие
@ -448,16 +449,16 @@ def UIOSelectorUIOActivity_Run_Dict(inControlSpecificationArray,inActionName,inA
#old name - ElementGetInfo #old name - ElementGetInfo
def UIOSelector_Get_UIOInfo(inControlSpecificationArray): def UIOSelector_Get_UIOInfo(inControlSpecificationArray):
#Подготовка входного массива #Подготовка входного массива
inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray) inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray)
#Выполнить идентификацию объектов, если передан массив #Выполнить идентификацию объектов, если передан массив
lResultList=[]; lResultList=[];
if len(inControlSpecificationArray) > 0: if len(inControlSpecificationArray) > 0:
#Получить объект #Получить объект
lTempObject=PywinautoExtElementGet(inControlSpecificationArray) lTempObject=UIOSelector_Get_UIO(inControlSpecificationArray)
#Получить инфо объект #Получить инфо объект
lTempObjectInfo = lTempObject.element_info lTempObjectInfo = lTempObject.element_info
#Добавить информацию об обнаруженом объекте #Добавить информацию об обнаруженом объекте
lResultList.append(ElementInfoExportObject(lTempObjectInfo)); lResultList.append(UIOEI_Convert_UIOInfo(lTempObjectInfo));
return lResultList return lResultList
@ -500,7 +501,7 @@ def UIOXY_SearchChild_ListDict(inRootElement,inX,inY,inHierarchyList=[]):
#Сформировать результирующий массив #Сформировать результирующий массив
lChildFoundedHierarchyList = lParentHierarchy.copy() lChildFoundedHierarchyList = lParentHierarchy.copy()
lChildFoundedHierarchyList.append({'index': lChildIterator}) lChildFoundedHierarchyList.append({'index': lChildIterator})
lChildFoundedHierarchyList = GUISearchElementByRootXY(lChildElement,inX,inY, lChildFoundedHierarchyList) lChildFoundedHierarchyList = UIOXY_SearchChild_ListDict(lChildElement,inX,inY, lChildFoundedHierarchyList)
lChildFoundedElement = lChildFoundedHierarchyList[-1]["element"] lChildFoundedElement = lChildFoundedHierarchyList[-1]["element"]
#Установить обнаруженный элемент, если текущий результат пустой #Установить обнаруженный элемент, если текущий результат пустой
if lResultElement is None and lChildFoundedElement is not None: if lResultElement is None and lChildFoundedElement is not None:
@ -556,13 +557,13 @@ def UIOXY_SearchChild_ListDict(inRootElement,inX,inY,inHierarchyList=[]):
#old name - ElementGetChildElementList #old name - ElementGetChildElementList
def UIOSelector_GetChildList_UIOList(inControlSpecificationArray=[]): def UIOSelector_GetChildList_UIOList(inControlSpecificationArray=[]):
#Подготовка входного массива #Подготовка входного массива
inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray) inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray)
#Выполнить идентификацию объектов, если передан массив #Выполнить идентификацию объектов, если передан массив
lResultList=[]; lResultList=[];
#ctypes.windll.user32.MessageBoxW(0, str(inControlSpecificationArray), "Your title", 1) #ctypes.windll.user32.MessageBoxW(0, str(inControlSpecificationArray), "Your title", 1)
if len(inControlSpecificationArray) > 0: if len(inControlSpecificationArray) > 0:
#Получить объект #Получить объект
lTempObject = PywinautoExtElementGet(inControlSpecificationArray) lTempObject = UIOSelector_Get_UIO(inControlSpecificationArray)
#Получить список дочерних объектов #Получить список дочерних объектов
lTempChildList = lTempObject.children() lTempChildList = lTempObject.children()
lIterator=0 lIterator=0
@ -570,14 +571,14 @@ def UIOSelector_GetChildList_UIOList(inControlSpecificationArray=[]):
for lChild in lTempChildList: for lChild in lTempChildList:
lTempObjectInfo=lChild.element_info lTempObjectInfo=lChild.element_info
#Добавить информацию об обнаруженом объекте #Добавить информацию об обнаруженом объекте
lObjectInfoItem=ElementInfoExportObject(lTempObjectInfo) lObjectInfoItem=UIOEI_Convert_UIOInfo(lTempObjectInfo)
#Итератор внутри объекта (для точной идентификации) #Итератор внутри объекта (для точной идентификации)
lObjectInfoItem['ctrl_index']=lIterator; lObjectInfoItem['ctrl_index']=lIterator;
lResultList.append(lObjectInfoItem); lResultList.append(lObjectInfoItem);
#Инкремент счетчика #Инкремент счетчика
lIterator=lIterator+1 lIterator=lIterator+1
else: else:
lResultList=GetRootElementList() lResultList=BackendStr_GetTopLevelList_UIOInfo()
return lResultList return lResultList
#################################################################################################### ####################################################################################################
@ -643,17 +644,11 @@ def UIOSelector_SearchNormalize_UIOSelector (inControlSpecificationArray):
#Вернуть результат #Вернуть результат
return lResult return lResult
####################################################################################################
#Transfer UI object element info (pywinauto) to UIOInfo (dict of attributes)
############################ #inElementInfo - UIOEI
#Старая версия #old name - ElementInfoExportObject
############################ def UIOEI_Convert_UIOInfo(inElementInfo):
mFlagIsDebug=False
#Получить объект из атрибутов, которые удалось прочитать
def ElementInfoExportObject(inElementInfo):
#Подготовить выходную структуру данных #Подготовить выходную структуру данных
lResult = {"title":None,"rich_text":None,"process_id":None,"process":None,"handle":None,"class_name":None,"control_type":None,"control_id":None,"rectangle":{"left":None,"top":None,"right":None,"bottom":None}, 'runtime_id':None} lResult = {"title":None,"rich_text":None,"process_id":None,"process":None,"handle":None,"class_name":None,"control_type":None,"control_id":None,"rectangle":{"left":None,"top":None,"right":None,"bottom":None}, 'runtime_id':None}
#Проверка name #Проверка name
@ -721,21 +716,35 @@ def ElementInfoExportObject(inElementInfo):
#Вернуть результат #Вернуть результат
return lResult return lResult
def GetRootElementList(): ###################################################################################################
#Get list of top level
#old name - GetRootElementList
def BackendStr_GetTopLevelList_UIOInfo(inBackend):
#Получить список объектов #Получить список объектов
lResultList=pywinauto.findwindows.find_elements(top_level_only=True,backend=mPywinautoActiveBackend) lResultList=pywinauto.findwindows.find_elements(top_level_only=True,backend=mPywinautoActiveBackend)
lResultList2=[] lResultList2=[]
for lI in lResultList: for lI in lResultList:
lTempObjectInfo=lI lTempObjectInfo=lI
lResultList2.append(ElementInfoExportObject(lI)); lResultList2.append(UIOEI_Convert_UIOInfo(lI));
return lResultList2 return lResultList2
def ElementDrawOutlineNew(inSpecificationArray):
draw_outline_new(PywinautoExtElementGet(inSpecificationArray)) ###################################################################################################
#Highlight the UI object
#old name - ElementDrawOutlineNew
def UIOSelector_Highlight(inSpecificationArray):
UIO_Highlight(UIOSelector_Get_UIO(inSpecificationArray))
return return
def ElementDrawOutlineNewFocus(inSpecificationArray):
draw_outline_new_focus(PywinautoExtElementGet(inSpecificationArray)) ###################################################################################################
#inSpecificationArray - UIOSelector
#old name - ElementDrawOutlineNewFocus
def UIOSelector_FocusHighlight(inSpecificationArray):
UIO_FocusHighlight(UIOSelector_Get_UIO(inSpecificationArray))
return return
def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None,inFlagSetFocus=False):
###################################################################################################
#old name - draw_outline_new
def UIO_Highlight(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None,inFlagSetFocus=False):
if lWrapperObject is not None: if lWrapperObject is not None:
""" """
Draw an outline around the window. Draw an outline around the window.
@ -785,9 +794,20 @@ def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines
win32functions.DeleteObject(pen_handle) win32functions.DeleteObject(pen_handle)
# delete the Display context that we created # delete the Display context that we created
win32functions.DeleteDC(dc) win32functions.DeleteDC(dc)
###################################################################################################
#Аналог подсвечивания + установка фокуса #Аналог подсвечивания + установка фокуса
def draw_outline_new_focus(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None): #old name - draw_outline_new_focus
draw_outline_new(lWrapperObject,'green',2,win32defines.BS_NULL,None,True) def UIO_FocusHighlight(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None):
UIO_Highlight(lWrapperObject,'green',2,win32defines.BS_NULL,None,True)
############################
#Старая версия
############################
mFlagIsDebug=False
#run() #run()
lText = "Bitness:" + str(struct.calcsize("P") * 8) lText = "Bitness:" + str(struct.calcsize("P") * 8)

Loading…
Cancel
Save