Что нового

UIAutomate - автоматизация нестандартных элементов GUI

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
использовать его в качестве $oParent.
Пока не пойму как это сделать, поэтому ищу все чекбоксы, и из массива выбираю нужные. Но хотелось бы понять, как найти нужный мне элемент и у него выбирать чекбоксы.
И ещё не могу разобраться со скролом. В отчете Inspect нашел такие строки, где упоминается скрол:
Код:
; Если в окошке скрол есть
Scroll.HorizontallyScrollable:    false
Scroll.HorizontalScrollPercent:    -1.000000
Scroll.HorizontalViewSize:    100.000000
Scroll.VerticallyScrollable:    true
Scroll.VerticalScrollPercent:    0.000000
Scroll.VerticalViewSize:    57.142857

; Если в окошке скрола нет
Scroll.HorizontallyScrollable:    false
Scroll.HorizontalScrollPercent:    -1.000000
Scroll.HorizontalViewSize:    100.000000
Scroll.VerticallyScrollable:    false
Scroll.VerticalScrollPercent:    -1.000000
Scroll.VerticalViewSize:    100.000000

И по идее нужно установить значение
Код:
Scroll.VerticalScrollPercent: 100%
, только тоже не пойму как это сделать.
Сообщение автоматически объединено:

Но лучше найти элемент, содержащий нужные вам чекбоксы
Вот одна из попыток. Сперва нахожу все нужные родители. В каждом родителе два ребенка: один чексбокс, второй название этого чекбокса. Но у меня не получается добраться до этих детей.
Код:
Local $pTabs = _UIA_FindAllElements($oParent, "ControlType", $UIA_ListItemControlTypeId)
If @error Then Exit MsgBox(0x40000, "Ошибка", "Значения не найдены")
_ArrayDisplay($pTabs, "Все списки")
Local $pppTabs[0]
For $i = 1 To $pTabs[0]
    Local $ppTabs = _UIA_ElementGetPropertyValue($pTabs[$i], $UIA_NamePropertyId)
    If $ppTabs = "ReportsApp.Model.CustomReportsModule.CustomReportModel" Then
    _ArrayAdd($pppTabs, $ppTabs)
    EndIf
 Next
 _ArrayDisplay($pppTabs, "Список нужных родителей")  ; В каждой строке имя родителя (ReportsApp.Model.CustomReportsModule.CustomReportModel) у которого по два ребенка (чекбокс и его название), которых не видно

 Local $Child[0]
For $i = 1 to UBound($pppTabs)-1
   Local $dChild = _UIA_ElementGetFirstLastChild($pppTabs[$i])  ; Вот тут выбивает ошибку, что это не объект (_UIA_ElementGetFirstLastChild : параметр не является объектом)
Next
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
не могу разобраться со скролом


В каждом родителе два ребенка: один чексбокс, второй название этого чекбокса
Попробуйте через _UIA_GetControlTypeElement найти нужный текст и для этого текста через _UIA_ElementGetPreviousNext получить чекбокс.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Попробуйте через _UIA_GetControlTypeElement найти нужный текст
Если пробую искать так, то массив вообще пустой
Код:
Local $pcTabs2 = _UIA_GetControlTypeElement($oParent, "UIA_ListItemControlTypeId", "ReportsApp.Model.CustomReportsModule.CustomReportModel")
If @error Then Exit MsgBox(0x40000, "Ошибка", "Списки родителей не найдены") ; Тут ошибку не выдает
_ArrayDisplay($pcTabs2, "списки нужных родителей")
ConsoleWrite("Проверяю составлен ли массив и его размер   " & UBound($pcTabs2) & @CR)  ; пишет, что ноль значений


И по поводу скрола. Тоже так делал. Вот, что пишет в консоли:
Код:
"D:\AUTOIT\????? ??? ?????????? ?????????? ??????.au3" (277) : ==> No variable given for "Dim", "Local", "Global", "Struct" or "Const" statement.:
Local $oElement.GetCurrentPattern($UIA_ScrollPatternId, $pScroll)
Local $oElement^ ERROR
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
массив вообще пустой
А при чём тут массив? Эта функция возвращает единственный найденный элемент.

Вот, что пишет в консоли
Local можно указывать для переменной. А вы его перед вызовом метода прописали.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
А при чём тут массив? Эта функция возвращает единственный найденный элемент.
Да, но если я использую _UIA_FindAllElements, то получаю массив. Правда у него типа скрытые значения ячеек, после этого приходится искать с помощью _UIA_ElementGetPropertyValue($pTabs[$i], $UIA_NamePropertyId), тоесть типа получить имена каждого значения.
Local можно указывать для переменной. А вы его перед вызовом метода прописали.
Если без Local то пишет, что
Код:
"D:\AUTOIT\????? ??? ?????????? ?????????? ??????.au3" (277) : ==> Variable used without being declared.:
$oElement.GetCurrentPattern($UIA_ScrollPatternId, $pScroll)
^ ERROR
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
у него типа скрытые значения ячеек
Я не могу помогать вам вслепую. Если вы, смотря в дерево, не можете понять, из чего оно состоит, то я тем более.

Если без Local то пишет, что
Переменная не объявлена. По ссылке просто пример работы со скроллом. $oElement - элемент со скроллом - вы должны найти самостоятельно.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Я не могу помогать вам вслепую. Если вы, смотря в дерево, не можете понять, из чего оно состоит, то я тем более.
Попробую прикрепить несколько файлов из Inspecta в порядке возрастания и скрин с общим видом на дерево ведущее к этим флажкам
Сообщение автоматически объединено:

Переменная не объявлена. По ссылке просто пример работы со скроллом. $oElement - элемент со скроллом - вы должны найти самостоятельно.
Если я навожу мышь в Inspectна скрол, то желтый прямоугольник выделяет только элемент "список" в котором есть данные по скролу из поста выше:
Код:
Scroll.HorizontallyScrollable:    false
Scroll.HorizontalScrollPercent:    -1.000000
Scroll.HorizontalViewSize:    100.000000
Scroll.VerticallyScrollable:    true
Scroll.VerticalScrollPercent:    0.000000
Scroll.VerticalViewSize:    57.142857

При этом пробую найти элемент вот так:
Код:
Local $oElement7 = _UIA_GetControlTypeElement($oParent, "UIA_ListControlTypeId", "список")

Local $HorizontalAmount = $ScrollAmount_NoAmount
Local $VerticalAmount = $ScrollAmount_LargeIncrement

Local $pScroll, $oScroll
$oElement7.GetCurrentPattern($UIA_ScrollPatternId, $pScroll)
Local $oScroll = ObjCreateInterface($pScroll, $sIID_IUIAutomationScrollPattern, $dtagIUIAutomationScrollPattern)
Local $oScroll.Scroll($HorizontalAmount, $VerticalAmount)

Выдает ошибку
Код:
"D:\AUTOIT\????? ??? ?????????? ?????????? ??????.au3" (278) : ==> Variable must be of type "Object".:
$oElement7.GetCurrentPattern($UIA_ScrollPatternId, $pScroll)
$oElement7^ ERROR
 

Вложения

  • дерево в котором есть флажок.jpg
    дерево в котором есть флажок.jpg
    383.4 КБ · Просмотры: 8
  • пункт ДТП5 возле флажка.txt
    2.9 КБ · Просмотры: 4
  • Сам флажок возле пункта ДТП5.txt
    3 КБ · Просмотры: 3
  • элементы списка в котором флажки и название пункта рядом ДТП5.txt
    3.3 КБ · Просмотры: 3
  • сам список.txt
    4.5 КБ · Просмотры: 5
  • вкладка в которой открывается список.txt
    3.2 КБ · Просмотры: 3
  • список вкладок в одной из которых открывается список с флажками.txt
    3.6 КБ · Просмотры: 3
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Код:
#include <UIAutomate.au3>

; главное окно
$oWnd = _UIA_GetElementFromHandle(WinGetHandle("Статистика ОДС 103"))
If @error Then ConsoleWrite("Главное окно не найдено" & @CRLF)

; вкладка со списком
$oTab = _UIA_GetControlTypeElement($oWnd, "UIA_TabItemControlTypeId", "Звіти, що налаштовуються")
If @error Then ConsoleWrite("Вкладка не найдена" & @CRLF)

; список
$oList = _UIA_GetControlTypeElement($oTab, "UIA_ListControlTypeId", "ReportListBox", "AutomationId")
If @error Then ConsoleWrite("Список не найден" & @CRLF)

; пункты списка
$aListItems = _UIA_FindAllElements($oList, "ControlType", $UIA_ListItemControlTypeId)
If @error Then ConsoleWrite("Пункты списка не найдены" & @CRLF)

; текст ДТП5
$oText = _UIA_GetControlTypeElement($oList, "UIA_TextControlTypeId", "ДТП5")
If @error Then ConsoleWrite("Текст не найден" & @CRLF)

; флажок текста ДТП5
$aPrevNext = _UIA_ElementGetPreviousNext($oText)
If @error Then
  ConsoleWrite("Предыдущий-следующий не найдены" & @CRLF)
Else
  $oCheck = $aPrevNext[0]
EndIf
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
флажок текста ДТП5
Спасибо, работает. Не все понял, но работает. Если не разберусь, буду уточнять что и почему.
Сообщение автоматически объединено:

; пункты списка $aListItems = _UIA_FindAllElements($oList, "ControlType", $UIA_ListItemControlTypeId) If @error Then ConsoleWrite("Пункты списка не найдены" & @CRLF)
Не пойму, зачем это. Без него скрипт работает. Переменная $aListItems нигде не применяется.

По ссылке просто пример работы со скроллом. $oElement - элемент со скроллом - вы должны найти самостоятельно.
И никак не могу понять, как найти этот элемент со скроллом. Единственное место, где он хоть как-то отображается, это файл "Сам список", который я прикрепил в предыдущем сообщении. Он пятый по списку.
Пробовал подставлять некоторые элементы, найденные по ходу дела в вашем примере нахождения флажка.
Код:
Local $sScroll = _UIA_ElementScrollIntoView($aListItems)
!> _UIA_ElementScrollIntoView : параметр не является объектом
 Local $sScroll = _UIA_ElementScrollIntoView($oList)
!> _UIA_ElementScrollIntoView : ошибка создания объекта на основе шаблона ScrollItem
 Local $sScroll = _UIA_ElementScrollIntoView($oTab)
!> _UIA_ElementScrollIntoView : ошибка создания объекта на основе шаблона ScrollItem
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Не пойму, зачем это.
Это набор примеров поиска различных объектов. Чтобы вы разобрались, что относительно чего искать и по каким параметрам. Сейчас не применяется, потом может понадобится.

не могу понять, как найти этот элемент со скроллом
Этот элемент - $oList (IsScrollPatternAvailable: true). Что вы хотите в нём скроллировать и с какой целью?

_UIA_ElementScrollIntoView применяется к элементам, которые нужно вывести в область видимости. Для этих элементов в Inspect должна быть строка "IsScrollItemPatternAvailable: true". В вашем случае это пункты списка $aListItems.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Чтобы вы разобрались, что относительно чего искать и по каким параметрам.
Ну да, туговато у меня идет разбирательство что и зачем.
Этот элемент - $oList (IsScrollPatternAvailable: true). Что вы хотите в нём скроллировать и с какой целью?
Есть необходимость скролить пункты списка, потому что список может быть большим, больше чем окошко. И тогда не все пункты списка попадают в отчет Inspect и не получается найти текст (в вашем примере найти текст в этом пункте)
Код:
; текст ДТП5
$oText = _UIA_GetControlTypeElement($oList, "UIA_TextControlTypeId", "ДТП5")
If @error Then ConsoleWrite("Текст не найден" & @CRLF)
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
не все пункты списка попадают в отчет Inspect
То есть вы хотите сказать, что в дереве Inspect отображаются только пункты, видимые в списке? И если прокрутить список, то верхние пункты из дерева удаляются, а нижние в дерево добавляются? И в дереве всегда определённое количество пунктов списка?
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
То есть вы хотите сказать, что в дереве Inspect отображаются только пункты, видимые в списке? И если прокрутить список, то верхние пункты из дерева удаляются, а нижние в дерево добавляются? И в дереве всегда определённое количество пунктов списка?
Нет, не совсем. Пока не прокрутишь вниз, нижние не видны. Когда прокрутишь вниз в Inspect верхние остаются и добавляются ровно те, что появились после прокрутки. Те, что не прокрутились, не появляются.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
А если при активном списке нажать клавишу End или Ctrl+End, то список прокрутится в конец? Пункты в Inspect добавятся?
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
А если при активном списке нажать клавишу End или Ctrl+End
Что-то я про End не подумал. Пробовал PageDawn. Он тоже работает, но нужно ж было высчитать сколько раз его нажать. Только вот не всегда срабатывает этот End, если его руками нажимать. Точно срабатывает, если поставить галочку на каком-нибудь флажке. Если на тексте руками ставишь то не срабатывает
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Если на тексте руками ставишь то не срабатывает
Ctrl+End ? Ctrl+PageDown ?
Сообщение автоматически объединено:

высчитать сколько раз его нажать
Пока значение свойства Scroll.VerticalScrollPercent не станет равно 100.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Слава Богу увидел свою ошибку, в скрипте прописал:
Код:
; список
$oList = _UIA_GetControlTypeElement($oTab, "UIA_ListControlTypeId", "ReportListBox", "AutomationId")
If @error Then ConsoleWrite("Список не найден" & @CRLF)
_UIA_ElementMouseClick($oList) ; До этого пробовал без клика
Send("{END}")

Сообщение автоматически объединено:

Я не могу помогать вам вслепую
Если можно, посмотрите ещё одну вещь.
Тоже вожусь уже не один день, не могу понять, как найти и прочитать значение полей времени. Единственное, что сегодня получилось, это вбить в первое поле новое значение:
Код:
; Поиск строки времени и установка текста   AutomationId:    "PART_TextBox"
Local $oTime = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "PART_TextBox", "AutomationId")
;Local $oTime = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "")                ; так не работает
_UIA_ElementTextSetValue($oTime, "начальное время или любой текст для проверки")

Возможно эти данные отталкиваются от какого-то из этих значений:
Код:
IsTextChildPatternAvailable:    false
IsTextEditPatternAvailable:    false
IsTextPatternAvailable:    true
IsTextPattern2Available:    false

Но как до них добраться не понимаю
 

Вложения

  • время начало.txt
    3 КБ · Просмотры: 4
  • время конец.txt
    3 КБ · Просмотры: 3
  • время1.jpg
    время1.jpg
    335.4 КБ · Просмотры: 8
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
как найти и прочитать значение полей времени
Код:
$aTimes = _UIA_FindAllElements($oParent, "AutomationId", "PART_TextBox")
$sTimeB = _UIA_ElementGetPropertyValue($aTimes[1], "Value.Value")
$sTimeE = _UIA_ElementGetPropertyValue($aTimes[2], "Value.Value")
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
_UIA_FindAllElements($oParent, "AutomationId", "PART_TextBox")
Спасибо, работает, и изменяет. Но не пойму, почему в одном случае используется
Код:
$oTime = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "PART_TextBox", "AutomationId")

а в другом
Код:
$aTimes = _UIA_FindAllElements($oParent, "AutomationId", "PART_TextBox")

И почему ваш вариант более правильный. Оба ж вроде как ищут от одного родителя, от главного окна программы.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Объяснял же уже. _UIA_GetControlTypeElement ищет ПЕРВЫЙ ПОПАВШИЙСЯ (отвечающий условиям) элемент. _UIA_FindAllElements ищет ВСЕ, отвечающие условиям поиска, элементы. Поэтому первая возвращает один элемент, а вторая - массив элементов.
 
Верх