From 671c5ecaa1d58058758313a6f6cbc4c048110901 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Wed, 15 Jun 2022 18:25:10 +0300 Subject: [PATCH] UIDesktop wiki in progress, fix Mouse module after docs --- Sources/pyOpenRPA/Robot/Mouse.py | 14 +- Sources/pyOpenRPA/Robot/UIDesktop.py | 194 ++++++++++++++++----------- 2 files changed, 124 insertions(+), 84 deletions(-) diff --git a/Sources/pyOpenRPA/Robot/Mouse.py b/Sources/pyOpenRPA/Robot/Mouse.py index 26f4cb85..f1905908 100644 --- a/Sources/pyOpenRPA/Robot/Mouse.py +++ b/Sources/pyOpenRPA/Robot/Mouse.py @@ -30,7 +30,7 @@ def Click(inXInt:int=None, inYInt:int=None, inClickCountInt:int=1, inIntervalSec :type inWaitAfterSecFloat: float, опциональный """ click(x=inXInt, y=inYInt, clicks=inClickCountInt, interval=inIntervalSecFloat, button=inButtonStr, duration=inMoveDurationSecFloat) - time.sleep(inWaitAfterSecFloat) + time.sleep(inWaitAfterSecFloat) def ClickDouble(inXInt:int=None, inYInt:int=None, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """Двойное нажатие левой клавиши мыши. Данное действие аналогично вызову функции (см. ниже). @@ -53,7 +53,7 @@ def ClickDouble(inXInt:int=None, inYInt:int=None, inWaitAfterSecFloat:float=WAIT :type inWaitAfterSecFloat: float, опциональный """ doubleClick(x=inXInt, y=inYInt) - time.sleep(inWaitAfterSecFloat) + time.sleep(inWaitAfterSecFloat) def Down(inXInt:int=None, inYInt:int=None, inButtonStr:str='left', inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """Переместить указатель по координатам inXInt, inYInt, после чего нажать (вниз) клавишу мыши и не отпускать до выполнения соответсвующей команды (см. Up). Если координаты inXInt, inYInt не переданы - нажатие происходит на тех координатах X/Y, на которых указатель мыши находится. @@ -76,7 +76,7 @@ def Down(inXInt:int=None, inYInt:int=None, inButtonStr:str='left', inWaitAfterSe :type inWaitAfterSecFloat: float, опциональный """ mouseDown(x=inXInt, y=inYInt, button = inButtonStr) - time.sleep(inWaitAfterSecFloat) + time.sleep(inWaitAfterSecFloat) def Up(inXInt:int=None, inYInt:int=None, inButtonStr:str='left', inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """Отпустить (вверх) клавишу мыши. Если координаты inXInt, inYInt не переданы - нажатие происходит на тех координатах X/Y, на которых указатель мыши находится. @@ -99,7 +99,7 @@ def Up(inXInt:int=None, inYInt:int=None, inButtonStr:str='left', inWaitAfterSecF :type inWaitAfterSecFloat: float, опциональный """ mouseUp(x=inXInt, y=inYInt, button = inButtonStr) - time.sleep(inWaitAfterSecFloat) + time.sleep(inWaitAfterSecFloat) def MoveTo(inXInt=None, inYInt=None, inMoveDurationSecFloat:float=0.0, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """Переместить указатель мыши на позицию inXInt, inYInt за время inMoveDurationSecFloat. @@ -122,7 +122,7 @@ def MoveTo(inXInt=None, inYInt=None, inMoveDurationSecFloat:float=0.0, inWaitAft :type inWaitAfterSecFloat: float, опциональный """ moveTo(x=inXInt, y=inYInt, duration=inMoveDurationSecFloat) - time.sleep(inWaitAfterSecFloat) + time.sleep(inWaitAfterSecFloat) def ScrollVertical(inScrollClickCountInt, inXInt=None, inYInt=None, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """Переместить указатель мыши на позицию inXInt, inYInt и выполнить вертикальную прокрутку (скроллинг) колесом мыши на количество щелчков inScrollClickCountInt. @@ -146,7 +146,7 @@ def ScrollVertical(inScrollClickCountInt, inXInt=None, inYInt=None, inWaitAfterS :type inWaitAfterSecFloat: float, опциональный """ vscroll(inScrollClickCountInt, x=inXInt, y=inYInt) - time.sleep(inWaitAfterSecFloat) + time.sleep(inWaitAfterSecFloat) def ScrollHorizontal(inScrollClickCountInt, inXInt=None, inYInt=None, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """!ТОЛЬКО ДЛЯ LINUX! Переместить указатель мыши на позицию inXInt, inYInt и выполнить горизонтальную прокрутку (скроллинг) виртуальным колесом мыши на количество щелчков inScrollClickCountInt. @@ -170,4 +170,4 @@ def ScrollHorizontal(inScrollClickCountInt, inXInt=None, inYInt=None, inWaitAfte :type inWaitAfterSecFloat: float, опциональный """ hscroll(inScrollClickCountInt, x=inXInt, y=inYInt) - time.sleep(inWaitAfterSecFloat) + time.sleep(inWaitAfterSecFloat) diff --git a/Sources/pyOpenRPA/Robot/UIDesktop.py b/Sources/pyOpenRPA/Robot/UIDesktop.py index 5b6d803b..78ddd23b 100644 --- a/Sources/pyOpenRPA/Robot/UIDesktop.py +++ b/Sources/pyOpenRPA/Robot/UIDesktop.py @@ -316,30 +316,34 @@ 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 -#inWaitSecs - Время ожидания объекта в секундах -#inFlagWaitAllInMoment - доп. условие - ожидать появление всех UIOSelector одновременно -#return: [0,1,2] - index of UIOSpecification, which is appear -#old name - - -#####Внимание##### -##Функция ожидания появления элементов (тк элементы могут быть недоступны, неизвестно в каком фреймворке каждый из них может появиться) - -def UIOSelectorsSecs_WaitAppear_List (inSpecificationListList,inWaitSecs,inFlagWaitAllInMoment=False): +#old: - +def UIOSelectorsSecs_WaitAppear_List (inSpecificationListList,inWaitSecs=86400.0,inFlagWaitAllInMoment=False): ''' - Wait for many UI object will appear in GUI for inWaitSecs seconds. + Ожидать появление хотя бы 1-го / всех UIO объектов по заданным UIO селекторам + + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (32|64), КОТОРЫЕ ЗАПУЩЕНЫ В СЕСИИ. PYTHON x64 ИМЕЕТ ВОЗМОЖНОСТЬ ВЗЗАИМОДЕЙСТВИЯ С x32 UIO ОБЪЕКТАМИ, НО МЫ РЕКОМЕНДУЕМ ДОПОЛНИТЕЛЬНО ИСПОЛЬЗОВАТЬ ИНТЕРПРЕТАТОР PYTHON x32 (ПОДРОБНЕЕ СМ. ФУНКЦИЮ Configure()) + + .. code-block:: python - :param inSpecificationListList: UIOSelector list. - Example: [ + # 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}] + lNotepadOKSelector = [{"title":"notepad"},{"title":"OK"}] + lNotepadCancelSelector = [{"title":"notepad"},{"title":"Cancel"}] + lDemoBaseUIOExistList = UIDesktop.UIOSelectorsSecs_WaitAppear_List([lDemoBaseUIOSelector, lNotepadOKSelector, lNotepadCancelSelector]) # Ожидать появление UIO объекта + + :param inSpecificationListList: Список UIO селекторов, которые определяют критерии поиска UIO объектов + Пример: [ [{"title":"notepad"},{"title":"OK"}], [{"title":"notepad"},{"title":"Cancel"}] ] - :param inWaitSecs: Float value (seconds) for wait UI element appear in GUI - :param inFlagWaitAllInMoment: True - Wait all UI objects from the UIOSelector list to be appeared - :return: List of index, which UI object UIO will be appeared. Example: [1] # Appear only UI object with UIO selector: [{"title":"notepad"},{"title":"Cancel"}] + :type inSpecificationListList: list, обязательный + :param inWaitSecs: Количество секунд, которые отвести на ожидание UIO объектов. По умолчанию 24 часа (86400 секунд) + :type inWaitSecs: float, необязательный + :param inFlagWaitAllInMoment: True - Ожидать до того момента, пока не появятся все запрашиваемые UIO объекты на рабочей области + :return: Список индексов, которые указывают на номер входящих UIO селекторов, которые были обнаружены на рабочей области. Пример: [0,2] ''' lResultFlag=False lSecsSleep = 1 #Настроечный параметр @@ -370,29 +374,36 @@ def UIOSelectorsSecs_WaitAppear_List (inSpecificationListList,inWaitSecs,inFlagW lSecsDone=lSecsDone+lSecsSleep time.sleep(lSecsSleep) return lResultList -################################################################################################# -#Wait for UIO is Disappear (at least one of them or all at the same time) -#inSpecificationListList - List of the UIOSelector -#inWaitSecs - Время ожидания пропажи объекта в секундах -#inFlagWaitAllInMoment - доп. условие - ожидать пропажу всех UIOSelector одновременно -#return: [0,1,2] - index of UIOSpecification, which is Disappear -#old name - - -#####Внимание##### -##Функция ожидания пропажи элементов (тк элементы могут быть недоступны, неизвестно в каком фреймворке каждый из них может появиться) -def UIOSelectorsSecs_WaitDisappear_List (inSpecificationListList,inWaitSecs,inFlagWaitAllInMoment=False): + +#old: - +def UIOSelectorsSecs_WaitDisappear_List (inSpecificationListList,inWaitSecs=86400.0,inFlagWaitAllInMoment=False): ''' - Wait for many UI object will disappear in GUI for inWaitSecs seconds. + Ожидать исчезновение хотя бы 1-го / всех UIO объектов по заданным UIO селекторам + + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (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"},{"title":"DEMO", "depth_start": 5, "depth_end": 5}] + lNotepadOKSelector = [{"title":"notepad"},{"title":"OK"}] + lNotepadCancelSelector = [{"title":"notepad"},{"title":"Cancel"}] + lDemoBaseUIOExistList = UIDesktop.UIOSelectorsSecs_WaitDisappear_List([lDemoBaseUIOSelector, lNotepadOKSelector, lNotepadCancelSelector]) # Ожидать исчезновение UIO объектов - :param inSpecificationListList: UIOSelector list. - Example: [ + :param inSpecificationListList: Список UIO селекторов, которые определяют критерии поиска UIO объектов + Пример: [ [{"title":"notepad"},{"title":"OK"}], [{"title":"notepad"},{"title":"Cancel"}] ] - :param inWaitSecs: Float value (seconds) for wait UI element disappear in GUI - :param inFlagWaitAllInMoment: True - Wait all UI objects from the UIOSelector list to be disappeared. - :return: List of index, which UI object UIO will be disappeared. Example: [1] # Disappear only UI object with UIO selector: [{"title":"notepad"},{"title":"Cancel"}] - :return: + :type inSpecificationListList: list, обязательный + :param inWaitSecs: Количество секунд, которые отвести на ожидание исчезновения UIO объектов. По умолчанию 24 часа (86400 секунд) + :type inWaitSecs: float, необязательный + :param inFlagWaitAllInMoment: True - Ожидать до того момента, пока не исчезнут все запрашиваемые UIO объекты на рабочей области + :return: Список индексов, которые указывают на номер входящих UIO селекторов, которые были обнаружены на рабочей области. Пример: [0,2] ''' + lResultFlag=False lSecsSleep = 1 #Настроечный параметр lSecsDone = 0 @@ -422,56 +433,77 @@ def UIOSelectorsSecs_WaitDisappear_List (inSpecificationListList,inWaitSecs,inFl lSecsDone=lSecsDone+lSecsSleep time.sleep(lSecsSleep) return lResultList -################################################################################################# -#Wait for UIO is appear (at least one of them or all at the same time) -#inSpecificationList - UIOSelector -#inWaitSecs - Время ожидания объекта в секундах -#return: Bool - True - UIO is appear -#old name - - + +#old: - def UIOSelectorSecs_WaitAppear_Bool (inSpecificationList,inWaitSecs): ''' - Wait for UI object will appear in GUI for inWaitSecs seconds. + Ожидать появление 1-го UIO объекта по заданному UIO селектору + + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (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"},{"title":"DEMO", "depth_start": 5, "depth_end": 5}] + lDemoBaseUIOExistBool = UIDesktop.UIOSelectorSecs_WaitAppear_Bool(lDemoBaseUIOSelector) # Ожидать появление UIO объекта - :param inSpecificationList: UIOSelector. Example: [{"title":"notepad"},{"title":"OK"}] - :param inWaitSecs: Float value (seconds) for wait UI element appear in GUI - :return: True - UI object will appear. False - else case + :param inSpecificationList: UIO селектор, который определяет критерии поиска UIO объекта + :type inSpecificationList: list, обязательный + :param inWaitSecs: Количество секунд, которые отвести на ожидание UIO объекта. По умолчанию 24 часа (86400 секунд) + :type inWaitSecs: float, необязательный + :return: True - UIO объект был обнаружен. False - обратная ситуациая ''' lWaitAppearList=UIOSelectorsSecs_WaitAppear_List([inSpecificationList],inWaitSecs) lResult=False if len(lWaitAppearList)>0: lResult=True return lResult -################################################################################################# -#Wait for UIO is disappear (at least one of them or all at the same time) -#inSpecificationList - UIOSelector -#inWaitSecs - Время ожидания пропажи объекта в секундах -#return: Bool - True - UIO is Disappear + #old name - - def UIOSelectorSecs_WaitDisappear_Bool (inSpecificationList,inWaitSecs): ''' - Wait for UI object will disappear in GUI for inWaitSecs seconds. + Ожидать исчезновение 1-го UIO объекта по заданному UIO селектору + + !ВНИМАНИЕ! ДАННАЯ ФУНКЦИОНАЛЬНОСТЬ В АВТОМАТИЧЕСКОМ РЕЖИМЕ ПОДДЕРЖИВАЕТ ВСЕ РАЗРЯДНОСТИ ПРИЛОЖЕНИЙ (32|64), КОТОРЫЕ ЗАПУЩЕНЫ В СЕСИИ. PYTHON x64 ИМЕЕТ ВОЗМОЖНОСТЬ ВЗЗАИМОДЕЙСТВИЯ С x32 UIO ОБЪЕКТАМИ, НО МЫ РЕКОМЕНДУЕМ ДОПОЛНИТЕЛЬНО ИСПОЛЬЗОВАТЬ ИНТЕРПРЕТАТОР PYTHON x32 (ПОДРОБНЕЕ СМ. ФУНКЦИЮ Configure()) + + .. code-block:: python - :param inSpecificationList: UIOSelector. - Example: [{"title":"notepad"},{"title":"OK"}] - :param inWaitSecs: Float value (seconds) for wait UI element disappear in GUI - :return: True - UI object will disappear. 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.UIOSelectorSecs_WaitDisappear_Bool(lDemoBaseUIOSelector) # Ожидать исчезновение UIO объекта + + :param inSpecificationList: UIO селектор, который определяет критерии поиска UIO объекта + :type inSpecificationList: list, обязательный + :param inWaitSecs: Количество секунд, которые отвести на исчезновение UIO объекта. По умолчанию 24 часа (86400 секунд) + :type inWaitSecs: float, необязательный + :return: True - UIO объект был обнаружен. False - обратная ситуациая ''' lWaitDisappearList=UIOSelectorsSecs_WaitDisappear_List([inSpecificationList],inWaitSecs) lResult=False if len(lWaitDisappearList)>0: lResult=True return lResult -################################################################################################# -#Get process bitness (32 or 64) -#inSpecificationList - UIOSelector -#old name - None -#return None (if Process not found), int 32, or int 64 + +#old: - def UIOSelector_Get_BitnessInt (inSpecificationList): ''' - Detect process bitness by the UI Object UIO Selector. + Определить разрядность приложения по UIO селектору. Вернуть результат в формате целого числа (64 или 32) + + .. code-block:: python + + # 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}] + lDemoBaseBitInt = UIDesktop.UIOSelector_Get_BitnessInt(lDemoBaseUIOSelector) # Определить разрядность приложения, в котором обнаружен UIO объект по селектору - :param inSpecificationList: UIOSelector. Example: [{"title":"notepad"},{"title":"OK"}] - :return: int 32 or int 64 + :param inSpecificationList: UIO селектор, который определяет критерии поиска UIO объекта + :type inSpecificationList: list, обязательный + :return: None - UIO объект не обнаружен; 64 (int) - разрядность приложения равна 64 битам; 32 (int) - разрядность приложения равна 32 битам ''' lResult=None #Получить объект Application (Для проверки разрядности) @@ -482,17 +514,23 @@ def UIOSelector_Get_BitnessInt (inSpecificationList): else: lResult=32 return lResult -################################################################################################# -#Get process bitness ("32" or "64") -#inSpecificationList - UIOSelector -#old name - None -#return None (if Process not found), int 32, or int 64 + +#old: - def UIOSelector_Get_BitnessStr (inSpecificationList): ''' - Detect process bitness by the UI Object UIO Selector. + Определить разрядность приложения по UIO селектору. Вернуть результат в формате строки ("64" или "32") - :param inSpecificationList: UIOSelector. Example: [{"title":"notepad"},{"title":"OK"}] - :return: str "32" or str "64" + .. code-block:: python + + # 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}] + lDemoBaseBitStr = UIDesktop.UIOSelector_Get_BitnessStr(lDemoBaseUIOSelector) # Определить разрядность приложения, в котором обнаружен UIO объект по селектору + + :param inSpecificationList: UIO селектор, который определяет критерии поиска UIO объекта + :type inSpecificationList: list, обязательный + :return: None - UIO объект не обнаружен; "64" (str) - разрядность приложения равна 64 битам; "32" (str) - разрядность приложения равна 32 битам ''' lResult=None #Получить объект Application (Для проверки разрядности) @@ -503,15 +541,17 @@ def UIOSelector_Get_BitnessStr (inSpecificationList): else: lResult="32" return lResult -################################################################################################# -#Get OS bitness (32 or 64) -#old name - None -#return int 32, or int 64 + +#old: - def Get_OSBitnessInt (): ''' - Detect OS bitness. + Определить разрядность робота, в котором запускается данная функция + + .. code-block:: python - :return: int 32 or int 64 + from pyOpenRPA.Robot import UIDesktop + lRobotBitInt = UIDesktop.Get_OSBitnessInt() # Определить разрядность робота, в котором была вызвана это функция + :return: 64 (int) - разрядность приложения равна 64 битам; 32 (int) - разрядность приложения равна 32 битам ''' lResult=32 if pywinauto.sysinfo.is_x64_OS():