Автор Тема: UIAutomate - автоматизация нестандартных элементов GUI  (Прочитано 113552 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
AutoIt: 3.3.10.0 +

Категория: Автоматизация, Элементы GUI

Описание:
Набор функций, расширяющий возможности AutoIt по работе с нестандартными элементами GUI. При помощи данных функций возможна автоматизация элементов таких классов, как DirectUIHWND, NetUIHWND, UIRibbonWorkPane, автоматизация таких программ, как Google Chrome, Mozilla Firefox, автоматизация элементов графических интерфейсов, написанных на Delphi, .NET (WPF), QT и т.д.

Для получения информации об элементе потребуется утилита Inspect (входит в комплект файлов). Если данная утилита при запуске сообщает об ошибке, значит на компьютере не установлен API UIAutomation. На Windows 7 и выше данный API предустановлен. На Vista и XP нужно отдельно установить обновление KB971513: support.microsoft.com или catalog.update.microsoft.com.

Функции:
(нажмите для показа/скрытия)

Пример:
(нажмите для показа/скрытия)

Файлы: Полный комплект

История версий:
(нажмите для показа/скрытия)

Источник: autoit-script.ru
Автор: InnI
« Последнее редактирование: Август 25, 2017, 18:45:48 от InnI »

Русское сообщество AutoIt

UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #300 Отправлен: Май 07, 2014, 13:01:24 »

Оффлайн tryinfinity [?]

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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102

  • Автор темы
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
tryinfinity  [?]
Цитировать
Как можно решить проблему?
Попробуйте по индексу (аналогично instance). Найдите все кнопки и определите индекс нужной. В дальнейшем обращайтесь к ней по индексу (надеюсь, приложение всегда создаёт элементы в одинаковом порядке)
Код: AutoIt [Выделить]
; поиск всех кнопок
$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])


Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #301 Отправлен: Июнь 26, 2018, 17:56:22 »

Оффлайн tryinfinity [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Спасибо за подсказку, но проблему решить не удалось, т.к. в программе несколько ListBox и по всей видимости от содержимого этих ListBox меняется индекс нужной мне кнопки

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102

  • Автор темы
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
tryinfinity  [?]
Цитировать
от содержимого этих ListBox меняется индекс нужной мне кнопки
Можно ещё к координатам привязаться. Например, для кнопки в правом нижнем углу X и Y координаты будут максимальными относительно других кнопок.
Если ничего не поможет, ищите её, как картинку ;)

Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #303 Отправлен: Июнь 26, 2018, 19:00:59 »

Оффлайн tryinfinity [?]

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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102

  • Автор темы
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
tryinfinity  [?]
Цитировать
присвоить значение элементу по нескольким свойствам или значениям?
Вы хотите сказать "найти элемент по нескольким свойствам и значениям"? Да можно.

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

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

Оффлайн NickSpirit [?]

  • Новичок
  • *
  • Сообщений: 40
  • Репутация: 5
    • Награды
  • Версия AutoIt: 3.3.14.0
Добрый день! Обращаюсь к уважаемому InnI с вопросом по функции _UIA_ElementMouseClick($oElement).

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

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

Поясню для чего мне это необходимо - есть выпадающий список - сначала я делаю клик по самому объекту - раскрывается список, и мне необходимо сделать клик по первому элементу списка (к слову его через Inspect я никак идентифицировать не могу - объект $oElement = _UIA_GetControlTypeElement($oParent, "UIA_ListItemControlTypeId", "элемент списка") - всегда не находит).
« Последнее редактирование: Июль 31, 2018, 11:30:42 от NickSpirit »

Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #306 Отправлен: Июль 31, 2018, 11:19:12 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102

  • Автор темы
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
NickSpirit  [?]
Цитировать
почему-то данная функция возвращает всегда (0,0)
Функция _UIA_ElementGetBoundingRectangle может возвращать нулевые координаты для элементов, находящихся вне зоны видимости. Для решения этой проблемы в версии 1.3 в функцию _UIA_ElementMouseClick  добавлена строка
Код: AutoIt [Выделить]
  If $fSetFocus Then $oElement.SetFocus()
; $SetFocus - активация элемента перед кликом (по умолчанию True)

Установка фокуса элементу автоматически прокручивает этот элемент в зону видимости, в результате чего _UIA_ElementGetBoundingRectangle возвращает реальные координаты.

Оффлайн NickSpirit [?]

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


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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102

  • Автор темы
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
NickSpirit  [?]
Цитировать
получить со страницы все элементы EditControlTypeId
Код: AutoIt [Выделить]
$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
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
 по этой функции: _UIA_ElementMouseClick - координаты относительно левого верхнего угла панели


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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102

  • Автор темы
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
FeueR  [?]
Цитировать
Так вообще можно?
Конечно, можно. Нужно из ширины панели вычесть координату (расстояние) от правого угла и получите координату относительно левого угла.
А ширину панели можно вычислить через _UIA_ElementGetBoundingRectangle путём вычитания нулевого элемента массива из второго.

Оффлайн tryinfinity [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Добрый день! Помогите пожалуйста.
Задача - отловить статус  (отключен, подключается, подключен) состояния конкретного сетевого адаптера.
https://c2n.me/3VX4ZWI
Нахожу нужный элемент, закидываю его в список, пытаюсь через цикл распечатать значения дочерних элементов, но не выходит.
Код: AutoIt [Выделить]
$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


Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4102

  • Автор темы
  • Репутация: 1089
    • Награды
  • Версия AutoIt: 3.3.14.0
tryinfinity  [?]
Цитировать
распечатать значения дочерних элементов
Код: AutoIt [Выделить]
$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
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Здравствуйте! Помогите пожалуйста. Часто использую UIAutomate в своей работе, но столкнулся с неработоспособностью кода в "современных" версиях Firefox. Например, мой код отлично работает на версии 52, но не хочет на 57 (и выше). В корне поменялся интерфейс Firefox и не только код, но и Inspect не "видит" элементов клиентского приложения окна браузера.

Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #314 Отправлен: Январь 24, 2019, 21:28:06 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
119404 Просмотров
Последний ответ Сентябрь 22, 2010, 22:13:33
от CreatoR
18 Ответов
14686 Просмотров
Последний ответ Сентябрь 18, 2011, 20:49:26
от Zalman1980
0 Ответов
2231 Просмотров
Последний ответ Май 07, 2012, 15:00:44
от Dedullika
18 Ответов
5529 Просмотров
Последний ответ Октябрь 17, 2012, 00:07:30
от Kaster
0 Ответов
2305 Просмотров
Последний ответ Декабрь 02, 2012, 10:15:22
от madmasles
6 Ответов
3911 Просмотров
Последний ответ Декабрь 10, 2012, 11:30:14
от Zergii
3 Ответов
2373 Просмотров
Последний ответ Декабрь 21, 2014, 19:24:21
от brain
8 Ответов
2938 Просмотров
Последний ответ Ноябрь 26, 2015, 17:54:56
от Garrett
22 Ответов
3838 Просмотров
Последний ответ Июнь 09, 2017, 01:12:34
от Alofa
4 Ответов
1134 Просмотров
Последний ответ Октябрь 16, 2018, 22:32:05
от Visors