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

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

Оффлайн 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, то ничего сделать не получится. Слишком большое количество элементов в окне.

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

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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #285 Отправлен: Декабрь 06, 2017, 08:01:07 »

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 1055
    • Награды
  • Версия 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-файле(даже на составленном мной лично) выдает по два раза каждую ссылку

Онлайн InnI [?]

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

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


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

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

Оффлайн Hikari [?]

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

Онлайн InnI [?]

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

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

Оффлайн tryinfinity [?]

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

Онлайн InnI [?]

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

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

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

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

Оффлайн tryinfinity [?]

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

Оффлайн roma351234567890 [?]

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


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


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

Онлайн InnI [?]

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

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

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

  • Автор темы
  • Репутация: 1055
    • Награды
  • Версия 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 Ответов
114466 Просмотров
Последний ответ Сентябрь 22, 2010, 22:13:33
от CreatoR
18 Ответов
14152 Просмотров
Последний ответ Сентябрь 18, 2011, 20:49:26
от Zalman1980
0 Ответов
2100 Просмотров
Последний ответ Май 07, 2012, 15:00:44
от Dedullika
18 Ответов
5238 Просмотров
Последний ответ Октябрь 17, 2012, 00:07:30
от Kaster
0 Ответов
2154 Просмотров
Последний ответ Декабрь 02, 2012, 10:15:22
от madmasles
6 Ответов
3701 Просмотров
Последний ответ Декабрь 10, 2012, 11:30:14
от Zergii
3 Ответов
2174 Просмотров
Последний ответ Декабрь 21, 2014, 19:24:21
от brain
8 Ответов
2656 Просмотров
Последний ответ Ноябрь 26, 2015, 17:54:56
от Garrett
22 Ответов
3310 Просмотров
Последний ответ Июнь 09, 2017, 01:12:34
от Alofa
4 Ответов
454 Просмотров
Последний ответ Октябрь 16, 2018, 22:32:05
от Visors