@ -14,11 +14,13 @@ import time
import traceback
import traceback
from . import ProcessCommunicator
from . import ProcessCommunicator
from . import JSONNormalize
from . import JSONNormalize
from . import Utils #For ProcessBitness
from threading import Timer
from threading import Timer
import datetime
import datetime
import logging
import logging
import re
import re
import copy
import copy
#Создать файл логирования
#Создать файл логирования
# add filemode="w" to overwrite
# add filemode="w" to overwrite
if not os . path . exists ( " Reports " ) :
if not os . path . exists ( " Reports " ) :
@ -34,7 +36,16 @@ mRobotLoggerFormatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)
mRobotLoggerFH . setFormatter ( mRobotLoggerFormatter )
mRobotLoggerFH . setFormatter ( mRobotLoggerFormatter )
# add handler to logger object
# add handler to logger object
mRobotLogger . addHandler ( mRobotLoggerFH )
mRobotLogger . addHandler ( mRobotLoggerFH )
############################################
#When import UIDesktop init the other bitness python
#For this type UIDesktop.Utils.ProcessBitness.SettingsInit(inSettingsDict)
#inSettingsDict = {
# "Python32FullPath": None, #Set from user: "..\\Resources\\WPy32-3720\\python-3.7.2\\OpenRPARobotGUIx32.exe"
# "Python64FullPath": None, #Set from user
# "Python32ProcessName": "OpenRPAUIDesktopX32.exe", #Config set once
# "Python64ProcessName": "OpenRPAUIDesktopX64.exe" #Config set once
#}
############################################
#logging.basicConfig(filename="Reports\ReportRobotGUIRun_"+datetime.datetime.now().strftime("%Y_%m_%d")+".log", level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
#logging.basicConfig(filename="Reports\ReportRobotGUIRun_"+datetime.datetime.now().strftime("%Y_%m_%d")+".log", level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
@ -258,14 +269,32 @@ def UIOSelector_Get_UIO (inSpecificationList,inElement=None,inFlagRaiseException
return lResult
return lResult
#################################################################################################
#################################################################################################
#Check if UIO exist (Identified by the UIOSelector)
#Check if UIO exist (Identified by the UIOSelector)
#inSpecificationList - UIOSelector
#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!!
#UIOSelector
#old name - -
#old name - -
def UIOSelector_Exist_Bool ( in SpecificationList ) :
def UIOSelector_Exist_Bool ( in UIOSelector ) :
lResult = False
lResult = False
#Получить родительский объект если на вход ничего не поступило
#Check the bitness
lResultList = UIOSelector_Get_UIOList ( inSpecificationList , None , False )
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
if len ( lResultList ) > 0 :
if lSafeOtherProcess is None :
lResult = True
#Получить родительский объект если на вход ничего не поступило
lResultList = UIOSelector_Get_UIOList ( inUIOSelector , None , False )
if len ( lResultList ) > 0 :
lResult = True
else :
# Run function from other process with help of PIPE
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_Exist_Bool " ,
" ArgumentList " : [ inUIOSelector ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
lResult = lPIPEResponseDict [ " Result " ]
return lResult
return lResult
#################################################################################################
#################################################################################################
#Wait for UIO is appear (at least one of them or all at the same time)
#Wait for UIO is appear (at least one of them or all at the same time)
@ -385,6 +414,21 @@ def UIOSelector_Get_BitnessInt (inSpecificationList):
lResult = 32
lResult = 32
return lResult
return lResult
#################################################################################################
#################################################################################################
#Get process bitness ("32" or "64")
#inSpecificationList - UIOSelector
#old name - None
#return None (if Process not found), int 32, or int 64
def UIOSelector_Get_BitnessStr ( inSpecificationList ) :
lResult = None
#Получить объект Application (Для проверки разрядности)
lRootElement = PWASpecification_Get_PWAApplication ( inSpecificationList )
if lRootElement is not None :
if lRootElement . is64bit ( ) :
lResult = " 64 "
else :
lResult = " 32 "
return lResult
#################################################################################################
#Get OS bitness (32 or 64)
#Get OS bitness (32 or 64)
#old name - None
#old name - None
#return int 32, or int 64
#return int 32, or int 64
@ -393,6 +437,20 @@ def Get_OSBitnessInt ():
if pywinauto . sysinfo . is_x64_OS ( ) :
if pywinauto . sysinfo . is_x64_OS ( ) :
lResult = 64 ;
lResult = 64 ;
return lResult ;
return lResult ;
#################################################################################################
#Safe get other process or None if destination app is the other/same bitness
#inUIOSelector - selector of the destination
#return None or process (of the other bitness)
def UIOSelector_SafeOtherGet_Process ( inUIOSelector ) :
#Default value
lResult = None
#Go check bitness if selector exists
if inUIOSelector :
#Get selector bitness
lUIOSelectorAppBitness = UIOSelector_Get_BitnessStr ( inUIOSelector )
if lUIOSelectorAppBitness and Utils . ProcessBitness . mSettingsDict [ " BitnessProcessCurrent " ] != lUIOSelectorAppBitness :
lResult = Utils . ProcessBitness . OtherProcessGet ( )
return lResult
##################################################################################################
##################################################################################################
#inControlSpecificationArray - List of dict, dict in pywinauto.find_windows notation
#inControlSpecificationArray - List of dict, dict in pywinauto.find_windows notation
#Backend selection - attribute "backend" ("win32" || "uia") in 1-st list element
#Backend selection - attribute "backend" ("win32" || "uia") in 1-st list element
@ -450,6 +508,7 @@ def PWASpecification_Get_UIO(inControlSpecificationArray):
#return process application object
#return process application object
#old name - None
#old name - None
def PWASpecification_Get_PWAApplication ( inControlSpecificationArray ) :
def PWASpecification_Get_PWAApplication ( inControlSpecificationArray ) :
inControlSpecificationArray = copy . deepcopy ( inControlSpecificationArray )
#Определение backend
#Определение backend
lBackend = mDefaultPywinautoBackend
lBackend = mDefaultPywinautoBackend
if " backend " in inControlSpecificationArray [ 0 ] :
if " backend " in inControlSpecificationArray [ 0 ] :
@ -523,48 +582,66 @@ def UIOSelector_SearchChildByMouse_UIO(inElementSpecification):
####################################################################################################
####################################################################################################
#inElementSpecification - UIOSelector
#inElementSpecification - UIOSelector
#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!!
#old name - AutomationSearchMouseElementHierarchy
#old name - AutomationSearchMouseElementHierarchy
def UIOSelector_SearchChildByMouse_UIOTree ( in ElementSpecification ) :
def UIOSelector_SearchChildByMouse_UIOTree ( in UIOSelector ) :
lItemInfo = [ ]
lItemInfo = [ ]
#Запустить функцию поиска элемента по мыши
#Check the bitness
lElementList = UIOSelector_SearchChildByMouse_UIO ( inElementSpecification )
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
lElement = lElementList [ - 1 ] [ ' element ' ]
if lSafeOtherProcess is None :
#Detect backend of the elements
#Запустить функцию поиска элемента по мыши
lFlagIsBackendWin32 = True
lElementList = UIOSelector_SearchChildByMouse_UIO ( inUIOSelector )
#Если объект имеется (не None), то выполнить построение иерархии
lElement = lElementList [ - 1 ] [ ' element ' ]
if lElement is not None :
#Detect backend of the elements
if lElement . backend . name == ' uia ' :
lFlagIsBackendWin32 = True
lFlagIsBackendWin32 = False
#Если объект имеется (не None), то выполнить построение иерархии
#Циклическое создание дерева
if lElement is not None :
#while lElement is not None:
if lElement . backend . name == ' uia ' :
lListIterator = 0
lFlagIsBackendWin32 = False
lItemInfo2 = lItemInfo
#Циклическое создание дерева
for lListItem in lElementList :
#while lElement is not None:
lElement = lListItem [ " element " ]
lListIterator = 0
#Продолжать построение иерархии во всех случаях кроме бэк uia & parent() is None
lItemInfo2 = lItemInfo
#if not lFlagIsBackendWin32 and lElement.parent() is None:
for lListItem in lElementList :
# lElement = None
lElement = lListItem [ " element " ]
#else:
#Продолжать построение иерархии во всех случаях кроме бэк uia & parent() is None
#Получить информацию про объект
#if not lFlagIsBackendWin32 and lElement.parent() is None:
lItemInfo2 . append ( UIOEI_Convert_UIOInfo ( lElement . element_info ) )
# lElement = None
#Дообогатить информацией о б индексе ребенка в родительском объекте
#else:
if " index " in lListItem :
#Получить информацию про объект
if lListItem [ " index " ] is not None :
lItemInfo2 . append ( UIOEI_Convert_UIOInfo ( lElement . element_info ) )
lItemInfo2 [ - 1 ] [ ' ctrl_index ' ] = lListItem [ " index " ]
#Дообогатить информацией о б индексе ребенка в родительском объекте
if " index " in lListItem :
if lListItem [ " index " ] is not None :
lItemInfo2 [ - 1 ] [ ' ctrl_index ' ] = lListItem [ " index " ]
else :
if " ctrl_index " in lListItem :
lItemInfo2 [ - 1 ] [ ' ctrl_index ' ] = lListItem [ " ctrl_index " ]
else :
else :
if " ctrl_index " in lListItem :
if " ctrl_index " in lListItem :
lItemInfo2 [ - 1 ] [ ' ctrl_index ' ] = lListItem [ " ctrl_index " ]
lItemInfo2 [ - 1 ] [ ' ctrl_index ' ] = lListItem [ " ctrl_index " ]
else :
#Оборачиваем потомка в массив, потому что у родителя по структуре интерфейса может быть больше одного наследников
if " ctrl_index " in lListItem :
lItemInfo2 [ - 1 ] [ ' SpecificationChild ' ] = [ ]
lItemInfo2 [ - 1 ] [ ' ctrl_index ' ] = lListItem [ " ctrl_index " ]
lItemInfo2 = lItemInfo2 [ - 1 ] [ ' SpecificationChild ' ]
#Оборачиваем потомка в массив, потому что у родителя по структуре интерфейса может быть больше одного наследников
#Переход на родительский объект
lItemInfo2 [ - 1 ] [ ' SpecificationChild ' ] = [ ]
#lElement = lElement.parent()
lItemInfo2 = lItemInfo2 [ - 1 ] [ ' SpecificationChild ' ]
lListIterator = lListIterator + 1
#Переход на родительский объект
#Добавить информацию о Backend в первый объект
#lElement = lElement.parent()
lItemInfo [ 0 ] [ " backend " ] = lElement . backend . name
lListIterator = lListIterator + 1
else :
#Добавить информацию о Backend в первый объект
# Run function from other process with help of PIPE
lItemInfo [ 0 ] [ " backend " ] = lElement . backend . name
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_SearchChildByMouse_UIOTree " ,
" ArgumentList " : [ inUIOSelector ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
lItemInfo = lPIPEResponseDict [ " Result " ]
#Вернуть результат
#Вернуть результат
return lItemInfo
return lItemInfo
####################################################################################################
####################################################################################################
@ -600,41 +677,36 @@ def UIO_GetCtrlIndex_Int(inElement):
return lResult
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
#inSpecificationList - UIOSelector
#old name - PywinautoExtElementsGetInfo
#old name - PywinautoExtElementsGetInfo
def UIOSelector_Get_UIOInfoList ( inSpecificationList , inElement = None ) :
def UIOSelector_Get_UIOInfoList ( inUIOSelector , inElement = None ) :
#Получить родительский объект если на вход ничего не поступило
#Check the bitness
lResultList = UIOSelector_Get_UIOList ( inSpecificationList , inElement )
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
lIterator = 0
if lSafeOtherProcess is None :
for lItem in lResultList :
#Получить родительский объект если на вход ничего не поступило
lResultList [ lIterator ] = UIOEI_Convert_UIOInfo ( lResultList [ lIterator ] . element_info )
lResultList = UIOSelector_Get_UIOList ( inUIOSelector , inElement )
lIterator = lIterator + 1
lIterator = 0
for lItem in lResultList :
lResultList [ lIterator ] = UIOEI_Convert_UIOInfo ( lResultList [ lIterator ] . element_info )
lIterator = lIterator + 1
else :
# Run function from other process with help of PIPE
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_Get_UIOInfoList " ,
" ArgumentList " : [ inUIOSelector , inElement ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
lResultList = lPIPEResponseDict [ " Result " ]
return lResultList
return lResultList
####################################################################################################
#Check is the UIO/UIO's by the UIOSelector exist
#inSpecificationList - UIOSelector
#old name - PywinautoExtElementExist
def UIOSelector_IsExist_Bool ( inSpecificationList ) :
return len ( UIOSelector_Get_UIOList ( inSpecificationList ) ) > 0
####################################################################################################
#Wait for the UIO by the UIOSelector appear
#inSpecificationList - UIOSelector
#result - { }
#old name - PywinautoExtElementWaitAppear
#############
#Внимание! Старая функция (на замену ей пришла UIOSelectorSecs_WaitAppear_Bool)
#############
def UIOSelector_WaitAppear_Dict ( inSpecificationList , inTimeout = 60 ) :
lTimeoutSeconds = 0
while ( not UIOSelector_IsExist_Bool ( inSpecificationList ) and inTimeout > lTimeoutSeconds ) :
lTimeoutSeconds = lTimeoutSeconds + 0.5
#Заснуть на полсекунды
time . sleep ( 0.5 )
return UIOSelector_IsExist_Bool ( inSpecificationList )
####################################################################################################
####################################################################################################
#Try to restore (maximize) window, if it's was minimized
#Try to restore (maximize) window, if it's was minimized
#(особенность uia backend - он не может прицепиться к окну, если оно свернуто)
#(особенность uia backend - он не может прицепиться к окну, если оно свернуто)
@ -655,72 +727,124 @@ def UIOSelector_TryRestore_Dict(inSpecificationList):
return lResult
return lResult
####################################################################################################
####################################################################################################
#Get the list of the UI object activities
#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
#inControlSpecificationArray - UIOSelector
#old name - ElementActionGetList
#old name - ElementActionGetList
def UIOSelector_Get_UIOActivityList ( inControlSpecificationArray ) :
def UIOSelector_Get_UIOActivityList ( inUIOSelector ) :
#Получить объект
#Check the bitness
lObject = UIOSelector_Get_UIO ( inControlSpecificationArray )
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
lActionList = dir ( lObject )
if lSafeOtherProcess is None :
lResult = dir ( lObject )
#Получить объект
#Выполнить чистку списка от неактуальных методов
lObject = UIOSelector_Get_UIO ( inUIOSelector )
for lActionItem in lActionList :
lActionList = dir ( lObject )
#Удалить те, которые начинаются на _
lResult = dir ( lObject )
if lActionItem [ 0 ] == ' _ ' :
#Выполнить чистку списка от неактуальных методов
lResult . remove ( lActionItem )
for lActionItem in lActionList :
#Удалить те, которые начинаются с символа верхнего регистра
#Удалить те, которые начинаются на _
if lActionItem [ 0 ] . isupper ( ) :
if lActionItem [ 0 ] == ' _ ' :
lResult . remove ( lActionItem )
lResult . remove ( lActionItem )
#Удалить те, которые начинаются с символа верхнего регистра
if lActionItem [ 0 ] . isupper ( ) :
lResult . remove ( lActionItem )
else :
# Run function from other process with help of PIPE
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_Get_UIOActivityList " ,
" ArgumentList " : [ inUIOSelector ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
lResult = lPIPEResponseDict [ " Result " ]
return lResult
return lResult
####################################################################################################
####################################################################################################
#Run the activity in UIO (UI Object)
#Run the activity in UIO (UI Object)
#inControlSpecificationArray - UIOSelector
#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!!
#inUIOSelector
#inActionName - UIOActivity (name) from Pywinauto
#inActionName - UIOActivity (name) from Pywinauto
#old name - ElementRunAction
#old name - ElementRunAction
def UIOSelectorUIOActivity_Run_Dict ( inControlSpecificationArray , inActionName , inArgumentList = [ ] , inkwArgumentObject = { } ) :
def UIOSelectorUIOActivity_Run_Dict ( in UIOSelector, inActionName , inArgumentList = [ ] , inkwArgumentObject = { } ) :
lResult = { }
lResult = { }
#Определить объект
#Check the bitness
lObject = UIOSelector_Get_UIO ( inControlSpecificationArray )
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
#Получить метод для вызова
#Run activity if SafeOtherProcess is None
lFunction = getattr ( lObject , inActionName )
if lSafeOtherProcess is None :
#Выполнить действие
#Определить объект
#Обернуто в безопасную обработку, тк для некоторых объектов метод не работает и может выдавать ошибку типа: NotImplementedError: This method not work properly for WinForms DataGrid, use cells()
lObject = UIOSelector_Get_UIO ( inUIOSelector )
try :
#Получить метод для вызова
return lFunction ( * inArgumentList , * * inkwArgumentObject )
lFunction = getattr ( lObject , inActionName )
except Exception as e :
#Выполнить действие
#Если ошибка возникла на action get_properties
#Обернуто в безопасную обработку, тк для некоторых объектов метод не работает и может выдавать ошибку типа: NotImplementedError: This method not work properly for WinForms DataGrid, use cells()
if inActionName == " get_properties " :
try :
lResult = { }
return lFunction ( * inArgumentList , * * inkwArgumentObject )
#Ручное формирование
except Exception as e :
lResult [ " class_name " ] = lObject . class_name ( )
#Если ошибка возникла на action get_properties
lResult [ " friendly_class_name " ] = lObject . friendly_class_name ( )
if inActionName == " get_properties " :
lResult [ " texts " ] = lObject . texts ( )
lResult = { }
lResult [ " control_id " ] = lObject . control_id ( )
#Ручное формирование
lResult [ " control_count " ] = lObject . control_count ( )
lResult [ " class_name " ] = lObject . class_name ( )
lResult [ " automation_id " ] = lObject . automation_id ( )
lResult [ " friendly_class_name " ] = lObject . friendly_class_name ( )
return lResult
lResult [ " texts " ] = lObject . texts ( )
lResult [ " control_id " ] = lObject . control_id ( )
lResult [ " control_count " ] = lObject . control_count ( )
lResult [ " automation_id " ] = lObject . automation_id ( )
return lResult
else :
raise e
else :
#Run function from other process with help of PIPE
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelectorUIOActivity_Run_Dict " ,
" ArgumentList " : [ inUIOSelector , inActionName , inArgumentList , inkwArgumentObject ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception ( f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
else :
raise e
lResult = lPIPEResponseDict [ " Result " ]
return lResult
return lResult
####################################################################################################
####################################################################################################
#Get the UIO dict of the attributes
#Get the UIO dict of the attributes
#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!!
#old name - ElementGetInfo
#old name - ElementGetInfo
def UIOSelector_Get_UIOInfo ( inControlSpecificationArray ) :
def UIOSelector_Get_UIOInfo ( inUIOSelector ) :
#Подготовка входного массива
#Check the bitness
inControlSpecificationArray = UIOSelector_SearchUIONormalize_UIOSelector ( inControlSpecificationArray )
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
#Выполнить идентификацию объектов, если передан массив
if lSafeOtherProcess is None :
lResultList = [ ] ;
#Подготовка входного массива
if len ( inControlSpecificationArray ) > 0 :
inUIOSelector = UIOSelector_SearchUIONormalize_UIOSelector ( inUIOSelector )
#Получить объект
#Выполнить идентификацию объектов, если передан массив
lTempObject = UIOSelector_Get_UIO ( inControlSpecificationArray )
lResultList = [ ] ;
#Получить инфо объект
if len ( inUIOSelector ) > 0 :
lTempObjectInfo = lTempObject . element_info
#Получить объект
#Добавить информацию о б обнаруженом объекте
lTempObject = UIOSelector_Get_UIO ( inUIOSelector )
lResultList . append ( UIOEI_Convert_UIOInfo ( lTempObjectInfo ) ) ;
#Получить инфо объект
lTempObjectInfo = lTempObject . element_info
#Добавить информацию о б обнаруженом объекте
lResultList . append ( UIOEI_Convert_UIOInfo ( lTempObjectInfo ) )
else :
# Run function from other process with help of PIPE
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_Get_UIOInfo " ,
" ArgumentList " : [ inUIOSelector ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
lResultList = lPIPEResponseDict [ " Result " ]
return lResultList
return lResultList
####################################################################################################
####################################################################################################
#Search child UIO by the: Parent UIO, X, Y
#Search child UIO by the: Parent UIO, X, Y
#inHierarchyList: [{"index":<>,"element":<>}] - technical argument for internal purpose
#inHierarchyList: [{"index":<>,"element":<>}] - technical argument for internal purpose
@ -812,35 +936,56 @@ def UIOXY_SearchChild_ListDict(inRootElement,inX,inY,inHierarchyList=[]):
###################################################################################################
###################################################################################################
#Get list of child UIO's by Parent UIOSelector
#Get list of child UIO's by Parent UIOSelector
#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!!
#inControlSpecificationArray- UIOSelector
#inControlSpecificationArray- UIOSelector
#old name - ElementGetChildElementList
#old name - ElementGetChildElementList
def UIOSelector_GetChildList_UIOList ( inControlSpecificationArray = [ ] , inBackend = mDefaultPywinautoBackend ) :
def UIOSelector_GetChildList_UIOList ( inUIOSelector = [ ] , inBackend = mDefaultPywinautoBackend ) :
#Подготовка входного массива
#mRobotLogger.info(f"File!!!!")
inControlSpecificationArray = UIOSelector_SearchUIONormalize_UIOSelector ( inControlSpecificationArray )
#mRobotLogger.info(f"inSelector:{str(inUIOSelector)}, inBackend:{str(inBackend)}")
#Выполнить идентификацию объектов, если передан массив
#pdb.set_trace()
lResultList = [ ] ;
#Check the bitness
#ctypes.windll.user32.MessageBoxW(0, str(inControlSpecificationArray), "Your title", 1)
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
if len ( inControlSpecificationArray ) > 0 :
if lSafeOtherProcess is None :
#Получить объект
#Подготовка входного массива
lTempObject = UIOSelector_Get_UIO ( inControlSpecificationArray )
inUIOSelector = UIOSelector_SearchUIONormalize_UIOSelector ( inUIOSelector )
#Получить список дочерних объектов
#Выполнить идентификацию объектов, если передан массив
lTempChildList = lTempObject . children ( )
lResultList = [ ]
lIterator = 0
#ctypes.windll.user32.MessageBoxW(0, str(inControlSpecificationArray), "Your title", 1)
#Подготовить результирующий объект
if len ( inUIOSelector ) > 0 :
for lChild in lTempChildList :
#Получить объект
lTempObjectInfo = lChild . element_info
lTempObject = UIOSelector_Get_UIO ( inUIOSelector )
#Добавить информацию о б обнаруженом объекте
#Получить список дочерних объектов
lObjectInfoItem = UIOEI_Convert_UIOInfo ( lTempObjectInfo )
lTempChildList = lTempObject . children ( )
#Итератор внутри объекта (для точной идентификации)
lIterator = 0
lObjectInfoItem [ ' ctrl_index ' ] = lIterator ;
#Подготовить результирующий объект
lResultList . append ( lObjectInfoItem ) ;
for lChild in lTempChildList :
#Инкремент счетчика
lTempObjectInfo = lChild . element_info
lIterator = lIterator + 1
#Добавить информацию о б обнаруженом объекте
lObjectInfoItem = UIOEI_Convert_UIOInfo ( lTempObjectInfo )
#Итератор внутри объекта (для точной идентификации)
lObjectInfoItem [ ' ctrl_index ' ] = lIterator
lResultList . append ( lObjectInfoItem )
#Инкремент счетчика
lIterator = lIterator + 1
else :
lResultList = BackendStr_GetTopLevelList_UIOInfo ( inBackend )
#Установка бэк-енда на первый элемент
for lItem in lResultList :
lItem [ " backend " ] = inBackend
else :
else :
lResultList = BackendStr_GetTopLevelList_UIOInfo ( inBackend )
# Run function from other process with help of PIPE
#Установка бэк-енда на первый элемент
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_GetChildList_UIOList " ,
for lItem in lResultList :
" ArgumentList " : [ inUIOSelector , inBackend ] ,
lItem [ " backend " ] = inBackend
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
lResultList = lPIPEResponseDict [ " Result " ]
return lResultList
return lResultList
####################################################################################################
####################################################################################################
@ -1080,17 +1225,53 @@ def BackendStr_GetTopLevelList_UIOInfo(inBackend=mDefaultPywinautoBackend):
###################################################################################################
###################################################################################################
#Highlight the UI object
#Highlight the UI object
#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!!
#old name - ElementDrawOutlineNew
#old name - ElementDrawOutlineNew
def UIOSelector_Highlight ( inSpecificationArray ) :
def UIOSelector_Highlight ( inUIOSelector ) :
UIO_Highlight ( UIOSelector_Get_UIO ( inSpecificationArray ) )
#Check the bitness
return
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
if lSafeOtherProcess is None :
UIO_Highlight ( UIOSelector_Get_UIO ( inUIOSelector ) )
else :
# Run function from other process with help of PIPE
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_Exist_Bool " ,
" ArgumentList " : [ inUIOSelector ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
return lPIPEResponseDict [ " Result " ]
return True
###################################################################################################
###################################################################################################
#inSpecificationArray - UIOSelector
#inSpecificationArray - UIOSelector
#!!!!!Safe call is included (you can set activity and UIDesktop will choose the bitness and return the result)!!!!!
#old name - ElementDrawOutlineNewFocus
#old name - ElementDrawOutlineNewFocus
def UIOSelector_FocusHighlight ( inSpecificationArray ) :
def UIOSelector_FocusHighlight ( inUIOSelector ) :
UIO_FocusHighlight ( UIOSelector_Get_UIO ( inSpecificationArray ) )
#Check the bitness
return
lSafeOtherProcess = UIOSelector_SafeOtherGet_Process ( inUIOSelector )
if lSafeOtherProcess is None :
UIO_FocusHighlight ( UIOSelector_Get_UIO ( inUIOSelector ) )
else :
# Run function from other process with help of PIPE
lPIPEResuestDict = { " ModuleName " : " UIDesktop " , " ActivityName " : " UIOSelector_Exist_Bool " ,
" ArgumentList " : [ inUIOSelector ] ,
" ArgumentDict " : { } }
# Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами
ProcessCommunicator . ProcessChildSendObject ( lSafeOtherProcess , lPIPEResuestDict )
# Get answer from child process
lPIPEResponseDict = ProcessCommunicator . ProcessChildReadWaitObject ( lSafeOtherProcess )
if lPIPEResponseDict [ " ErrorFlag " ] :
raise Exception (
f " Exception was occured in child process (message): { lPIPEResponseDict [ ' ErrorMessage ' ] } , (traceback): { lPIPEResponseDict [ ' ErrorTraceback ' ] } " )
else :
return lPIPEResponseDict [ " Result " ]
return True
###################################################################################################
###################################################################################################
#old name - draw_outline_new
#old name - draw_outline_new