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

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

Оффлайн tryinfinity [?]

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

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

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

Оффлайн InnI [?]

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

  • Автор темы
  • Репутация: 1056
    • Награды
  • Версия 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])


Оффлайн tryinfinity [?]

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

Оффлайн InnI [?]

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

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

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

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

Оффлайн tryinfinity [?]

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

Оффлайн InnI [?]

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

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

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

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

Оффлайн NickSpirit [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 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 »

Оффлайн InnI [?]

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

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

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

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

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

Оффлайн NickSpirit [?]

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


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

Оффлайн InnI [?]

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

  • Автор темы
  • Репутация: 1056
    • Награды
  • Версия 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 Гуру
  • *****
  • Сообщений: 3975

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

Оффлайн tryinfinity [?]

  • Новичок
  • *
  • Сообщений: 32
  • Репутация: 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 Гуру
  • *****
  • Сообщений: 3975

  • Автор темы
  • Репутация: 1056
    • Награды
  • Версия 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


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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #313 Отправлен: Август 09, 2018, 01:13:19 »

 

Похожие темы

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