From 7d76920a36e3d6dbe3122c6a1b333ff4e68b5c92 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Thu, 16 Jun 2022 12:26:16 +0300 Subject: [PATCH] =?UTF-8?q?wiki:=202/3=20UIDesktop=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=BE!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/pyOpenRPA/Robot/UIDesktop.py | 139 ++++++++++++++++++++------- 1 file changed, 104 insertions(+), 35 deletions(-) diff --git a/Sources/pyOpenRPA/Robot/UIDesktop.py b/Sources/pyOpenRPA/Robot/UIDesktop.py index 1904b249..9c9c9cf5 100644 --- a/Sources/pyOpenRPA/Robot/UIDesktop.py +++ b/Sources/pyOpenRPA/Robot/UIDesktop.py @@ -867,10 +867,24 @@ def UIOSelector_SearchChildByMouse_UIOTree(inUIOSelector): lItemInfo = lPIPEResponseDict["Result"] #Вернуть результат return lItemInfo -#################################################################################################### -#inElement- UIO (UI Object) #old name - PywinautoExtElementCtrlIndexGet def UIO_GetCtrlIndex_Int(inElement): + """ + Получить индекс UIO объекта inElement в списке родительского UIO объекта. + + .. code-block:: python + + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"}] + lUIO = UIDesktop.UIOSelector_Get_UIO(lDemoBaseUIOSelector) # Получить UIO объект по UIO селектору. + lUIOIndexInt = UIDesktop.UIO_GetCtrlIndex_Int(lUIO) # Получить индекс UIO объекта в списке у родительского UIO объекта. + + :param inElement: UIO объект, для которого требуется определить индекс в списке родительского UIO объекта. + :type inElement: list, обязательный + :return: int, индекс UIO объекта в списке родительского UIO объекта + """ lResult = None #Выполнить алгоритм, если есть Element if inElement is not None: @@ -899,12 +913,27 @@ def UIO_GetCtrlIndex_Int(inElement): #Вернуть результат return lResult -#################################################################################################### -# Get the UIO Info list for the selected criteria -#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!! -#inSpecificationList - UIOSelector -#old name - PywinautoExtElementsGetInfo +#old: - PywinautoExtElementsGetInfo def UIOSelector_Get_UIOInfoList (inUIOSelector, inElement=None): + """ + Техническая функция: Получить список параметров последних уровней UIO селектора по UIO объектам, которые удовлетворяют входящим inUIOSelector, поиск по которым будет производится от уровня inElement. + + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (32|64), КОТОРЫЕ ЗАПУЩЕНЫ В СЕСИИ. PYTHON x64 ИМЕЕТ ВОЗМОЖНОСТЬ ВЗЗАИМОДЕЙСТВИЯ С x32 UIO ОБЪЕКТАМИ, НО МЫ РЕКОМЕНДУЕМ ДОПОЛНИТЕЛЬНО ИСПОЛЬЗОВАТЬ ИНТЕРПРЕТАТОР PYTHON x32 (ПОДРОБНЕЕ СМ. ФУНКЦИЮ Configure()) + + .. code-block:: python + + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"}] + lUIOInfoList = UIDesktop.UIOSelector_Get_UIOInfoList(lDemoBaseUIOSelector) # Получить словарь параметров по UIO селектору. + + :param inUIOSelector: UIO селектор, который определяет UIO объект, для которого будет произведено извлечение всех атрибутов на всех уровнях. + :type inUIOSelector: list, обязательный + :param inElement: UIO объект, от которого выполнить поиск дочерних UIO объектов по UIO селектору inUIOSelector. По умолчанию None - поиск среди всех приложений. + :type inElement: UIO объект, необязательный + :return: dict, пример: {"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} + """ #Check the bitness lSafeOtherProcess = UIOSelector_SafeOtherGet_Process(inUIOSelector) if lSafeOtherProcess is None: @@ -930,17 +959,25 @@ def UIOSelector_Get_UIOInfoList (inUIOSelector, inElement=None): lResultList = lPIPEResponseDict["Result"] return lResultList -#################################################################################################### -#Try to restore (maximize) window, if it's was minimized -#(особенность uia backend - он не может прицепиться к окну, если оно свернуто) -#inSpecificationList - UIOSelector -#old name - PywinautoExtTryToRestore +#old: - PywinautoExtTryToRestore def UIOSelector_TryRestore_Dict(inSpecificationList): """ - Try to restore (maximize) window, if it's minimized. (!IMPORTANT! When use UIA framework minimized windows doesn't appear by the UIOSelector. You need to try restore windows and after that try to get UIO) + Восстановить окно приложения на экране по UIO селектору inSpecificationList, если оно было свернуто. Функция обернута в try .. except - ошибок не возникнет. - :param inSpecificationList: UIOSelector - List of items, which contains condition attributes - :return: + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ УЖЕ ИСПОЛЬЗУЕТСЯ В РЯДЕ ДРУГИХ ФУНКЦИЙ ТАК КАК АДРЕССАЦИЯ ПО UIA FRAMEWORK НЕДОСТУПНА, ЕСЛИ ПРИЛОЖЕНИЕ СВЕРНУТО. + + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (32|64), КОТОРЫЕ ЗАПУЩЕНЫ В СЕСИИ. PYTHON x64 ИМЕЕТ ВОЗМОЖНОСТЬ ВЗЗАИМОДЕЙСТВИЯ С x32 UIO ОБЪЕКТАМИ, НО МЫ РЕКОМЕНДУЕМ ДОПОЛНИТЕЛЬНО ИСПОЛЬЗОВАТЬ ИНТЕРПРЕТАТОР PYTHON x32 (ПОДРОБНЕЕ СМ. ФУНКЦИЮ Configure()) + + .. code-block:: python + + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"}] + UIDesktop.UIOSelector_TryRestore_Dict(lDemoBaseUIOSelector) # Попытка восстановления свернутого окна по UIO селектору. + + :param inSpecificationList: UIO селектор, который определяет UIO объект, для которого будет произведено извлечение всех атрибутов на всех уровнях. + :type inSpecificationList: list, обязательный """ lResult={} try: @@ -954,17 +991,24 @@ def UIOSelector_TryRestore_Dict(inSpecificationList): except Exception: True==False return lResult -#################################################################################################### -#Get the list of the UI object activities -#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!! -#inControlSpecificationArray - UIOSelector -#old name - ElementActionGetList + +#old: - ElementActionGetList def UIOSelector_Get_UIOActivityList (inUIOSelector): """ - Get the list of the UI object activities + Получить список доступных действий/функций по UIO селектору inUIOSelector. Описание возможных активностей см. ниже. - :param inUIOSelector: UIOSelector - List of items, which contains condition attributes - :return: + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (32|64), КОТОРЫЕ ЗАПУЩЕНЫ В СЕСИИ. PYTHON x64 ИМЕЕТ ВОЗМОЖНОСТЬ ВЗЗАИМОДЕЙСТВИЯ С x32 UIO ОБЪЕКТАМИ, НО МЫ РЕКОМЕНДУЕМ ДОПОЛНИТЕЛЬНО ИСПОЛЬЗОВАТЬ ИНТЕРПРЕТАТОР PYTHON x32 (ПОДРОБНЕЕ СМ. ФУНКЦИЮ Configure()) + + .. code-block:: python + + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"}] + lActivityList = UIDesktop.UIOSelector_Get_UIOActivityList(lDemoBaseUIOSelector) # Получить список активностей по UIO селектору. + + :param inUIOSelector: UIO селектор, который определяет UIO объект, для которого будет представлен перечень доступных активностей. + :type inUIOSelector: list, обязательный """ #Check the bitness lSafeOtherProcess = UIOSelector_SafeOtherGet_Process(inUIOSelector) @@ -997,21 +1041,30 @@ def UIOSelector_Get_UIOActivityList (inUIOSelector): lResult = lPIPEResponseDict["Result"] return lResult -#################################################################################################### -#Run the activity in UIO (UI Object) -#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!! -#inUIOSelector -#inActionName - UIOActivity (name) from Pywinauto -#old name - ElementRunAction +#old: - ElementRunAction def UIOSelectorUIOActivity_Run_Dict(inUIOSelector, inActionName, inArgumentList=None, inkwArgumentObject=None): """ - Run the activity in UIO (UI Object) + Выполнить активность inActionName над UIO объектом, полученным с помощью UIO селектора inUIOSelector. Описание возможных активностей см. ниже. - :param inUIOSelector: UIOSelector - List of items, which contains condition attributes - :param inActionName: UIOActivity (name) activity name string from Pywinauto - :param inArgumentList: - :param inkwArgumentObject: - :return: + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (32|64), КОТОРЫЕ ЗАПУЩЕНЫ В СЕСИИ. PYTHON x64 ИМЕЕТ ВОЗМОЖНОСТЬ ВЗЗАИМОДЕЙСТВИЯ С x32 UIO ОБЪЕКТАМИ, НО МЫ РЕКОМЕНДУЕМ ДОПОЛНИТЕЛЬНО ИСПОЛЬЗОВАТЬ ИНТЕРПРЕТАТОР PYTHON x32 (ПОДРОБНЕЕ СМ. ФУНКЦИЮ Configure()) + + .. code-block:: python + + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"}] + lActivityResult = UIDesktop.UIOSelectorUIOActivity_Run_Dict(lDemoBaseUIOSelector, "click") # выполнить действие над UIO объектом с помощью UIO селектора. + + :param inUIOSelector: UIO селектор, который определяет UIO объект, для которого будет представлен перечень доступных активностей. + :type inUIOSelector: list, обязательный + :param inActionName: наименование активности, которую требуется выполнить над UIO объектом + :type inActionName: str, обязательный + :param inArgumentList: список передаваемых неименованных аргументов в функцию inActionName + :type inArgumentList: list, необязательный + :param inkwArgumentObject: словарь передаваемых именованных аргументов в функцию inActionName + :type inkwArgumentObject: dict, необязательный + :return: возвращает результат запускаемой функции с наименованием inActionName над UIO объектом """ if inArgumentList is None: inArgumentList=[] # 2021 02 22 Minor fix by Ivan Maslov if inkwArgumentObject is None: inkwArgumentObject={} # 2021 02 22 Minor fix by Ivan Maslov @@ -1407,6 +1460,22 @@ def UIOSelector_SearchProcessNormalize_UIOSelector (inControlSpecificationArray) #inElementInfo - UIOEI #old name - ElementInfoExportObject def UIOEI_Convert_UIOInfo(inElementInfo): + """ + Техническая функция: Дообогащение словаря с параметрами UIO объекта по заданному UIO.element_info + + .. code-block:: python + + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"}] + lUIO = UIDesktop.UIOSelector_Get_UIO(lDemoBaseUIOSelector) # Получить UIO объект по UIO селектору. + lUIOProcessInfoDict = UIDesktop.UIOEI_Convert_UIOInfo(lUIO.element_info) + + :param inElementInfo: экземпляр класса UIO.element_info, для которого требуется дообогатить словарь с параметрами (в дальнейшем можно использовать как элемент UIO селектора). + :type inElementInfo: object, обязательный + :return: dict, пример: {"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} + """ #Подготовить выходную структуру данных 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