Что нового

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

tryinfinity

Новичок
Сообщения
40
Репутация
0
Не могу найти нужный элемент (кнопку), т.к. у нужной кнопки видимо все свойства совпадают с кнопкой свертывания окна, единственное отличие что нашел, это по AutomationId, если указываю текущее значение из проекта, то нажимается как надо, однако при перезапуске программы, это Id меняется.
Как можно решить проблему?
Скрин инспекта:
https://clip2net.com/s/3V4Qa4L
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
tryinfinity [?]
Как можно решить проблему?
Попробуйте по индексу (аналогично instance). Найдите все кнопки и определите индекс нужной. В дальнейшем обращайтесь к ней по индексу (надеюсь, приложение всегда создаёт элементы в одинаковом порядке)
Код:
; поиск всех кнопок
$aBtns = _UIA_FindAllElements($oParent, "ControlType", $UIA_ButtonControlTypeId)

; цикл только для определения индекса - в рабочем коде не нужен
For $i = 1 To $aBtns[0]
  ConsoleWrite($i & " : " & _UIA_ElementGetPropertyValue($aBtns[$i], "AutomationId") & @CRLF)
Next

; нажатие кнопки с индексом 4
_UIA_ElementDoDefaultAction($aBtns[4])
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
Спасибо за подсказку, но проблему решить не удалось, т.к. в программе несколько ListBox и по всей видимости от содержимого этих ListBox меняется индекс нужной мне кнопки
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
tryinfinity [?]
от содержимого этих ListBox меняется индекс нужной мне кнопки
Можно ещё к координатам привязаться. Например, для кнопки в правом нижнем углу X и Y координаты будут максимальными относительно других кнопок.
Если ничего не поможет, ищите её, как картинку ;)
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
InnI сказал(а):
tryinfinity [?]
от содержимого этих ListBox меняется индекс нужной мне кнопки
Можно ещё к координатам привязаться. Например, для кнопки в правом нижнем углу X и Y координаты будут максимальными относительно других кнопок.
Если ничего не поможет, ищите её, как картинку ;)
А можно ли присвоить значение элементу по нескольким свойствам или значениям?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
tryinfinity [?]
присвоить значение элементу по нескольким свойствам или значениям?
Вы хотите сказать "найти элемент по нескольким свойствам и значениям"? Да можно.

Вариант 1.
Через _UIA_FindAllElements найти все элементы с общим свойством. Затем через _UIA_FindElementsInArray отфильтровывать ненужные свойства необходимое количество раз.

Вариант 2.
Через _UIA_CreatePropertyCondition и _UIA_CreateLogicalCondition создать одно логическое условие. Затем через _UIA_GetElementFromCondition получить этот элемент или через _UIA_FindAllElementsEx найти все элементы, подходящие под это логическое условие.
 

NickSpirit

Знающий
Сообщения
44
Репутация
5
Добрый день! Обращаюсь к уважаемому InnI с вопросом по функции _UIA_ElementMouseClick($oElement).

Можно как-нибудь получить координаты середины объекта по которым данная функция делает клик?

Пробовал это делать также как и в самой функции - через $aRect = _UIA_ElementGetBoundingRectangle($oElement) - но почему-то данная функция возвращает всегда (0,0). А вот сам клик по объекту всегда работает верно. Подскажите в чем может быть проблема?

Поясню для чего мне это необходимо - есть выпадающий список - сначала я делаю клик по самому объекту - раскрывается список, и мне необходимо сделать клик по первому элементу списка (к слову его через Inspect я никак идентифицировать не могу - объект $oElement = _UIA_GetControlTypeElement($oParent, "UIA_ListItemControlTypeId", "элемент списка") - всегда не находит).
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
NickSpirit [?]
почему-то данная функция возвращает всегда (0,0)
Функция _UIA_ElementGetBoundingRectangle может возвращать нулевые координаты для элементов, находящихся вне зоны видимости. Для решения этой проблемы в версии 1.3 в функцию _UIA_ElementMouseClick добавлена строка
Код:
If $fSetFocus Then $oElement.SetFocus()
; $SetFocus - активация элемента перед кликом (по умолчанию True)
Установка фокуса элементу автоматически прокручивает этот элемент в зону видимости, в результате чего _UIA_ElementGetBoundingRectangle возвращает реальные координаты.
 

NickSpirit

Знающий
Сообщения
44
Репутация
5
Возник еще один вопрос - как мне получить со страницы все элементы EditControlTypeId? На странице есть поле поиска. Названия соответственно у него никакого нет, думаю как бы его отделить ото всех полей... но для начала мне нужно как то получить список всех таких полей без какого либо текста внутри.


Видел функцию _UIA_FindAllElements - но не знаю как правильно ее применить. Подскажите плиз.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
NickSpirit [?]
получить со страницы все элементы EditControlTypeId
Код:
$aEdit = _UIA_FindAllElements($oParent, "ControlType", $UIA_EditControlTypeId)
For $i = 1 To $aEdit[0]
  ConsoleWrite($i & ":" & _UIA_ElementGetPropertyValue($aEdit[$i], "Value.Value") & @CRLF)
Next
 

FeueR

Новичок
Сообщения
1
Репутация
0
по этой функции: _UIA_ElementMouseClick - координаты относительно левого верхнего угла панели


А как сделать чтобы координаты отсчитывались не от левого верхнего, а от правого верхнего угла панели? Так вообще можно?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
FeueR [?]
Так вообще можно?
Конечно, можно. Нужно из ширины панели вычесть координату (расстояние) от правого угла и получите координату относительно левого угла.
А ширину панели можно вычислить через _UIA_ElementGetBoundingRectangle путём вычитания нулевого элемента массива из второго.
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
Добрый день! Помогите пожалуйста.
Задача - отловить статус (отключен, подключается, подключен) состояния конкретного сетевого адаптера.
https://c2n.me/3VX4ZWI
Нахожу нужный элемент, закидываю его в список, пытаюсь через цикл распечатать значения дочерних элементов, но не выходит.
Код:
$oParent = _UIA_GetElementFromHandle($hWnd1)
$aList = _UIA_FindAllElements($oParent, "UIA_ListItemControlTypeId", "Brazil_1")

For $i = 1 To $aList[0]
  ConsoleWrite($i & " : " & _UIA_ElementGetPropertyValue($aList[$i], "LocalizedControlType") & @CRLF)
Next
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
tryinfinity [?]
распечатать значения дочерних элементов
Код:
$oParent = _UIA_GetElementFromHandle($hWnd1)
$aList = _UIA_FindAllElements($oParent, "ControlType", $UIA_ListItemControlTypeId)
For $i = 1 To $aList[0]
  ConsoleWrite($i & " : " & _UIA_ElementGetPropertyValue($aList[$i], "Name") & @CRLF)
  $aEdit = _UIA_FindAllElements($aList[$i], "ControlType", $UIA_EditControlTypeId)
  For $j = 1 To $aEdit[0]
    ConsoleWrite("    " & $j & " : " & _UIA_ElementGetPropertyValue($aEdit[$j], "Name") & @CRLF)
  Next
  ConsoleWrite("--------" & @CRLF)
Next
 

vyatdima

Новичок
Сообщения
2
Репутация
0
Здравствуйте! Помогите пожалуйста. Часто использую UIAutomate в своей работе, но столкнулся с неработоспособностью кода в "современных" версиях Firefox. Например, мой код отлично работает на версии 52, но не хочет на 57 (и выше). В корне поменялся интерфейс Firefox и не только код, но и Inspect не "видит" элементов клиентского приложения окна браузера.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
vyatdima [?]
не хочет на 57 (и выше)
На данный момент я знаю только один способ - это перевести Firefox в однопроцессный режим:
- перейти в расширенные настройки (в строке адреса ввести about:config[enter])
- подтвердить внесение изменений (нажать кнопку "Я принимаю на себя риск!")
- найти параметр browser.tabs.remote.autostart (можно ввести в строку поиска)
- двойным кликом по имени параметра переключить его значение в false
- перезапустить Firefox (теперь в диспетчере задач должен быть один процесс firefox.exe)

Если в настройках есть расширения указанного выше параметра с цифрами на конце, например
browser.tabs.remote.autostart.1
browser.tabs.remote.autostart.2

и т.д., то их все нужно переключить в false и перезапустить браузер.
 

alberts1972

Новичок
Сообщения
16
Репутация
0
Как нажать такую кнопку.
Выдержка из Inspect
How found: Mouse move (466,305)
hwnd=0x00611260 32bit class="NotesRichText" style=0x52000000 ex=0x0
BoundingRectangle: {l:411 t:290 r:492 b:317}
ProcessId: 3044
ControlType: UIA_ButtonControlTypeId (0xC350)
LocalizedControlType: "кнопка"
Name: "Внутренний"
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: false
IsEnabled: true
HelpText: ""
IsPassword: false
IsOffscreen: false
ProviderDescription: "[pid:3044,hwnd:0x0 Main(parent link):Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId: 116397056
LegacyIAccessible.DefaultAction: "Click"
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "Внутренний"
LegacyIAccessible.Role: кнопка (0x2B)
LegacyIAccessible.State: выделяемое (0x200000)
LegacyIAccessible.Value: ""
IsDockPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: true
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollPatternAvailable: false
IsScrollItemPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsTablePatternAvailable: false
IsTableItemPatternAvailable: false
IsTextPatternAvailable: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: false
IsValuePatternAvailable: false
IsWindowPatternAvailable: false
IsItemContainerPatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
FirstChild: [null]
LastChild: [null]
Next: "" текстовый
Previous: "" текстовый
Other Props: Object has no additional properties
Children: Container has no children
Ancestors: ""
"" таблицу
"Исходящий - черновик" документ
"" панель
"" панель
"" панель
"" панель
"" панель
"(УДАЛЕН) Исходящий - черновик" панель
"" панель
"" панель
"" панель
"" панель
"(УДАЛЕН) Исходящий - черновик - IBM Lotus Notes" окно
"Рабочий стол" панель
[ No Parent ]
Перебор массива из родителя "(УДАЛЕН) Исходящий - черновик - IBM Lotus Notes" не находится.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
alberts1972 [?]
Как нажать такую кнопку
Не проверял! См. ошибки в консоле SciTE
Код:
#include <UIAutomate.au3>

$oParent = _UIA_GetElementFromHandle(WinGetHandle("(УДАЛЕН) Исходящий"))
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Внутренний")
_UIA_ElementDoDefaultAction($oButton)
 

alberts1972

Новичок
Сообщения
16
Репутация
0
InnI сказал(а):
alberts1972 [?]
Как нажать такую кнопку
Не проверял! См. ошибки в консоле SciTE
Код:
#include <UIAutomate.au3>

$oParent = _UIA_GetElementFromHandle(WinGetHandle("(УДАЛЕН) Исходящий"))
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Внутренний")
_UIA_ElementDoDefaultAction($oButton)
Кнопка не нажимается.

http://1.jpg[img]
[img]2.jpg

Код:
#include "UIAutomate.au3"
$handle=WinActivate ("Исходящий - редактирование - IBM Lotus Notes")

	$oParent = _UIA_GetElementFromHandle($handle)
    $aA1 = _UIA_FindAllElements($oParent)
    $aA2 = _UIA_FindElementsinArray($aA1,"Name","Лист рассылки")
	_UIA_ElementDoDefaultAction($aA2[1])

	$oParent = _UIA_GetElementFromHandle(WinGetHandle("Исходящий - редактирование"))
    $oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Внутренний")
    _UIA_ElementDoDefaultAction($oButton)


На вкладку "Лист рассылки" получается нажать. А на кнопку нет.

Данные по кнопке утилитой Inspect
How found: Mouse move (465,304)
hwnd=0x0094163C 32bit class="NotesRichText" style=0x52000000 ex=0x0
BoundingRectangle: {l:411 t:290 r:492 b:317}
ProcessId: 3044
ControlType: UIA_ButtonControlTypeId (0xC350)
LocalizedControlType: "кнопка"
Name: "Внутренний"
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: false
IsEnabled: true
HelpText: ""
IsPassword: false
IsOffscreen: false
ProviderDescription: "[pid:3044,hwnd:0x0 Main(parent link):Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId: 115348480
LegacyIAccessible.DefaultAction: "Click"
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "Внутренний"
LegacyIAccessible.Role: кнопка (0x2B)
LegacyIAccessible.State: выделяемое (0x200000)
LegacyIAccessible.Value: ""
IsDockPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: true
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollPatternAvailable: false
IsScrollItemPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsTablePatternAvailable: false
IsTableItemPatternAvailable: false
IsTextPatternAvailable: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: false
IsValuePatternAvailable: false
IsWindowPatternAvailable: false
IsItemContainerPatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
FirstChild: [null]
LastChild: [null]
Next: "" текстовый
Previous: "" текстовый
Other Props: Object has no additional properties
Children: Container has no children
Ancestors: ""
"" таблицу
"Исходящий - редактирование" документ
"" панель
"" панель
"" панель
"" панель
"" панель
"Исходящий - редактирование" панель
"" панель
"" панель
"" панель
"" панель
"Исходящий - редактирование - IBM Lotus Notes" окно
"Рабочий стол" панель
[ No Parent ]
При пользовании утилитой Inspect при наведении мышкой на кнопку на правой панели окна Inspect показывает данные, которые я выложил выше (см. спойлер), а вот на левом панели не показывает, где объект кнопка распологается, в каком положении в дереве объектов находиться. Например объект вкладка "Лист рассылки" показывает.
 

Вложения

  • 1.jpg
    1.jpg
    53.2 КБ · Просмотры: 23
  • 2.jpg
    2.jpg
    45.3 КБ · Просмотры: 19
Верх