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

Loading…
Cancel
Save