diff --git a/Sources/pyOpenRPA/Robot/README.md b/Sources/pyOpenRPA/Robot/README.md index f5f30305..4ae5e05c 100644 --- a/Sources/pyOpenRPA/Robot/README.md +++ b/Sources/pyOpenRPA/Robot/README.md @@ -43,16 +43,5 @@ Resources\WPy64-3720\python-3.7.2.amd64\python.exe ] -# Open RPA Wiki -- [Home](https://gitlab.com/UnicodeLabs/OpenRPA/wikis/home) -- [04. Desktop app access (win32 & ui automation)](https://gitlab.com/UnicodeLabs/OpenRPA/wikis/04.-Desktop-app-access-(win32-&-ui-automation)) - -#Dependencies -* Python 3 x32 [psutil, pywinauto, wmi, PIL, keyboard, pyautogui, win32api (pywin32), selenium, openCV, tesseract, requests, lxml, PyMuPDF] -* Python 3 x64 [psutil, pywinauto, wmi, PIL, keyboard, pyautogui, win32api (pywin32), selenium, openCV, tesseract, requests, lxml, PyMuPDF] -* pywinauto (Windows GUI automation) -* Semantic UI CSS framework -* JsRender by https://www.jsviews.com (switch to Handlebars) -* Handlebars - -Created by Unicode Labs (Ivan Maslov) \ No newline at end of file + +Created by pyOpenRPA LLC (Ivan Maslov) \ No newline at end of file diff --git a/Sources/pyOpenRPA/Robot/UIDesktop.py b/Sources/pyOpenRPA/Robot/UIDesktop.py index e084d515..5b6d803b 100644 --- a/Sources/pyOpenRPA/Robot/UIDesktop.py +++ b/Sources/pyOpenRPA/Robot/UIDesktop.py @@ -29,7 +29,7 @@ import copy #TODO В перспективе нужно реализовать алгоритм определения разрядности не в Robot.py, а в UIDesktop.py, тк начинают появляться функции, на входе в которые еще неизвестна разрядность элемента + селектор может охватить сразу два элемента из 2-х разных разрядностей - обрабатываться это должно непосредственно при выполнении #################################### -#Info: GUI module of the Robot app (OpenRPA - Robot) +#Info: GUI module of the Robot app (pyOpenRPA - Robot) #################################### # GUI Module - interaction with Desktop application @@ -99,19 +99,27 @@ mDefaultPywinautoBackend="win32" # "rich_text" - наименование rich_text # } #] -################ -#return: List of UI Object -#inElement - Входной элемент - показатель, что не требуется выполнять коннект к процессу -#inFlagRaiseException - Флаг True - выкинуть ошибку в случае обнаружении пустого списка -#old name - PywinautoExtElementsGet + +#old:PywinautoExtElementsGet def UIOSelector_Get_UIOList (inSpecificationList,inElement=None,inFlagRaiseException=True): ''' - Get the UIO list by the selector + Получить список UIO объектов по UIO селектору + + .. code-block:: python - :param inSpecificationList: UIO Selector - :param inElement: Входной элемент - показатель, что не требуется выполнять коннект к процессу - :param inFlagRaiseException: Флаг True - выкинуть ошибку в случае обнаружении пустого списка - :return: + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"},{"title":"DEMO", "depth_start": 5, "depth_end": 5}] + lDemoBaseUIOList = UIDesktop.UIOSelector_Get_UIOList(lDemoBaseUIOSelector) #Получить список UIO объектов, которые удовлетворяют требованиям UIO селектора. В нашем примере либо [], либо [UIO объект] + + :param inSpecificationList: UIO Селектор, который определяет критерии поиска UI элементов + :type inSpecificationList: list, обязательный + :param inElement: Родительский элемент, от которого выполнить поиск UIO объектов по заданному UIO селектору. Если аргумент не задан, платформа выполнит поиск UIO объектов среди всех доступных приложений windows, которые запущены на текущей сессии + :type inElement: UIO объект, опциональный + :param inFlagRaiseException: True - формировать ошибку exception, если платформа не обнаружина ни одного UIO объекта по заданному UIO селектору. False - обратный случай. По умолчанию True + :type inFlagRaiseException: bool, опциональный + :return: Список UIO объектов, которые удовлетворяют условиям UIO селектора ''' #Создать копию входного листа, чтобы не менять массив в других верхнеуровневых функциях inSpecificationList=copy.deepcopy(inSpecificationList) @@ -235,20 +243,26 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None,inFlagRaiseExcep raise pywinauto.findwindows.ElementNotFoundError("Robot can't find element by the UIOSelector") return lResultList -################################################################################################# -#Get first (in more than one) UIO (UI Object) -#inSpecificationList - UIOSelector -#inElement - Входной элемент - показатель, что не требуется выполнять коннект к процессу -#inFlagRaiseException - Флаг True - выкинуть ошибку в случае обнаружении пустого списка -#old name - PywinautoExtElementGet +#old:PywinautoExtElementGet def UIOSelector_Get_UIO (inSpecificationList,inElement=None,inFlagRaiseException=True): ''' - Get the pywinauto object by the UIO selector. + Получить список UIO объект по UIO селектору. Если критериям UIO селектора удовлетворяет несколько UIO объектов - вернуть первый из списка + + .. code-block:: python - :param inSpecificationList: - :param inElement: - :param inFlagRaiseException: - :return: + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"},{"title":"DEMO", "depth_start": 5, "depth_end": 5}] + lDemoBaseUIOList = UIDesktop.UIOSelector_Get_UIO(lDemoBaseUIOSelector) #Получить 1-й UIO объект, которые удовлетворяет требованиям UIO селектора. В нашем примере либо None, либо UIO объект + + :param inSpecificationList: UIO Селектор, который определяет критерии поиска UI элементов + :type inSpecificationList: list, обязательный + :param inElement: Родительский элемент, от которого выполнить поиск UIO объектов по заданному UIO селектору. Если аргумент не задан, платформа выполнит поиск UIO объектов среди всех доступных приложений windows, которые запущены на текущей сессии + :type inElement: UIO объект, опциональный + :param inFlagRaiseException: True - формировать ошибку exception, если платформа не обнаружина ни одного UIO объекта по заданному UIO селектору. False - обратный случай. По умолчанию True + :type inFlagRaiseException: bool, опциональный + :return: UIO объект, которые удовлетворяют условиям UIO селектора, или None ''' lResult=None #Получить родительский объект если на вход ничего не поступило @@ -259,17 +273,25 @@ def UIOSelector_Get_UIO (inSpecificationList,inElement=None,inFlagRaiseException if lResult is None and inFlagRaiseException: raise pywinauto.findwindows.ElementNotFoundError("Robot can't find element by the UIOSelector") return lResult -################################################################################################# -#Check if UIO exist (Identified by the UIOSelector) -#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!! -#UIOSelector -#old name - - + +#old:- def UIOSelector_Exist_Bool (inUIOSelector): ''' - Check if object is exist by the UIO selector. + Проверить существование хотя бы 1-го UIO объекта по заданному UIO селектору + + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (32|64), КОТОРЫЕ ЗАПУЩЕНЫ В СЕСИИ. PYTHON x64 ИМЕЕТ ВОЗМОЖНОСТЬ ВЗЗАИМОДЕЙСТВИЯ С x32 UIO ОБЪЕКТАМИ, НО МЫ РЕКОМЕНДУЕМ ДОПОЛНИТЕЛЬНО ИСПОЛЬЗОВАТЬ ИНТЕРПРЕТАТОР PYTHON x32 (ПОДРОБНЕЕ СМ. ФУНКЦИЮ Configure()) + + .. code-block:: python - :param inUIOSelector: - :return: True - Object is exist. False - else case + # UIDesktop: Взаимодействие с UI объектами приложений + from pyOpenRPA.Robot import UIDesktop + # 1С: UIO Селектор выбора базы + lDemoBaseUIOSelector = [{"title":"Запуск 1С:Предприятия","class_name":"V8TopLevelFrameTaxiStarter","backend":"uia"},{"title":"DEMO", "depth_start": 5, "depth_end": 5}] + lDemoBaseUIOExistBool = UIDesktop.UIOSelector_Exist_Bool(lDemoBaseUIOSelector) # Получить булевый результат проверки существования UIO объекта + + :param inUIOSelector: UIO Селектор, который определяет критерии поиска UIO объектов + :type inUIOSelector: list, обязательный + :return: True - существует хотя бы 1 UIO объект. False - не существует ни одного UIO объекта по заданному UIO селектору ''' lResult=False #Check the bitness @@ -294,6 +316,8 @@ def UIOSelector_Exist_Bool (inUIOSelector): else: lResult = lPIPEResponseDict["Result"] return lResult + + ################################################################################################# #Wait for UIO is appear (at least one of them or all at the same time) #inSpecificationListList - List of the UIOSelector @@ -303,6 +327,7 @@ def UIOSelector_Exist_Bool (inUIOSelector): #old name - - #####Внимание##### ##Функция ожидания появления элементов (тк элементы могут быть недоступны, неизвестно в каком фреймворке каждый из них может появиться) + def UIOSelectorsSecs_WaitAppear_List (inSpecificationListList,inWaitSecs,inFlagWaitAllInMoment=False): ''' Wait for many UI object will appear in GUI for inWaitSecs seconds. diff --git a/changelog.md b/changelog.md index d1c9257a..31f57309 100644 --- a/changelog.md +++ b/changelog.md @@ -14,6 +14,7 @@ AGT - AGENT - - Keyboard, В каждую функцию добавил обработку пост ожидания, если это необходимо для стабилизации робота - - Mouse, Дополнил примеры в описание каждой функции - - Mouse, В каждую функцию добавил обработку пост ожидания, если это необходимо для стабилизации робота +- - UIDesktop, Переведен и дополнен [1.2.12]