Что нового

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

Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
OffTopic:
Garrett
Вы же не первый день на форуме.
Вот именно. Большинство вопросов в этой теме касаются автоматизации браузеров. Видимо, люди считают, что UIAutomate специально создана, чтобы Chrome автоматизировать. И dr.room - не исключение. Я, конечно, могу дать ему ответ на базе этой UDF, но для него это ещё слишком сложно. Вот и привёл пример со штатной функцией. А что мне оставалось делать? Мусорить ответами типа "Создайте новую тему"? Так мне без разницы, в какой теме Chrome автоматизировать - всё равно на эту тему ссылаться придётся.
 

dr.room

Новичок
Сообщения
283
Репутация
0
InnI
Сори, не получается, фокус не теряется, с предварительно выбранного элемента, напротив - идет прямой клик по элементу. А нужно наоборот - снять фокус. :(
Не могу понять что не так - буду признателен за помощь.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
InnI [?]
Большинство вопросов в этой теме касаются автоматизации браузеров
1. Создаётся тема в разделе Автоматизация IE и Web-интерфейса
2. Если вы считаете, что для решения проблемы вопрошающего (браузер Chrome) требуется UIAutomat, то указываете ссылку на UDF и продолжаете разговор по заданному вопросу.

В разделе UDF - Пользовательские функции выкладываются готовые UDF. В теме по конкретной UDF задаются вопросы, касаемые самой UDF.

Видимо, люди считают, что UIAutomate специально создана, чтобы Chrome автоматизировать. И dr.room - не исключение.
Я искренне рад!
Однако на форуме есть разделы и подразделы. Как вы думаете, для чего?
но для него это ещё слишком сложно
Я полагаю dr.room достаточно взрослый человек, чтобы мыслить, экспериментировать и обучаться.
Если ему это не нужно, есть "Стол заказов".
А что мне оставалось делать?
Как минимум игнорировать.
Так мне без разницы
Вот с этого и надо было начинать


dr.room
Да я вижу вы мастер, испытывать терпение!
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Garrett
Как минимум игнорировать.
Игнорировать - значит проявить неуважение. Я прекрасно отдавал себе отчёт в необходимости поддержки пользователей, когда выкладывал UDF на общий доступ. Как минимум, как разработчик, я должен отреагировать (это моё личное мнение и я его не навязываю).

В теме по конкретной UDF задаются вопросы, касаемые самой UDF.
Если вопросы применения UDF в конкретной программе не касаются данной темы, что же тогда здесь обсуждать? Теперь буду, ссылаясь на ваше сообщение, предлагать пользователям обращаться в тематические разделы.


dr.room
Не могу понять что не так
Согласно рекомендации модератора предлагаю вам создать отдельную тему с подробным описанием проблемы.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
InnI [?]
Игнорировать - значит проявить неуважение.
По-вашему выходит так, что нужно проявить уважение к тем кто нарушает правила и наплевать на всех тех, кто их старается соблюдать. И это всё потому, что это ваша авторская тема где вы выложили свою UDF.
Я прекрасно отдавал себе отчёт в необходимости поддержки пользователей, когда выкладывал UDF на общий доступ. Как минимум, как разработчик, я должен отреагировать
Я и не возражаю, а только за! Покажите, где вы прочитали хоть слово касаемо работы с UDF.
Если вопросы применения UDF в конкретной программе не касаются данной темы, что же тогда здесь обсуждать?
см. сообщение выше.
Согласно рекомендации модератора предлагаю вам создать отдельную тему с подробным описанием проблемы.
Не юродствуйте.!
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
OffTopic:
Garrett
По-вашему выходит так
Если бы всё было так, как вы пишите, то в этой теме не было бы ни одного моего ответа, т.к. до этого момента все соблюдали правила и я, по вашей логике, должен был на них на всех наплевать и игнорировать их вопросы. И единственным моим ответом был бы тот, с которого всё это началось, и только потому, что он (по вашему субъективному мнению) нарушил правила. Прочитав данную тему, вы не найдёте ни одного проигнорированного мной вопроса. Следовательно, можно утверждать, что ваше мнение обо мне - ошибочно.

проявить уважение к тем
Я отвечаю всем. И именно потому, что это авторская тема. А определять виноватых - у меня таких полномочий нет.
 

Naisho

Знающий
Сообщения
86
Репутация
12
Вопросик по установке/отправке текстового значения в редактируемое поле ("UIA_EditControlTypeId") - почему в примере это делается с помощью стандартной "Send()" ?

Код:
; Поиск элемента поиска, установка фокуса, ввод данных
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "")
_UIA_ElementSetFocus($oElement)
Send("UIAutomate")


На оффициальном форуме в аналогичном UDF (IUIAutomation MS framework automate...) есть команда "setvalue" (которая в моём случае не срабатывает, хотя "getvalue" работает исправно)

Код:
_UIA_action("Notepad.edit","setvalue","Yes I made my first hello world script and am ready to make more complex scripts with calculator")


Код:
Case "setvalue","settextvalue"

;~ TODO: Find out how to set title for a window with UIA commands
;~ winsettitle(hwnd(_UIA_getVar("RTI.calculator.HWND")),"","nicer")
;~ winsettitle("Naamloos - Kladblok","","This works better")

			If ($controlType = $UIA_WindowControlTypeId) Then
				$hwnd = 0
				$obj2ActOn.CurrentNativeWindowHandle($hwnd)
;~ 				ConsoleWrite($hwnd)
				WinSetTitle(HWnd($hwnd), "", $p1)
			Else
				$obj2ActOn.setfocus()
				Sleep($UIA_DefaultWaitTime)

;~ 				Let take IAccessible pattern precedence over value pattern
				$tPattern = _UIA_getPattern($obj2ActOn, $UIA_LegacyIAccessiblePatternId)
				if _UIA_IsElement($tPattern) Then
					$tPattern.setvalue($p1)
				Else
					$tPattern = _UIA_getPattern($obj2ActOn, $UIA_ValuePatternId)
					if _UIA_IsElement($tPattern) Then
						$tPattern.setvalue($p1)
					EndIf
				EndIf


			EndIf

Мой контрол:
Код:
** Detailed properties of the highlighted element ***
UIA_iaccessiblevalue:= <Некоторый путь к папке на диске>
UIA_iaccessiblechildId:= <0>
UIA_handle:= <0>
UIA_BoundingRectangle:= <960;949;384;18>
UIA_ProcessId:= <1540>
UIA_ControlType:= <50004>
UIA_LocalizedControlType:= <edit>
UIA_HasKeyboardFocus:= <False>
UIA_IsKeyboardFocusable:= <True>
UIA_IsEnabled:= <True>
UIA_Culture:= <0>
UIA_IsControlElement:= <True>
UIA_IsContentElement:= <True>
UIA_IsPassword:= <False>
UIA_NativeWindowHandle:= <0>
UIA_IsOffscreen:= <False>
UIA_Orientation:= <0>
UIA_IsRequiredForForm:= <False>
UIA_IsDockPatternAvailable:= <False>
UIA_IsExpandCollapsePatternAvailable:= <False>
UIA_IsGridItemPatternAvailable:= <False>
UIA_IsGridPatternAvailable:= <False>
UIA_IsInvokePatternAvailable:= <True>
UIA_IsMultipleViewPatternAvailable:= <False>
UIA_IsRangeValuePatternAvailable:= <False>
UIA_IsScrollPatternAvailable:= <False>
UIA_IsScrollItemPatternAvailable:= <False>
UIA_IsSelectionItemPatternAvailable:= <False>
UIA_IsSelectionPatternAvailable:= <False>
UIA_IsTablePatternAvailable:= <False>
UIA_IsTableItemPatternAvailable:= <False>
UIA_IsTextPatternAvailable:= <False>
UIA_IsTogglePatternAvailable:= <False>
UIA_IsTransformPatternAvailable:= <False>
UIA_IsValuePatternAvailable:= <True>
UIA_IsWindowPatternAvailable:= <False>
UIA_ValueValue:= <Некоторый путь к папке на диске>
UIA_ValueIsReadOnly:= <False>
UIA_RangeValueValue:= <0>
UIA_RangeValueIsReadOnly:= <True>
UIA_RangeValueMinimum:= <0>
UIA_RangeValueMaximum:= <0>
UIA_RangeValueLargeChange:= <0>
UIA_RangeValueSmallChange:= <0>
UIA_ScrollHorizontalScrollPercent:= <0>
UIA_ScrollHorizontalViewSize:= <100>
UIA_ScrollVerticalScrollPercent:= <0>
UIA_ScrollVerticalViewSize:= <100>
UIA_ScrollHorizontallyScrollable:= <False>
UIA_ScrollVerticallyScrollable:= <False>
UIA_SelectionCanSelectMultiple:= <False>
UIA_SelectionIsSelectionRequired:= <False>
UIA_GridRowCount:= <0>
UIA_GridColumnCount:= <0>
UIA_GridItemRow:= <0>
UIA_GridItemColumn:= <0>
UIA_GridItemRowSpan:= <1>
UIA_GridItemColumnSpan:= <1>
UIA_DockDockPosition:= <5>
UIA_ExpandCollapseExpandCollapseState:= <3>
UIA_MultipleViewCurrentView:= <0>
UIA_WindowCanMaximize:= <False>
UIA_WindowCanMinimize:= <False>
UIA_WindowWindowVisualState:= <0>
UIA_WindowWindowInteractionState:= <0>
UIA_WindowIsModal:= <False>
UIA_WindowIsTopmost:= <False>
UIA_SelectionItemIsSelected:= <False>
UIA_TableRowOrColumnMajor:= <2>
UIA_ToggleToggleState:= <2>
UIA_TransformCanMove:= <False>
UIA_TransformCanResize:= <False>
UIA_TransformCanRotate:= <False>
UIA_IsLegacyIAccessiblePatternAvailable:= <True>
UIA_LegacyIAccessibleChildId:= <0>
UIA_LegacyIAccessibleValue:= <Некоторый путь к папке на диске>
UIA_LegacyIAccessibleRole:= <42>
UIA_LegacyIAccessibleState:= <1048576>
UIA_LegacyIAccessibleDefaultAction:= <activate>
UIA_IsDataValidForForm:= <False>
UIA_ProviderDescription:= <[pid:1540,hwnd:0x0 Main(parent link):Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]>
UIA_IsItemContainerPatternAvailable:= <False>
UIA_IsVirtualizedItemPatternAvailable:= <False>
UIA_IsSynchronizedInputPatternAvailable:= <False>
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Naisho
почему в примере это делается с помощью стандартной "Send()"
Потому что пример написан для Google Chrome, в котором поля Edit не реагируют на "команду" установки текста. Другими словами, вызов методов "Value.SetValue" или "LegacyIAccessible.SetValue" приводят к ошибке "ERROR - NOT IMPLEMENTED".

есть команда "setvalue"
Аналогичная функция этой UDF
Код:
_UIA_ElementTextSetValue()


Данная UDF "заточена" под работу с Inspect. Мне будет проще помогать, если вы будете предоставлять информацию именно этой утилиты.
 

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток, InnI
Вот не могу решить задачку: кликнуть по лайку на YouTube
Использовал 2 варианта, но оба ошибку выдают, к сожалению (скрин)
Подскажите что не так
1
Код:
#include <UIAutomate.au3>
Opt("WinTitleMatchMode", 2)

WinActivate("YouTube - Google Chrome")
$hWnd = WinActivate("YouTube") ;активация  окна
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель  
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Мне понравилось") ; элемент
_UIA_ElementDoDefaultAction($oElement); клик по элементу
2
Код:
#include <UIAutomate.au3>
Opt("WinTitleMatchMode", 2)

WinActivate("YouTube - Google Chrome")
$hWnd = WinActivate("YouTube") ;активация  окна
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель 
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Мне понравилось") ; элемент
$aRect = _UIA_ElementGetBoundingRectangle($oElement) ; экранные координаты элемента
If IsArray($aRect) Then
  $iX = ($aRect[2] - $aRect[0]) / 2 ; середина ширины элемента
  $iY = ($aRect[3] - $aRect[1]) / 2 ; середина высоты элемента
  MouseMove($aRect[0] + $iX, $aRect[1] + $iY, 0) ; смещение мыши в середину элемента с учётом левого верхнего угла элемента

  MouseClick("left") ; клик в текущие координаты курсора

EndIf
 

Вложения

  • Консоль.png
    Консоль.png
    15.3 КБ · Просмотры: 27
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
Чтобы искать по части имени нужно последний параметр установить в True
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Мне понравилось", Default, True) ; элемент
 

Naisho

Знающий
Сообщения
86
Репутация
12
Имеется окно, где в зависимости от "How found:" различается что, собственно найдено:

How found: Selected from tree...
Код:
How found:	Selected from tree...
RuntimeId:	"[42.263498]"
BoundingRectangle:	{l:1235 t:620 r:1519 b:644}
ProcessId:	1576
ControlType:	UIA_TextControlTypeId (0xC364)
LocalizedControlType:	"text"
Name:	"Искомый текст"
HasKeyboardFocus:	false
IsKeyboardFocusable:	false
IsEnabled:	true
AutomationId:	"1002"
ClassName:	"Static"
IsPassword:	false
NativeWindowHandle:	0x4054A
IsOffscreen:	false
FrameworkId:	"Win32"
ProviderDescription:	"[pid:3384,hwnd:0x4054A Annotation:Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main:Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll); Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId:	0
LegacyIAccessible.Name:	"Искомый текст"
LegacyIAccessible.Role:	text (0x29)
LegacyIAccessible.State:	read only (0x40)
IsDockPatternAvailable:	false
IsExpandCollapsePatternAvailable:	false
IsGridItemPatternAvailable:	false
IsGridPatternAvailable:	false
IsInvokePatternAvailable:	false
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:	"Надпись 1" button
Previous:	"Надпись 2" text
Other Props:	Object has no additional properties
Children:	Container has no children
Ancestors:	"Имя окна" dialog
	"Desktop" pane
	[ No Parent ]


How found: Mouse move
Код:
How found:	Mouse move (1359,620)
	hwnd=0x0004054A 64bit class="Static" style=0x50024000 ex=0x4
RuntimeId:	"[42.263498]"
BoundingRectangle:	{l:1235 t:620 r:1519 b:644}
ProcessId:	1576
ControlType:	UIA_TextControlTypeId (0xC364)
LocalizedControlType:	"text"
HasKeyboardFocus:	false
IsKeyboardFocusable:	false
IsEnabled:	true
AutomationId:	"1002"
ClassName:	"Static"
IsPassword:	false
NativeWindowHandle:	0x4054A
IsOffscreen:	false
FrameworkId:	"Win32"
ProviderDescription:	"[pid:3384,hwnd:0x4054A Annotation:Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main:Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll); Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId:	0
LegacyIAccessible.Role:	text (0x29)
LegacyIAccessible.State:	read only (0x40)
IsDockPatternAvailable:	false
IsExpandCollapsePatternAvailable:	false
IsGridItemPatternAvailable:	false
IsGridPatternAvailable:	false
IsInvokePatternAvailable:	false
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:	(null) button
Previous:	(null) text
Other Props:	Object has no additional properties
Children:	Container has no children
Ancestors:	"" dialog
	"Desktop" pane
	[ No Parent ]

Хотелось бы заполучить Искомый текст, но конструкция:
Код:
Local $oParent = _UIA_GetElementFromHandle($hWnd)
Local $aAllElements = _UIA_FindAllElements($oParent)
Local $sName
For $i = 1 To $aAllElements[0]
	$sName = _UIA_ElementGetPropertyValue($aAllElements[$i], "Name")
	ConsoleWrite($sName & @CRLF)
Next


даёт только:
Код:
Open








Context help
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Naisho
Честно говоря, с подобным поведением элементов я раньше не сталкивался (обычно бывает наоборот - под курсором имена определяются, а в дереве - нет).
Попробуйте запустить скрипт через AutoIt3_x64.exe. Дополнительно, проверьте работу скрипта при активном, неактивном и свёрнутом окне. Ещё можно попробовать запустить скрипт от имени администратора.


Добавлено:
Сообщение автоматически объединено:

Кстати, этот элемент выглядит, как стандартный Static (ClassName: "Static", NativeWindowHandle: 0x4054A). Попробуйте функции
Код:
ControlGetText()
WinGetText()
 

Naisho

Знающий
Сообщения
86
Репутация
12
х64/х86 , окно активно/не активно, в компилированном виде от имени administrator, #RequireAdmin не выдают текста. Стандартные *GetText() функции также возвращают пустую строку, но при этом штатный AutoIt Window Info обоих разрядностей исправно показывает всю информацию по всем элементам, включая текст.

Можно как то получить само дерево в текстовом виде/массиве - как оно видно в левом окне inspect.exe ?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Naisho
штатный AutoIt Window Info обоих разрядностей исправно показывает всю информацию по всем элементам, включая текст.
Он показывает информацию об элементе под "мишенью" или во вкладках "Visible Text" и "Hidden Text"?

Можно как то получить само дерево
Конечно можно. Для этого нужно написать рекурсивную функцию построения дерева элементов. Но, думаю, это вам не поможет, т.к. функция _UIA_FindAllElements() фактически перебирает все элементы, только не выстраивает дерево.

Боюсь, я не смогу вам помочь, пока не разберусь, как эта программа устроена. А для этого мне нужно с ней поработать.
 

Naisho

Знающий
Сообщения
86
Репутация
12
Показывает если навести мишень на элемент - обводит его рамкой, информация появляется на вкладках "Control" и "Summary". Вкладки "Visible Text" и "Hidden Text" остаются пустыми.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
OffTopic:
Naisho
Очень странное поведение элементов. Не видя программы - больше ничего сказать не могу.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Обновление до версии 1.5:
- добавлена глобальная переменная $UIA_ElementVersion, позволяющая указывать версию создаваемого элемента (объекта): 0-авто; 1-WIN_7 и ниже; 2-WIN_8; 3-WIN_81; 4,5-WIN_10
- в архив добавлены обе версии Inspect (Win7 и Win10) для возможности сравнения свойств элементов разных версий

По умолчанию создаётся максимально совместимый элемент (версии 1 - WIN_7 и ниже). Значение 0 означает автоопределение, т.е. создаётся элемент максимально возможной версии для текущей системы. Некорректное значение $UIA_ElementVersion считается ошибкой. В связи с глобальной областью видимости переменной, можно в любом месте скрипта "на лету" изменять совместимость с разными версиями Windows.
 

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток, InnI
Помогите, пожалуйста, разобраться.
Я всё о том лайке на ютубе. Когда код в отдельности - всё ок. Но добавил лайк в общий скрипт - и он забывает что есть лайк т.е. не работает :( Потом тестирую код отдельно - то работает то нет
:stars:
Еще заметил - что если просто перед скриптом кликнуть 1 раз вручную по лайку (а потом его убрать) - то скрипт запущенный сразу после этого: срабатывает...
При том - что та же конструкция никаких проблем не испытывает при клике по кнопке "подписаться".
Как по вашему - что может быть причиной.
 
Верх