@ -128,123 +128,127 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None,inFlagRaiseExcep
inSpecificationList = copy . deepcopy ( inSpecificationList )
lResultList = [ ]
lChildrenList = [ ]
#Получить родительский объект если на вход ничего не поступило
if inElement is None :
#сформировать спецификацию на получение элемента
lRootElementSpecification = [ inSpecificationList [ 0 ] ]
lRootElementList = PWASpecification_Get_UIO ( lRootElementSpecification )
for lRootItem in lRootElementList :
if lRootItem is not None :
lChildrenList . append ( lRootItem . wrapper_object ( ) )
#Елемент на вход поступил - выполнить е г о анализ
else :
#Получить список элементов
lElementChildrenList = inElement . children ( )
#Поступил index - точное добавление
if ' index ' in inSpecificationList [ 0 ] :
if inSpecificationList [ 0 ] [ ' index ' ] < len ( lElementChildrenList ) :
#Получить дочерний элемент - точное добавление
lChildrenList . append ( lElementChildrenList [ inSpecificationList [ 0 ] [ ' index ' ] ] )
else :
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 ' ] ] )
try :
#Получить родительский объект если на вход ничего не поступило
if inElement is None :
#сформировать спецификацию на получение элемента
lRootElementSpecification = [ inSpecificationList [ 0 ] ]
lRootElementList = PWASpecification_Get_UIO ( lRootElementSpecification )
for lRootItem in lRootElementList :
if lRootItem is not None :
lChildrenList . append ( lRootItem . wrapper_object ( ) )
#Елемент на вход поступил - выполнить е г о анализ
else :
#Получить список элементов
lElementChildrenList = inElement . children ( )
#Поступил index - точное добавление
if ' index ' in inSpecificationList [ 0 ] :
if inSpecificationList [ 0 ] [ ' index ' ] < len ( lElementChildrenList ) :
#Получить дочерний элемент - точное добавление
lChildrenList . append ( lElementChildrenList [ inSpecificationList [ 0 ] [ ' index ' ] ] )
else :
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 :
if inFlagRaiseException :
raise ValueError ( ' Object has no children with index: ' + str ( inSpecificationList [ 0 ] [ ' ctrl_index ' ] ) )
#Если нет точного обозначения элемента
else :
if inFlagRaiseException :
raise ValueError ( ' Object has no children with index: ' + str ( inSpecificationList [ 0 ] [ ' ctrl_index ' ] ) )
#Если нет точного обозначения элемента
lFlagGoCheck = True
#Учесть поле depth_start (если указано)
if ' depth_start ' in inSpecificationList [ 0 ] :
if inSpecificationList [ 0 ] [ " depth_start " ] > 1 :
lFlagGoCheck = False
#Циклический обход по детям, на предмет соответствия всем условиям
for lChildrenItem in lElementChildrenList :
#Обработка глубины depth (рекурсивный вызов для всех детей с занижением индекса глубины)
#По умолчанию значение глубины 1
if ' depth_end ' in inSpecificationList [ 0 ] :
if inSpecificationList [ 0 ] [ ' depth_end ' ] > 1 :
#Подготовка новой версии спецификации
lChildrenItemNewSpecificationList = inSpecificationList . copy ( )
lChildrenItemNewSpecificationList [ 0 ] = lChildrenItemNewSpecificationList [ 0 ] . copy ( )
lChildrenItemNewSpecificationList [ 0 ] [ " depth_end " ] = lChildrenItemNewSpecificationList [ 0 ] [ " depth_end " ] - 1
if ' depth_start ' in lChildrenItemNewSpecificationList [ 0 ] :
lChildrenItemNewSpecificationList [ 0 ] [ " depth_start " ] = lChildrenItemNewSpecificationList [ 0 ] [ " depth_start " ] - 1
#Циклический вызов для всех детей с о скорректированной спецификацией
lResultList . extend ( UIOSelector_Get_UIOList ( lChildrenItemNewSpecificationList , lChildrenItem , inFlagRaiseException ) )
#Фильтрация
#TODO Сделать поддержку этих атрибутов для первого уровня селектора
if lFlagGoCheck :
lFlagAddChild = True
#Фильтрация по title
if ' title ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . name != inSpecificationList [ 0 ] [ " title " ] :
lFlagAddChild = False
#Фильтрация по title_re (regexp)
if ' title_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " title_re " ] , lChildrenItem . element_info . name ) is None :
lFlagAddChild = False
#Фильтрация по rich_text
if ' rich_text ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . rich_text != inSpecificationList [ 0 ] [ " rich_text " ] :
lFlagAddChild = False
#Фильтрация по rich_text_re (regexp)
if ' rich_text_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " rich_text_re " ] , lChildrenItem . element_info . rich_text ) is None :
lFlagAddChild = False
#Фильтрация по class_name
if ' class_name ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . class_name != inSpecificationList [ 0 ] [ " class_name " ] :
lFlagAddChild = False
#Фильтрация по class_name_re (regexp)
if ' class_name_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " class_name_re " ] , lChildrenItem . element_info . class_name ) is None :
lFlagAddChild = False
#Фильтрация по friendly_class_name
if ' friendly_class_name ' in inSpecificationList [ 0 ] :
if lChildrenItem . friendly_class_name ( ) != inSpecificationList [ 0 ] [ " friendly_class_name " ] :
lFlagAddChild = False
#Фильтрация по friendly_class_name_re (regexp)
if ' friendly_class_name_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " friendly_class_name_re " ] , lChildrenItem . friendly_class_name ) is None :
lFlagAddChild = False
#Фильтрация по control_type
if ' control_type ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . control_type != inSpecificationList [ 0 ] [ " control_type " ] :
lFlagAddChild = False
#Фильтрация по control_type_re (regexp)
if ' control_type_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " control_type_re " ] , lChildrenItem . element_info . control_type ) is None :
lFlagAddChild = False
#Фильтрация по is_enabled (bool)
if ' is_enabled ' in inSpecificationList [ 0 ] :
if lChildrenItem . is_enabled ( ) != inSpecificationList [ 0 ] [ " is_enabled " ] :
lFlagAddChild = False
#Фильтрация по is_visible (bool)
if ' is_visible ' in inSpecificationList [ 0 ] :
if lChildrenItem . is_visible ( ) != inSpecificationList [ 0 ] [ " is_visible " ] :
lFlagAddChild = False
#####
#В с е проверки пройдены - флаг добавления
if lFlagAddChild :
lChildrenList . append ( lChildrenItem )
#Выполнить рекурсивный вызов (уменьшение количества спецификаций), если спецификация больше одного элемента
#????????Зачем в условии ниже is not None ???????????
if len ( inSpecificationList ) > 1 and len ( lChildrenList ) > 0 :
#Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект
for lChildElement in lChildrenList :
lResultList . extend ( UIOSelector_Get_UIOList ( inSpecificationList [ 1 : ] , lChildElement , inFlagRaiseException ) )
else :
lFlagGoCheck = True
#Учесть поле depth_start (если указано)
if ' depth_start ' in inSpecificationList [ 0 ] :
if inSpecificationList [ 0 ] [ " depth_start " ] > 1 :
lFlagGoCheck = False
#Циклический обход по детям, на предмет соответствия всем условиям
for lChildrenItem in lElementChildrenList :
#Обработка глубины depth (рекурсивный вызов для всех детей с занижением индекса глубины)
#По умолчанию значение глубины 1
if ' depth_end ' in inSpecificationList [ 0 ] :
if inSpecificationList [ 0 ] [ ' depth_end ' ] > 1 :
#Подготовка новой версии спецификации
lChildrenItemNewSpecificationList = inSpecificationList . copy ( )
lChildrenItemNewSpecificationList [ 0 ] = lChildrenItemNewSpecificationList [ 0 ] . copy ( )
lChildrenItemNewSpecificationList [ 0 ] [ " depth_end " ] = lChildrenItemNewSpecificationList [ 0 ] [ " depth_end " ] - 1
if ' depth_start ' in lChildrenItemNewSpecificationList [ 0 ] :
lChildrenItemNewSpecificationList [ 0 ] [ " depth_start " ] = lChildrenItemNewSpecificationList [ 0 ] [ " depth_start " ] - 1
#Циклический вызов для всех детей с о скорректированной спецификацией
lResultList . extend ( UIOSelector_Get_UIOList ( lChildrenItemNewSpecificationList , lChildrenItem , inFlagRaiseException ) )
#Фильтрация
#TODO Сделать поддержку этих атрибутов для первого уровня селектора
if lFlagGoCheck :
lFlagAddChild = True
#Фильтрация по title
if ' title ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . name != inSpecificationList [ 0 ] [ " title " ] :
lFlagAddChild = False
#Фильтрация по title_re (regexp)
if ' title_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " title_re " ] , lChildrenItem . element_info . name ) is None :
lFlagAddChild = False
#Фильтрация по rich_text
if ' rich_text ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . rich_text != inSpecificationList [ 0 ] [ " rich_text " ] :
lFlagAddChild = False
#Фильтрация по rich_text_re (regexp)
if ' rich_text_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " rich_text_re " ] , lChildrenItem . element_info . rich_text ) is None :
lFlagAddChild = False
#Фильтрация по class_name
if ' class_name ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . class_name != inSpecificationList [ 0 ] [ " class_name " ] :
lFlagAddChild = False
#Фильтрация по class_name_re (regexp)
if ' class_name_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " class_name_re " ] , lChildrenItem . element_info . class_name ) is None :
lFlagAddChild = False
#Фильтрация по friendly_class_name
if ' friendly_class_name ' in inSpecificationList [ 0 ] :
if lChildrenItem . friendly_class_name ( ) != inSpecificationList [ 0 ] [ " friendly_class_name " ] :
lFlagAddChild = False
#Фильтрация по friendly_class_name_re (regexp)
if ' friendly_class_name_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " friendly_class_name_re " ] , lChildrenItem . friendly_class_name ) is None :
lFlagAddChild = False
#Фильтрация по control_type
if ' control_type ' in inSpecificationList [ 0 ] :
if lChildrenItem . element_info . control_type != inSpecificationList [ 0 ] [ " control_type " ] :
lFlagAddChild = False
#Фильтрация по control_type_re (regexp)
if ' control_type_re ' in inSpecificationList [ 0 ] :
if re . fullmatch ( inSpecificationList [ 0 ] [ " control_type_re " ] , lChildrenItem . element_info . control_type ) is None :
lFlagAddChild = False
#Фильтрация по is_enabled (bool)
if ' is_enabled ' in inSpecificationList [ 0 ] :
if lChildrenItem . is_enabled ( ) != inSpecificationList [ 0 ] [ " is_enabled " ] :
lFlagAddChild = False
#Фильтрация по is_visible (bool)
if ' is_visible ' in inSpecificationList [ 0 ] :
if lChildrenItem . is_visible ( ) != inSpecificationList [ 0 ] [ " is_visible " ] :
lFlagAddChild = False
#####
#В с е проверки пройдены - флаг добавления
if lFlagAddChild :
lChildrenList . append ( lChildrenItem )
#Выполнить рекурсивный вызов (уменьшение количества спецификаций), если спецификация больше одного элемента
#????????Зачем в условии ниже is not None ???????????
if len ( inSpecificationList ) > 1 and len ( lChildrenList ) > 0 :
#Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект
for lChildElement in lChildrenList :
lResultList . extend ( UIOSelector_Get_UIOList ( inSpecificationList [ 1 : ] , lChildElement , inFlagRaiseException ) )
else :
lResultList . extend ( lChildrenList )
#Условие, если результирующий список пустой и установлен флаг создания ошибки (и inElement is None - не следствие рекурсивного вызова)
if inElement is None and len ( lResultList ) == 0 and inFlagRaiseException :
raise pywinauto . findwindows . ElementNotFoundError ( " Robot can ' t find element by the UIOSelector " )
return lResultList
lResultList . extend ( lChildrenList )
#Условие, если результирующий список пустой и установлен флаг создания ошибки (и inElement is None - не следствие рекурсивного вызова)
if inElement is None and len ( lResultList ) == 0 and inFlagRaiseException :
raise pywinauto . findwindows . ElementNotFoundError ( " Robot can ' t find element by the UIOSelector " )
return lResultList
except Exception :
if inFlagRaiseException : raise ValueError ( " Н е удается получить UIOList" )
else : return [ ]
#old:PywinautoExtElementGet
def UIOSelector_Get_UIO ( inSpecificationList , inElement = None , inFlagRaiseException = True ) :