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

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

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4047
  • Репутация: 1074
    • Награды
  • Версия 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
« Ответ #285 Отправлен: Май 07, 2014, 13:01:24 »

Оффлайн Radik [?]

  • Новичок
  • *
  • Сообщений: 70
  • Репутация: 1
    • Награды
Radik  [?]
Цитировать
массив из 100 строк
До массива вы не доходите. У вас не создаётся $oElement. Подозреваю, что "ultraGrid1" - это не имя таблицы.


Добавлено: Декабрь 05, 2017, 19:11:19
Попробуйте этот код
Код: AutoIt [Выделить]
#include <UIAutomate.au3>

$hWnd = WinActivate("Программа")
$oParent = _UIA_GetElementFromHandle($hWnd)
$oCond1 = _UIA_CreatePropertyCondition("Name", "ultraGrid1")
$oCond2 = _UIA_CreatePropertyCondition("ControlType", $UIA_TableControlTypeId)
$oCond = _UIA_CreateLogicalCondition($oCond1, "AND", $oCond2)
$oElement = _UIA_GetElementFromCondition($oParent, $oCond)
If IsObj($oElement) Then ConsoleWrite("Найден" & @CRLF)

Если напишет ошибку 0х80004005, то ничего сделать не получится. Слишком большое количество элементов в окне.

Спасибо! Помогло!

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Убрал лишнее создание объекта UIAutomation в функции _UIA_FindAllElements (соответственно и вывод ошибки).
Версию не менял.

Оффлайн Hikari [?]

  • Новичок
  • *
  • Сообщений: 22
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Inni, в функции _UIA_FindAllElements создается по два объекта для каждой ссылки
Вот простенький код для проверки в уже запущенном браузере с нужными ключами
Код: AutoIt [Выделить]
Func Check()
MsgBox(0,"","check")
;WaitFullLoad()
Local $testarray = _UIA_FindAllElements($BROWSER,"ControlType",50005)
For $in = 1 to $testarray[0]
MsgBox(0,"",_UIA_ElementGetPropertyValue($testarray[$in],"Name"))
Next



EndFunc
 

на любом html-файле(даже на составленном мной лично) выдает по два раза каждую ссылку

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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #287 Отправлен: Январь 14, 2018, 19:26:23 »

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Hikari  [?]
Цитировать
создается по два объекта для каждой ссылки
Искать нужно не от главного окна, а от элемента отображения страницы
Код: AutoIt [Выделить]
$BROWSER = _UIA_GetElementFromHandle(ControlGetHandle("[RegexpTitle: - Opera]", "", "Chrome_RenderWidgetHostHWND1"))
Check()


Оффлайн Hikari [?]

  • Новичок
  • *
  • Сообщений: 22
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Скажите, пожалуйста, как сделать функцию , которая будет дожидаться полной прогрузки страницы в браузере?

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Если содержимое страницы известно, то ждать последнего элемента. В противном случае, можно отслеживать изменения кнопки "обновить/остановить" в панели браузера.

Оффлайн tryinfinity [?]

  • Новичок
  • *
  • Сообщений: 34
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Столкнулся с проблемой, Inspect не видит в приложении объекты, пишет "Отказано в доступе".
hWnd находится, но даже Send("{ENTER}") не работает.
Может кто сталкивался с подобным?

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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #291 Отправлен: Март 14, 2018, 18:09:28 »

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
tryinfinity  [?]
Цитировать
пишет "Отказано в доступе"
Вероятно, приложение запущено с правами администратора. Если так, то и Inspect и скрипт должны иметь такие же права.

Оффлайн tryinfinity [?]

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

Оффлайн roma351234567890 [?]

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


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


(нажмите для показа/скрытия)
« Последнее редактирование: Май 06, 2018, 15:24:00 от roma351234567890 »

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
roma351234567890  [?]
Цитировать
Имеется вот такой элемент меню
UIA_PaneControlTypeId - это панель, просто вы воспринимаете её, как меню. А кликать в панель можно по координатам. Т.к. у этого элемента есть класс (TCustomActionPopupMenuEx), то можно попробовать ControlClick (информацию смотрите в Au3Info). Но если вам нужно через UIAutomate, то попробуйте так
Код: AutoIt [Выделить]
#include <UIAutomate.au3>

; координаты относительно левого верхнего угла панели
Global $X = 100, $Y = 10

; дескриптор панели меню - данные получаем из Au3Info
$hCtrl = WinGetHandle("[class:TCustomActionPopupMenuEx]")
; $hCtrl = ControlGetHandle("Заголовок окна", "", "TCustomActionPopupMenuEx1")

; элемент на основе дескриптора панели
$oPanel = _UIA_GetElementFromHandle($hCtrl)

; клик по координатам панели
_UIA_ElementMouseClick($oPanel, "", $X, $Y)

« Последнее редактирование: Май 06, 2018, 16:04:33 от InnI »

Оффлайн roma351234567890 [?]

  • Новичок
  • *
  • Сообщений: 11
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Благодарю, работает, а через ControlClick никак не шло.

Оффлайн roma351234567890 [?]

  • Новичок
  • *
  • Сообщений: 11
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Мне нужно вывести значение 188.225.7.119, оно может быть разным. То есть нужно вывести как-то массив на фильтр, либо подобрать по предыдущему элементу массива, но не знаю, как собственно этот массив вывести.
(нажмите для показа/скрытия)

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <UIAutomate.au3>

$oParent = _UIA_GetElementFromHandle(ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1"))

; если элемент один
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", True, "Value.IsReadOnly")
ConsoleWrite(_UIA_ElementGetPropertyValue($oElement, "Name") & @CRLF)

; если элементов несколько, то найдите его по индексу
$aElems = _UIA_FindAllElements($oParent, "ControlType", $UIA_EditControlTypeId)
For $i = 1 To $aElems[0]
  ConsoleWrite(_UIA_ElementGetPropertyValue($aElems[$i], "Name") & @CRLF)
Next


Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1074
    • Награды
  • Версия AutoIt: 3.3.14.0
Узнал программный способ включения доступа к содержимому страниц Google Chrome для работы с IUIAutomation. Способ заключается в отправке элементу отображения страницы специального сообщения, при получении которого Google Chrome включает доступ к содержимому всех страниц (в том числе уже открытых). Фактически работает аналогично запуску с параметром --force-renderer-accessibility
Код: AutoIt [Выделить]
#include <SendMessage.au3>
#include <WindowsConstants.au3>

$hWnd = ControlGetHandle("[RegexpTitle: - Google Chrome]", "", "Chrome_RenderWidgetHostHWND1")
_SendMessage($hWnd, $WM_GETOBJECT, 0, 1)


Как вариант, можно отправлять данное сообщение "по запросу". Дело в том, что Google Chrome при запуске и при открытии новой вкладки рассылает системное уведомление EVENT_SYSTEM_ALERT, в ответ на которое и отправляется сообщение о включении доступа к содержимому страниц. Если Google Chrome уже работает в режиме доступа, то уведомление рассылаться не будет
Код: AutoIt [Выделить]
#include <WinAPISys.au3>

OnAutoItExitRegister("__UIA_Answer_OnAutoItExit")

Global $UIA_AnswerEventProc = DllCallbackRegister("__UIA_AnswerEventProc", "none", "ptr;dword;hwnd;long;long;dword;dword")
Global $UIA_AnswerEventHook = _WinAPI_SetWinEventHook($EVENT_SYSTEM_ALERT, $EVENT_SYSTEM_ALERT, DllCallbackGetPtr($UIA_AnswerEventProc))

Func __UIA_AnswerEventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadID, $iEventTime)
  If $iEvent = $EVENT_SYSTEM_ALERT And $iObjectID = 1 Then _SendMessage($hWnd, 0x003D, 0, 1) ; $WM_GETOBJECT = 0x003D
EndFunc  ;==> __UIA_AnswerEventProc

Func __UIA_Answer_OnAutoItExit()
  _WinAPI_UnhookWinEvent($UIA_AnswerEventHook)
  DllCallbackFree($UIA_AnswerEventProc)
EndFunc  ;==> __UIA_AnswerOnAutoItExit

Данный код можно добавить в начало скрипта или подключить, как UDF.

Проверено на Google Chrome 67, запущенном без параметра --force-renderer-accessibility. С большой долей вероятности будет работать и в других chromium-based браузерах и приложениях.
« Последнее редактирование: Июнь 25, 2018, 12:30:01 от InnI »

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

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

 

Похожие темы

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