#TreeViewFix #PywinautoExtElementGet_v1(only index)

dev-linux
Ivan Maslov 6 years ago
parent 2066821eb8
commit 6c5b5abd03

@ -64,7 +64,7 @@
///Функция визуализации дерева ///Функция визуализации дерева
mGlobal.ElementTree.fRender = function(inElementsTreeDataArray) mGlobal.ElementTree.fRender = function(inElementsTreeDataArray)
{ {
var lHTMLList='<div class="ui list">'; var lHTMLList='<div class="ui list" style="height:350px;overflow:scroll;">';
///Циклический обход списка ///Циклический обход списка
for (var i = 0; i< inElementsTreeDataArray.length;i++) { for (var i = 0; i< inElementsTreeDataArray.length;i++) {
///Добавить HTML код позиции ///Добавить HTML код позиции

@ -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,19 +145,56 @@ def PywinautoExtElementCtrlIndexGet(inElement):
lElementParentChildrenList = lElementParent.children() lElementParentChildrenList = lElementParent.children()
#Циклический поиск до того момента, пока не упремся в текущий элемент #Циклический поиск до того момента, пока не упремся в текущий элемент
while lFlagFind: while lFlagFind:
#Прекратить поиск, если элемент был обнаружен if lResult<len(lElementParentChildrenList):
if inElement == lElementParentChildrenList[lResult]: #Прекратить поиск, если элемент был обнаружен
lFlagFind = False if inElement == lElementParentChildrenList[lResult]:
else:
#Прекратить поиски, если итератор вышел за пределы списка
if lResult>=len(lElementParentChildrenList):
lResult = None
lFlagFind = False lFlagFind = False
else: else:
lResult = lResult + 1 #Прекратить поиски, если итератор вышел за пределы списка
if lResult>=len(lElementParentChildrenList):
lResult = None
lFlagFind = False
else:
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
@ -415,49 +452,49 @@ def GUISearchElementByRootXY(inRootElement,inX,inY):
lResultElementX2 = lRootElementRectX2 lResultElementX2 = lRootElementRectX2
lResultElementY1 = lRootElementRectY1 lResultElementY1 = lRootElementRectY1
lResultElementY2 = lRootElementRectY2 lResultElementY2 = lRootElementRectY2
#Получить список детей и добавить в карту #Получить список детей и добавить в карту
for lChildElement in inRootElement.children(): for lChildElement in inRootElement.children():
lChildFoundedElement = GUISearchElementByRootXY(lChildElement,inX,inY) lChildFoundedElement = GUISearchElementByRootXY(lChildElement,inX,inY)
#Установить обнаруженный элемент, если текущий результат пустой #Установить обнаруженный элемент, если текущий результат пустой
if lResultElement is None and lChildFoundedElement is not None: if lResultElement is None and lChildFoundedElement is not None:
lResultElement = lChildFoundedElement
lResultElementX1 = lResultElement.element_info.rectangle.left
lResultElementX2 = lResultElement.element_info.rectangle.right
lResultElementY1 = lResultElement.element_info.rectangle.top
lResultElementY2 = lResultElement.element_info.rectangle.bottom
#Выполнить сверку lChildFoundedElement и lResultElement если оба имеются
elif lResultElement is not None and lChildFoundedElement is not None:
#Правила перезатирания карты, если имеется старый объект
#[Накладываемый объект] - НО - ElementNew
#[Имеющийся объект] - ИО - ElementOld
#3 типа вхождения объектов
#тип 1 - [имеющийся объект] полностью входит в [накладываемый объект] (ИО X1 Y1 >= НО X1 Y1; ИО X2 Y2 <= НО X2 Y2) - не вносить НО в bitmap в эти диапазоны
#тип 2 - [имеющийся объект] полностью выходит за пределы [накладываемого объекта] (ИО X1 Y1 < НО X1 Y1; ИО X2 Y2 > НО X2 Y2) - вносить НО в bitmap
#тип 3 - [имеющийся объект] частично входит в [накладываемый объект] (все остальные случаи)- вносить НО в bitmap
#Получить координаты ИО
lChildFoundedElementInfo = lChildFoundedElement.element_info
#lElementNew = inElement
lChildFoundedElementX1 = lChildFoundedElementInfo.rectangle.left
lChildFoundedElementX2 = lChildFoundedElementInfo.rectangle.right
lChildFoundedElementY1 = lChildFoundedElementInfo.rectangle.top
lChildFoundedElementY2 = lChildFoundedElementInfo.rectangle.bottom
#Проверка вхождения по типу 1
if (lResultElementX1>=lChildFoundedElementX1) and (lResultElementY1>=lChildFoundedElementY1) and (lResultElementX2<=lChildFoundedElementX2) and (lResultElementY2<=lChildFoundedElementY2):
False == True
#Проверка вхождения по типу 3
elif (lResultElementX1<lChildFoundedElementX1) and (lResultElementY1<lChildFoundedElementY1) and (lResultElementX2>lChildFoundedElementX2) and (lResultElementY2>lChildFoundedElementY2):
lResultElement = lChildFoundedElement lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1 lResultElementX1 = lResultElement.element_info.rectangle.left
lResultElementX2 = lChildFoundedElementX2 lResultElementX2 = lResultElement.element_info.rectangle.right
lResultElementY1 = lChildFoundedElementY1 lResultElementY1 = lResultElement.element_info.rectangle.top
lResultElementY2 = lChildFoundedElementY2 lResultElementY2 = lResultElement.element_info.rectangle.bottom
#Проверка вхождения по типу 2 #Выполнить сверку lChildFoundedElement и lResultElement если оба имеются
else: elif lResultElement is not None and lChildFoundedElement is not None:
lResultElement = lChildFoundedElement #Правила перезатирания карты, если имеется старый объект
lResultElementX1 = lChildFoundedElementX1 #[Накладываемый объект] - НО - ElementNew
lResultElementX2 = lChildFoundedElementX2 #[Имеющийся объект] - ИО - ElementOld
lResultElementY1 = lChildFoundedElementY1 #3 типа вхождения объектов
lResultElementY2 = lChildFoundedElementY2 #тип 1 - [имеющийся объект] полностью входит в [накладываемый объект] (ИО X1 Y1 >= НО X1 Y1; ИО X2 Y2 <= НО X2 Y2) - не вносить НО в bitmap в эти диапазоны
#тип 2 - [имеющийся объект] полностью выходит за пределы [накладываемого объекта] (ИО X1 Y1 < НО X1 Y1; ИО X2 Y2 > НО X2 Y2) - вносить НО в bitmap
#тип 3 - [имеющийся объект] частично входит в [накладываемый объект] (все остальные случаи)- вносить НО в bitmap
#Получить координаты ИО
lChildFoundedElementInfo = lChildFoundedElement.element_info
#lElementNew = inElement
lChildFoundedElementX1 = lChildFoundedElementInfo.rectangle.left
lChildFoundedElementX2 = lChildFoundedElementInfo.rectangle.right
lChildFoundedElementY1 = lChildFoundedElementInfo.rectangle.top
lChildFoundedElementY2 = lChildFoundedElementInfo.rectangle.bottom
#Проверка вхождения по типу 1
if (lResultElementX1>=lChildFoundedElementX1) and (lResultElementY1>=lChildFoundedElementY1) and (lResultElementX2<=lChildFoundedElementX2) and (lResultElementY2<=lChildFoundedElementY2):
False == True
#Проверка вхождения по типу 3
elif (lResultElementX1<lChildFoundedElementX1) and (lResultElementY1<lChildFoundedElementY1) and (lResultElementX2>lChildFoundedElementX2) and (lResultElementY2>lChildFoundedElementY2):
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
#Проверка вхождения по типу 2
else:
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
except Exception as e: except Exception as e:
False == False False == False
return lResultElement return lResultElement
@ -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():

Loading…
Cancel
Save