|
|
|
@ -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)
|
|
|
|
|