|
|
@ -16,8 +16,8 @@ from threading import Timer
|
|
|
|
mFlagIsDebug=False
|
|
|
|
mFlagIsDebug=False
|
|
|
|
|
|
|
|
|
|
|
|
mPywinautoApplication=pywinauto.Application(backend="win32")
|
|
|
|
mPywinautoApplication=pywinauto.Application(backend="win32")
|
|
|
|
mPywinautoActiveBackend="win32"
|
|
|
|
#mPywinautoActiveBackend="win32"
|
|
|
|
#mPywinautoActiveBackend="uia"
|
|
|
|
mPywinautoActiveBackend="uia"
|
|
|
|
#mPywinautoApplication=pywinauto.Application(backend="uia")
|
|
|
|
#mPywinautoApplication=pywinauto.Application(backend="uia")
|
|
|
|
|
|
|
|
|
|
|
|
#####
|
|
|
|
#####
|
|
|
@ -50,7 +50,7 @@ def AutomationSearchMouseElement(inElementSpecification,inFlagIsSearchOnline=Tru
|
|
|
|
lElementFounded={}
|
|
|
|
lElementFounded={}
|
|
|
|
#Создать карту пикселей и элементов
|
|
|
|
#Создать карту пикселей и элементов
|
|
|
|
#####Внимание! Функция GUISearchElementByRootXY не написана
|
|
|
|
#####Внимание! Функция GUISearchElementByRootXY не написана
|
|
|
|
lElementFounded=GUISearchElementByRootXY(GetControl(inElementSpecification),lX,lY)
|
|
|
|
lElementFounded=GUISearchElementByRootXY(PywinautoExtElementGet(inElementSpecification),lX,lY)
|
|
|
|
#Подсветить объект, если он мышь раньше стояла на другом объекте
|
|
|
|
#Подсветить объект, если он мышь раньше стояла на другом объекте
|
|
|
|
if lGUISearchElementSelected != lElementFounded:
|
|
|
|
if lGUISearchElementSelected != lElementFounded:
|
|
|
|
lGUISearchElementSelected = lElementFounded
|
|
|
|
lGUISearchElementSelected = lElementFounded
|
|
|
@ -66,7 +66,7 @@ def AutomationSearchMouseElement(inElementSpecification,inFlagIsSearchOnline=Tru
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
lBitmap={}
|
|
|
|
lBitmap={}
|
|
|
|
#Создать карту пикселей и элементов
|
|
|
|
#Создать карту пикселей и элементов
|
|
|
|
lBitmap=GUISearchBitmapCreate(GetControl(inElementSpecification),lBitmap)
|
|
|
|
lBitmap=GUISearchBitmapCreate(PywinautoExtElementGet(inElementSpecification),lBitmap)
|
|
|
|
#Выдать сообщение, что поиск готов к использованию
|
|
|
|
#Выдать сообщение, что поиск готов к использованию
|
|
|
|
#print("GUISearch: Ready for search!")
|
|
|
|
#print("GUISearch: Ready for search!")
|
|
|
|
###########
|
|
|
|
###########
|
|
|
@ -145,6 +145,7 @@ def PywinautoExtElementCtrlIndexGet(inElement):
|
|
|
|
lElementParentChildrenList = lElementParent.children()
|
|
|
|
lElementParentChildrenList = lElementParent.children()
|
|
|
|
#Циклический поиск до того момента, пока не упремся в текущий элемент
|
|
|
|
#Циклический поиск до того момента, пока не упремся в текущий элемент
|
|
|
|
while lFlagFind:
|
|
|
|
while lFlagFind:
|
|
|
|
|
|
|
|
if lResult<len(lElementParentChildrenList):
|
|
|
|
#Прекратить поиск, если элемент был обнаружен
|
|
|
|
#Прекратить поиск, если элемент был обнаружен
|
|
|
|
if inElement == lElementParentChildrenList[lResult]:
|
|
|
|
if inElement == lElementParentChildrenList[lResult]:
|
|
|
|
lFlagFind = False
|
|
|
|
lFlagFind = False
|
|
|
@ -155,9 +156,45 @@ def PywinautoExtElementCtrlIndexGet(inElement):
|
|
|
|
lFlagFind = False
|
|
|
|
lFlagFind = False
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
lResult = lResult + 1
|
|
|
|
lResult = lResult + 1
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
lResult=-1
|
|
|
|
|
|
|
|
lFlagFind=False
|
|
|
|
#Вернуть результат
|
|
|
|
#Вернуть результат
|
|
|
|
return lResult
|
|
|
|
return lResult
|
|
|
|
|
|
|
|
#Получить элемент через расширенный движок поиска
|
|
|
|
|
|
|
|
#[ {
|
|
|
|
|
|
|
|
#"index":<Позиция элемента в родительском объекте>,
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
#} ]
|
|
|
|
|
|
|
|
def PywinautoExtElementGet (inSpecificationList,inElement=None):
|
|
|
|
|
|
|
|
lResult=None
|
|
|
|
|
|
|
|
lChildElement=None
|
|
|
|
|
|
|
|
#Получить родительский объект если на вход ничего не поступило
|
|
|
|
|
|
|
|
if inElement is None:
|
|
|
|
|
|
|
|
#сформировать спецификацию на получение элемента
|
|
|
|
|
|
|
|
lRootElementSpecification=[inSpecificationList[0]]
|
|
|
|
|
|
|
|
lChildElement=GetControl(lRootElementSpecification)
|
|
|
|
|
|
|
|
#Елемент на вход поступил - выполнить его анализ
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
#Поступил index
|
|
|
|
|
|
|
|
if 'index' in inSpecificationList[0]:
|
|
|
|
|
|
|
|
lChildrenList=inElement.children()
|
|
|
|
|
|
|
|
if inSpecificationList[0]['index']<len(lChildrenList):
|
|
|
|
|
|
|
|
#Получить дочерний элемент
|
|
|
|
|
|
|
|
lChildElement=lChildrenList[inSpecificationList[0]['index']]
|
|
|
|
|
|
|
|
#Поступил ctrl_index
|
|
|
|
|
|
|
|
elif 'ctrl_index' in inSpecificationList[0]:
|
|
|
|
|
|
|
|
lChildrenList=inElement.children()
|
|
|
|
|
|
|
|
if inSpecificationList[0]['ctrl_index']<len(lChildrenList):
|
|
|
|
|
|
|
|
#Получить дочерний элемент
|
|
|
|
|
|
|
|
lChildElement=lChildrenList[inSpecificationList[0]['ctrl_index']]
|
|
|
|
|
|
|
|
#Выполнить рекурсивный вызов, если спецификация больше одного элемента
|
|
|
|
|
|
|
|
if len(inSpecificationList)>1 and lChildElement is not None:
|
|
|
|
|
|
|
|
#Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект
|
|
|
|
|
|
|
|
lResult=PywinautoExtElementGet(inSpecificationList[1:],lChildElement)
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
lResult=lChildElement
|
|
|
|
|
|
|
|
return lResult
|
|
|
|
################################
|
|
|
|
################################
|
|
|
|
#Функция повторяющегося таймера
|
|
|
|
#Функция повторяющегося таймера
|
|
|
|
#############################
|
|
|
|
#############################
|
|
|
@ -272,9 +309,9 @@ def GetControl(inControlSpecificationArray):
|
|
|
|
#Получить массив свойств и методов у элемента
|
|
|
|
#Получить массив свойств и методов у элемента
|
|
|
|
def ElementActionGetList (inControlSpecificationArray):
|
|
|
|
def ElementActionGetList (inControlSpecificationArray):
|
|
|
|
#Получить объект
|
|
|
|
#Получить объект
|
|
|
|
lObject=GetControl(inControlSpecificationArray)
|
|
|
|
lObject=PywinautoExtElementGet(inControlSpecificationArray)
|
|
|
|
lActionList=dir(lObject.wrapper_object())
|
|
|
|
lActionList=dir(lObject)
|
|
|
|
lResult=dir(lObject.wrapper_object())
|
|
|
|
lResult=dir(lObject)
|
|
|
|
#Выполнить чистку списка от неактуальных методов
|
|
|
|
#Выполнить чистку списка от неактуальных методов
|
|
|
|
for lActionItem in lActionList:
|
|
|
|
for lActionItem in lActionList:
|
|
|
|
#Удалить те, которые начинаются на _
|
|
|
|
#Удалить те, которые начинаются на _
|
|
|
@ -287,9 +324,9 @@ def ElementActionGetList (inControlSpecificationArray):
|
|
|
|
#Выполнить действие над элементом
|
|
|
|
#Выполнить действие над элементом
|
|
|
|
def ElementRunAction(inControlSpecificationArray,inActionName,inArgumentList=[],inkwArgumentObject={}):
|
|
|
|
def ElementRunAction(inControlSpecificationArray,inActionName,inArgumentList=[],inkwArgumentObject={}):
|
|
|
|
#Определить объект
|
|
|
|
#Определить объект
|
|
|
|
lObject=GetControl(inControlSpecificationArray)
|
|
|
|
lObject=PywinautoExtElementGet(inControlSpecificationArray)
|
|
|
|
#Получить метод для вызова
|
|
|
|
#Получить метод для вызова
|
|
|
|
lFunction = getattr(lObject.wrapper_object(), inActionName)
|
|
|
|
lFunction = getattr(lObject, inActionName)
|
|
|
|
#Выполнить действие
|
|
|
|
#Выполнить действие
|
|
|
|
return lFunction(*inArgumentList,**inkwArgumentObject)
|
|
|
|
return lFunction(*inArgumentList,**inkwArgumentObject)
|
|
|
|
|
|
|
|
|
|
|
@ -300,9 +337,9 @@ def ElementGetInfo(inControlSpecificationArray):
|
|
|
|
lResultList=[];
|
|
|
|
lResultList=[];
|
|
|
|
if len(inControlSpecificationArray) > 0:
|
|
|
|
if len(inControlSpecificationArray) > 0:
|
|
|
|
#Получить объект
|
|
|
|
#Получить объект
|
|
|
|
lTempObject=GetControl(inControlSpecificationArray)
|
|
|
|
lTempObject=PywinautoExtElementGet(inControlSpecificationArray)
|
|
|
|
#Получить инфо объект
|
|
|
|
#Получить инфо объект
|
|
|
|
lTempObjectInfo = lTempObject.wrapper_object().element_info
|
|
|
|
lTempObjectInfo = lTempObject.element_info
|
|
|
|
#Добавить информацию об обнаруженом объекте
|
|
|
|
#Добавить информацию об обнаруженом объекте
|
|
|
|
lResultList.append(ElementInfoExportObject(lTempObjectInfo));
|
|
|
|
lResultList.append(ElementInfoExportObject(lTempObjectInfo));
|
|
|
|
return lResultList
|
|
|
|
return lResultList
|
|
|
@ -554,9 +591,9 @@ def ElementGetChildElementList(inControlSpecificationArray=[]):
|
|
|
|
#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 = GetControl(inControlSpecificationArray)
|
|
|
|
lTempObject = PywinautoExtElementGet(inControlSpecificationArray)
|
|
|
|
#Получить список дочерних объектов
|
|
|
|
#Получить список дочерних объектов
|
|
|
|
lTempChildList = lTempObject.wrapper_object().children()
|
|
|
|
lTempChildList = lTempObject.children()
|
|
|
|
lIterator=0
|
|
|
|
lIterator=0
|
|
|
|
#Подготовить результирующий объект
|
|
|
|
#Подготовить результирующий объект
|
|
|
|
for lChild in lTempChildList:
|
|
|
|
for lChild in lTempChildList:
|
|
|
@ -823,10 +860,10 @@ def GetRootElementList():
|
|
|
|
lResultList2.append(ElementInfoExportObject(lI));
|
|
|
|
lResultList2.append(ElementInfoExportObject(lI));
|
|
|
|
return lResultList2
|
|
|
|
return lResultList2
|
|
|
|
def ElementDrawOutlineNew(inSpecificationArray):
|
|
|
|
def ElementDrawOutlineNew(inSpecificationArray):
|
|
|
|
draw_outline_new(GetControl(inSpecificationArray))
|
|
|
|
draw_outline_new(PywinautoExtElementGet(inSpecificationArray))
|
|
|
|
return
|
|
|
|
return
|
|
|
|
def ElementDrawOutlineNewFocus(inSpecificationArray):
|
|
|
|
def ElementDrawOutlineNewFocus(inSpecificationArray):
|
|
|
|
draw_outline_new_focus(GetControl(inSpecificationArray))
|
|
|
|
draw_outline_new_focus(PywinautoExtElementGet(inSpecificationArray))
|
|
|
|
return
|
|
|
|
return
|
|
|
|
def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None,inFlagSetFocus=False):
|
|
|
|
def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None,inFlagSetFocus=False):
|
|
|
|
if lWrapperObject is not None:
|
|
|
|
if lWrapperObject is not None:
|
|
|
@ -842,7 +879,7 @@ def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines
|
|
|
|
if inFlagSetFocus:
|
|
|
|
if inFlagSetFocus:
|
|
|
|
#Установить фокус на объект, чтобы было видно выделение
|
|
|
|
#Установить фокус на объект, чтобы было видно выделение
|
|
|
|
lWrapperObject.set_focus()
|
|
|
|
lWrapperObject.set_focus()
|
|
|
|
|
|
|
|
time.sleep(0.5)
|
|
|
|
#pdb.set_trace()
|
|
|
|
#pdb.set_trace()
|
|
|
|
# don't draw if dialog is not visible
|
|
|
|
# don't draw if dialog is not visible
|
|
|
|
#if not lWrapperObject.is_visible():
|
|
|
|
#if not lWrapperObject.is_visible():
|
|
|
|