#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)
{
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++) {
///Добавить HTML код позиции

@ -16,8 +16,8 @@ from threading import Timer
mFlagIsDebug=False
mPywinautoApplication=pywinauto.Application(backend="win32")
mPywinautoActiveBackend="win32"
#mPywinautoActiveBackend="uia"
#mPywinautoActiveBackend="win32"
mPywinautoActiveBackend="uia"
#mPywinautoApplication=pywinauto.Application(backend="uia")
#####
@ -50,7 +50,7 @@ def AutomationSearchMouseElement(inElementSpecification,inFlagIsSearchOnline=Tru
lElementFounded={}
#Создать карту пикселей и элементов
#####Внимание! Функция GUISearchElementByRootXY не написана
lElementFounded=GUISearchElementByRootXY(GetControl(inElementSpecification),lX,lY)
lElementFounded=GUISearchElementByRootXY(PywinautoExtElementGet(inElementSpecification),lX,lY)
#Подсветить объект, если он мышь раньше стояла на другом объекте
if lGUISearchElementSelected != lElementFounded:
lGUISearchElementSelected = lElementFounded
@ -66,7 +66,7 @@ def AutomationSearchMouseElement(inElementSpecification,inFlagIsSearchOnline=Tru
else:
lBitmap={}
#Создать карту пикселей и элементов
lBitmap=GUISearchBitmapCreate(GetControl(inElementSpecification),lBitmap)
lBitmap=GUISearchBitmapCreate(PywinautoExtElementGet(inElementSpecification),lBitmap)
#Выдать сообщение, что поиск готов к использованию
#print("GUISearch: Ready for search!")
###########
@ -145,19 +145,56 @@ def PywinautoExtElementCtrlIndexGet(inElement):
lElementParentChildrenList = lElementParent.children()
#Циклический поиск до того момента, пока не упремся в текущий элемент
while lFlagFind:
#Прекратить поиск, если элемент был обнаружен
if inElement == lElementParentChildrenList[lResult]:
lFlagFind = False
else:
#Прекратить поиски, если итератор вышел за пределы списка
if lResult>=len(lElementParentChildrenList):
lResult = None
if lResult<len(lElementParentChildrenList):
#Прекратить поиск, если элемент был обнаружен
if inElement == lElementParentChildrenList[lResult]:
lFlagFind = False
else:
lResult = lResult + 1
#Прекратить поиски, если итератор вышел за пределы списка
if lResult>=len(lElementParentChildrenList):
lResult = None
lFlagFind = False
else:
lResult = lResult + 1
else:
lResult=-1
lFlagFind=False
#Вернуть результат
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):
#Получить объект
lObject=GetControl(inControlSpecificationArray)
lActionList=dir(lObject.wrapper_object())
lResult=dir(lObject.wrapper_object())
lObject=PywinautoExtElementGet(inControlSpecificationArray)
lActionList=dir(lObject)
lResult=dir(lObject)
#Выполнить чистку списка от неактуальных методов
for lActionItem in lActionList:
#Удалить те, которые начинаются на _
@ -287,9 +324,9 @@ def ElementActionGetList (inControlSpecificationArray):
#Выполнить действие над элементом
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)
@ -300,9 +337,9 @@ def ElementGetInfo(inControlSpecificationArray):
lResultList=[];
if len(inControlSpecificationArray) > 0:
#Получить объект
lTempObject=GetControl(inControlSpecificationArray)
lTempObject=PywinautoExtElementGet(inControlSpecificationArray)
#Получить инфо объект
lTempObjectInfo = lTempObject.wrapper_object().element_info
lTempObjectInfo = lTempObject.element_info
#Добавить информацию об обнаруженом объекте
lResultList.append(ElementInfoExportObject(lTempObjectInfo));
return lResultList
@ -415,49 +452,49 @@ def GUISearchElementByRootXY(inRootElement,inX,inY):
lResultElementX2 = lRootElementRectX2
lResultElementY1 = lRootElementRectY1
lResultElementY2 = lRootElementRectY2
#Получить список детей и добавить в карту
for lChildElement in inRootElement.children():
lChildFoundedElement = GUISearchElementByRootXY(lChildElement,inX,inY)
#Установить обнаруженный элемент, если текущий результат пустой
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):
#Получить список детей и добавить в карту
for lChildElement in inRootElement.children():
lChildFoundedElement = GUISearchElementByRootXY(lChildElement,inX,inY)
#Установить обнаруженный элемент, если текущий результат пустой
if lResultElement is None and lChildFoundedElement is not None:
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
#Проверка вхождения по типу 2
else:
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
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
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
#Проверка вхождения по типу 2
else:
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
except Exception as e:
False == False
return lResultElement
@ -554,9 +591,9 @@ def ElementGetChildElementList(inControlSpecificationArray=[]):
#ctypes.windll.user32.MessageBoxW(0, str(inControlSpecificationArray), "Your title", 1)
if len(inControlSpecificationArray) > 0:
#Получить объект
lTempObject = GetControl(inControlSpecificationArray)
lTempObject = PywinautoExtElementGet(inControlSpecificationArray)
#Получить список дочерних объектов
lTempChildList = lTempObject.wrapper_object().children()
lTempChildList = lTempObject.children()
lIterator=0
#Подготовить результирующий объект
for lChild in lTempChildList:
@ -823,10 +860,10 @@ def GetRootElementList():
lResultList2.append(ElementInfoExportObject(lI));
return lResultList2
def ElementDrawOutlineNew(inSpecificationArray):
draw_outline_new(GetControl(inSpecificationArray))
draw_outline_new(PywinautoExtElementGet(inSpecificationArray))
return
def ElementDrawOutlineNewFocus(inSpecificationArray):
draw_outline_new_focus(GetControl(inSpecificationArray))
draw_outline_new_focus(PywinautoExtElementGet(inSpecificationArray))
return
def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None,inFlagSetFocus=False):
if lWrapperObject is not None:
@ -842,7 +879,7 @@ def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines
if inFlagSetFocus:
#Установить фокус на объект, чтобы было видно выделение
lWrapperObject.set_focus()
time.sleep(0.5)
#pdb.set_trace()
# don't draw if dialog is not visible
#if not lWrapperObject.is_visible():

Loading…
Cancel
Save