@ -23,7 +23,20 @@ import copy
# add filemode="w" to overwrite
if not os . path . exists ( " Reports " ) :
os . makedirs ( " Reports " )
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 " )
##########################
#Подготовка логгера Robot
#########################
mRobotLogger = logging . getLogger ( " RobotLogger " )
mRobotLogger . setLevel ( logging . INFO )
# create the logging file handler
mRobotLoggerFH = logging . FileHandler ( " Reports \ ReportRobotGUIRun_ " + datetime . datetime . now ( ) . strftime ( " % Y_ % m_ %d " ) + " .log " )
mRobotLoggerFormatter = logging . Formatter ( ' %(asctime)s - %(name)s - %(levelname)s - %(message)s ' )
mRobotLoggerFH . setFormatter ( mRobotLoggerFormatter )
# add handler to logger object
mRobotLogger . addHandler ( mRobotLoggerFH )
#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")
#####Внимание#######
#TODO В перспективе нужно реализовать алгоритм определения разрядности не в Robot.py, а в GUI.py, тк начинают появляться функции, на входе в которые еще неизвестна разрядность элемента + селектор может охватить сразу два элемента из 2-х разных разрядностей - обрабатываться это должно непосредственно при выполнении
@ -105,6 +118,8 @@ mDefaultPywinautoBackend="win32"
#inFlagRaiseException - Флаг True - выкинуть ошибку в случае обнаружении пустого списка
#old name - PywinautoExtElementsGet
def UIOSelector_Get_UIOList ( inSpecificationList , inElement = None , inFlagRaiseException = True ) :
#Создать копию входного листа, чтобы не менять массив в других верхнеуровневых функциях
inSpecificationList = copy . deepcopy ( inSpecificationList )
lResultList = [ ]
lChildrenList = [ ]
#Получить родительский объект если на вход ничего не поступило
@ -125,14 +140,16 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None,inFlagRaiseExcep
#Получить дочерний элемент - точное добавление
lChildrenList . append ( lElementChildrenList [ inSpecificationList [ 0 ] [ ' index ' ] ] )
else :
raise ValueError ( ' Object has no children with index: ' + str ( inSpecificationList [ 0 ] [ ' index ' ] ) )
if inFlagRaiseException :
raise ValueError ( ' Object has no children with index: ' + str ( inSpecificationList [ 0 ] [ ' index ' ] ) )
#Поступил ctrl_index - точное добавление
elif ' ctrl_index ' in inSpecificationList [ 0 ] :
if inSpecificationList [ 0 ] [ ' ctrl_index ' ] < len ( lElementChildrenList ) :
#Получить дочерний элемент
lChildrenList . append ( lElementChildrenList [ inSpecificationList [ 0 ] [ ' ctrl_index ' ] ] )
else :
raise ValueError ( ' Object has no children with index: ' + str ( inSpecificationList [ 0 ] [ ' ctrl_index ' ] ) )
if inFlagRaiseException :
raise ValueError ( ' Object has no children with index: ' + str ( inSpecificationList [ 0 ] [ ' ctrl_index ' ] ) )
#Если нет точного обозначения элемента
else :
lFlagGoCheck = True
@ -257,6 +274,7 @@ def UIOSelectorsSecs_WaitAppear_List (inSpecificationListList,inWaitSecs,inFlagW
lResultList = None
#Цикл проверки
while lResultFlag == False and lSecsDone < inWaitSecs :
#pdb.set_trace()
lResultList = [ ]
#Итерация проверки
lIndex = 0
@ -280,6 +298,45 @@ def UIOSelectorsSecs_WaitAppear_List (inSpecificationListList,inWaitSecs,inFlagW
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 ) :
lResultFlag = False
lSecsSleep = 1 #Настроечный параметр
lSecsDone = 0
lResultList = None
#Цикл проверки
while lResultFlag == False and lSecsDone < inWaitSecs :
#pdb.set_trace()
lResultList = [ ]
#Итерация проверки
lIndex = 0
for lItem in inSpecificationListList :
lItemResultFlag = UIOSelector_Exist_Bool ( lItem )
#Если обнаружен элемент - добавить е г о индекс в массив
if not lItemResultFlag :
lResultList . append ( lIndex )
#Инкремент индекса
lIndex = lIndex + 1
#Проверка в зависимости от флага
if inFlagWaitAllInMoment and len ( lResultList ) == len ( inSpecificationListList ) :
#Условие выполнено
lResultFlag = True
elif not inFlagWaitAllInMoment and len ( lResultList ) > 0 :
#Условие выполнено
lResultFlag = True
#Если флаг не изменился - увеличить время и уснуть
if lResultFlag == False :
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 - Время ожидания объекта в секундах
@ -292,6 +349,18 @@ def UIOSelectorSecs_WaitAppear_Bool (inSpecificationList,inWaitSecs):
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 ) :
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
@ -546,6 +615,9 @@ def UIOSelector_IsExist_Bool (inSpecificationList):
#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 ) :
@ -1084,10 +1156,10 @@ if (len(sys.argv)>=2):
mFlagIsDebug = False
#Оповещение о выбранном режиме
if mFlagIsDebug :
logging . info ( " Robot/GUI: Debug mode, x " + lProcessBitnessStr )
mRobotLogger . info ( " Robot/GUI: Debug mode, x " + lProcessBitnessStr )
print ( " Robot/GUI: Debug mode, x " + lProcessBitnessStr )
else :
logging . info ( " Robot/GUI: Release mode, x " + lProcessBitnessStr )
mRobotLogger . info ( " Robot/GUI: Release mode, x " + lProcessBitnessStr )
#Нельзя делать print в release mode тк print делает вывод в PIPE поток, что нарушает последовательность взаимодействия с родительским процессом
#print ("Robot/GUI: Release mode, x"+lProcessBitnessStr)
#for line in sys.stdin: