From 6c5b5abd0314edc766aa2d5a44f631e074effb4c Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Thu, 28 Mar 2019 23:19:22 +0300 Subject: [PATCH] #TreeViewFix #PywinautoExtElementGet_v1(only index) --- Index.xhtml | 2 +- winGUI.py | 171 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 105 insertions(+), 68 deletions(-) diff --git a/Index.xhtml b/Index.xhtml index db0a26fa..0398f2a0 100644 --- a/Index.xhtml +++ b/Index.xhtml @@ -64,7 +64,7 @@ ///Функция визуализации дерева mGlobal.ElementTree.fRender = function(inElementsTreeDataArray) { - var lHTMLList='
'; + var lHTMLList='
'; ///Циклический обход списка for (var i = 0; i< inElementsTreeDataArray.length;i++) { ///Добавить HTML код позиции diff --git a/winGUI.py b/winGUI.py index 6aad3aad..39c9e59f 100644 --- a/winGUI.py +++ b/winGUI.py @@ -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): + 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']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 (lResultElementX1lChildFoundedElementX2) 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 (lResultElementX1lChildFoundedElementX2) 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():