Что нового

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

lettterssino

Знающий
Сообщения
109
Репутация
10
В утилите Inspect в меню Action выбор пункта LegacyIAccessible.DoDefaultAction тоже не срабатывает?
А если в меню Action выбрать пункт Invoke.Invoke - сработает?
LegacyIAccessible.DoDefaultAction не срабатывает, а вот Toggle.Toggle срабатывает
 

lettterssino

Знающий
Сообщения
109
Репутация
10
@InnI
Не могли бы подсказать такой вопрос, есть вопрос, можно ли обратиться как-то сразу к элементу. В инспекте, он появляется лишь если нажать на другую кнопку и откроется всплывающее окно. Но если через инспект выполнить action, уже без этого окна, то он сразу выполнит то, что мне надо.
Код:
How found:    Selected from tree...
Name:    "Деталь"
ControlType:    UIA_MenuItemControlTypeId (0xC35B)
LocalizedControlType:    "элемент меню"
IsEnabled:    true
IsOffscreen:    true
IsKeyboardFocusable:    false
HasKeyboardFocus:    false
AcceleratorKey:    ""
AccessKey:    ""
ProcessId:    18808
RuntimeId:    [7.4978.24BC5BE]
AutomationId:    "|ItemKompas.m3d57600"
FrameworkId:    "WPF"
ClassName:    "MenuItem"
IsControlElement:    true
IsContentElement:    true
ProviderDescription:    "[pid:18808,providerId:0x0 Main(parent link):Unidentified Provider (managed:MS.Internal.Automation.ElementProxy, PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)]"
IsPassword:    false
ItemStatus:    ""
ItemType:    ""
IsRequiredForForm:    false
HelpText:    ""
ClickablePoint:    {x:-2147483648 y:-2147483648}
Orientation:    0
IsAnnotationPatternAvailable:    false
IsDragPatternAvailable:    false
IsDockPatternAvailable:    false
IsDropTargetPatternAvailable:    false
IsExpandCollapsePatternAvailable:    false
IsGridItemPatternAvailable:    false
IsGridPatternAvailable:    false
IsInvokePatternAvailable:    true
IsItemContainerPatternAvailable:    false
IsLegacyIAccessiblePatternAvailable:    false
IsMultipleViewPatternAvailable:    false
IsObjectModelPatternAvailable:    false
IsRangeValuePatternAvailable:    false
IsScrollItemPatternAvailable:    false
IsScrollPatternAvailable:    false
IsSelectionItemPatternAvailable:    false
IsSelectionPatternAvailable:    false
IsSpreadsheetItemPatternAvailable:    false
IsSpreadsheetPatternAvailable:    false
IsStylesPatternAvailable:    false
IsSynchronizedInputPatternAvailable:    true
IsTableItemPatternAvailable:    false
IsTablePatternAvailable:    false
IsTextChildPatternAvailable:    false
IsTextEditPatternAvailable:    false
IsTextPatternAvailable:    false
IsTextPattern2Available:    false
IsTogglePatternAvailable:    false
IsTransformPatternAvailable:    false
IsTransform2PatternAvailable:    false
IsValuePatternAvailable:    false
IsVirtualizedItemPatternAvailable:    false
IsWindowPatternAvailable:    false
IsCustomNavigationPatternAvailable:    false
FirstChild:    "" текст
LastChild:    "" текст
Next:    "Сборка" элемент меню
Previous:    "" разделитель
Other Props:    Object has no additional properties
Children:    "" текст
    "" текст
    "" текст
    "" текст
    "" текст
    "Деталь" текст
    "" текст
Ancestors:    "" область
    "" окно
    [ No Parent ]

А вот это возникает, когда кнопку видно
Код:
How found:    Mouse move (35,138)
    hwnd=0x00530260 64bit class="HwndWrapper[DefaultDomain;;02f2be48-4901-4030-b587-df39a9d72247]" style=0x96000000 ex=0x8080088
Name:    "Деталь"
ControlType:    UIA_MenuItemControlTypeId (0xC35B)
LocalizedControlType:    "элемент меню"
BoundingRectangle:    {l:27 t:124 r:205 b:148}
IsEnabled:    true
IsOffscreen:    false
IsKeyboardFocusable:    true
HasKeyboardFocus:    true
AcceleratorKey:    ""
AccessKey:    ""
ProcessId:    18808
RuntimeId:    [7.4978.24BC5BE]
AutomationId:    "|ItemKompas.m3d57600"
FrameworkId:    "WPF"
ClassName:    "MenuItem"
IsControlElement:    true
IsContentElement:    true
ProviderDescription:    "[pid:18808,providerId:0x0 Main(parent link):Unidentified Provider (managed:MS.Internal.Automation.ElementProxy, PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)]"
IsPassword:    false
ItemStatus:    ""
ItemType:    ""
IsRequiredForForm:    false
HelpText:    ""
ClickablePoint:    {x:116 y:136}
Orientation:    0
LegacyIAccessible.ChildId:    0
LegacyIAccessible.DefaultAction:    "Выполнить"
LegacyIAccessible.Description:    ""
LegacyIAccessible.Help:    ""
LegacyIAccessible.KeyboardShortcut:    ""
LegacyIAccessible.Name:    "Деталь"
LegacyIAccessible.Role:    элемент меню (0xC)
LegacyIAccessible.State:    с фокусом ввода,фокусируемое (0x100004)
LegacyIAccessible.Value:    ""
IsAnnotationPatternAvailable:    false
IsDragPatternAvailable:    false
IsDockPatternAvailable:    false
IsDropTargetPatternAvailable:    false
IsExpandCollapsePatternAvailable:    false
IsGridItemPatternAvailable:    false
IsGridPatternAvailable:    false
IsInvokePatternAvailable:    true
IsItemContainerPatternAvailable:    false
IsLegacyIAccessiblePatternAvailable:    true
IsMultipleViewPatternAvailable:    false
IsObjectModelPatternAvailable:    false
IsRangeValuePatternAvailable:    false
IsScrollItemPatternAvailable:    false
IsScrollPatternAvailable:    false
IsSelectionItemPatternAvailable:    false
IsSelectionPatternAvailable:    false
IsSpreadsheetItemPatternAvailable:    false
IsSpreadsheetPatternAvailable:    false
IsStylesPatternAvailable:    false
IsSynchronizedInputPatternAvailable:    true
IsTableItemPatternAvailable:    false
IsTablePatternAvailable:    false
IsTextChildPatternAvailable:    false
IsTextEditPatternAvailable:    false
IsTextPatternAvailable:    false
IsTextPattern2Available:    false
IsTogglePatternAvailable:    false
IsTransformPatternAvailable:    false
IsTransform2PatternAvailable:    false
IsValuePatternAvailable:    false
IsVirtualizedItemPatternAvailable:    false
IsWindowPatternAvailable:    false
IsCustomNavigationPatternAvailable:    false
FirstChild:    "" текст
LastChild:    "" текст
Next:    "Сборка" элемент меню
Previous:    "" разделитель
Other Props:    Object has no additional properties
Children:    "" текст
    "" текст
    "" текст
    "" текст
    "" текст
    "Деталь" текст
    "" текст
Ancestors:    "" область
    "" окно
    "КОМПАС-3D v22 Beta (releases/v22 build 1221)" окно
    "Рабочий стол 1" панель
    [ No Parent ]
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Найти этот пункт меню можно так
Код:
$oElem = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Деталь")
; или так, если идентификатор m3d57600 уникальный и не меняется при каждом запуске
; $oElem = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "|ItemKompas.m3d57600", "AutomationId")

Кликнуть мышью - только когда виден (когда есть координаты). И, скорее всего, без установки фокуса (последний параметр $fSetFocus функции _UIA_ElementMouseClick установить в False).
Применить DoDefaultAction - тут пробовать надо. Возможно, элемент нужно хотя бы один раз создать, то есть хотя бы раз после запуска программы кликнуть по кнопке.
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Если кому-то будет нужно метод Toggle, аналогичный DefaulAction
Код:
Func _UIA_ElementToggle($oElement)
  If Not IsObj($oElement) Then Return SetError(1, __UIA_ConsoleWriteError("_UIA_ElementToggle : параметр не является объектом"), 0)
  Local $pToggle, $oToggle
  $oElement.GetCurrentPattern($UIA_TogglePatternId, $pToggle)
  $oToggle = ObjCreateInterface($pToggle, $sIID_IUIAutomationTogglePattern, $dtagIUIAutomationTogglePattern)
  If Not IsObj($oToggle) Then Return SetError(2, __UIA_ConsoleWriteError("_UIA_ElementToggle : ошибка создания объекта на основе шаблона Toggle"), 0)
  Local $iErrorCode = $oToggle.Toggle()
  If $iErrorCode Then Return SetError(3, __UIA_ConsoleWriteError("_UIA_ElementToggle : ошибка выполнения метода (0x" & Hex($iErrorCode) & ")"), 0)
  Return 1
EndFunc ; _UIA_ElementToggle
 
Последнее редактирование:
  • Like
Реакции: InnI
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Неплохо :good:
Позволю пару замечаний.
1. Метод называется Toggle, поэтому название функции лучше сделать _UIA_ElementToggle
2. В описании ошибки нужно поправить: ... на основе шаблона Toggle
3. В именах переменных можно заменить "IAccess" на "Toggle" для лучшей читаемости
 

Round

Новичок
Сообщения
3
Репутация
0
Пытаюсь заскроллить в вайбере окно с чатом. Для этого оно должно быть в фокусе, но что то ни в какую, ни с родителем, ни напрямую.
Подскажите плиз
Код:
$hWnd = WinWait("Viber", "", 3)
WinActivate("Viber")
Sleep(1111)

If Not $hWnd Then Exit MsgBox(0x40000, "UIAutomate", "Окно V не найдено", 3)
$oParent = _UIA_GetElementFromHandle($hWnd)
$oPanelPa = _UIA_WaitControlTypeElement($oParent, "StackView_QMLTYPE_231", "ClassName")
$oElement = _UIA_GetControlTypeElement($oPanelPa, "SplitView_QMLTYPE_601_QML_685", "ClassName")
_UIA_ElementMouseClick($oElement)
_UIA_ElementSetFocus($oElement)
_UIA_ElementMouseClick($oElement)

MouseWheel("up",1000)


Код:
How found:    Mouse move (1148,487)
    hwnd=0x00030106 32bit class="Qt5153QWindowOwnDCIcon" style=0x96CF0000 ex=0x100
RuntimeId:    "[42.196870.2.-2147483641]"
BoundingRectangle:    {l:460 t:211 r:1435 b:837}
ProcessId:    1752
ControlType:    UIA_PaneControlTypeId (0xC371)
LocalizedControlType:    "панель"
Name:    ""
AccessKey:    ""
HasKeyboardFocus:    false
IsKeyboardFocusable:    false
IsEnabled:    true
AutomationId:    ""
ClassName:    "SplitView_QMLTYPE_601_QML_685"
HelpText:    ""
IsControlElement:    true
IsContentElement:    true
IsPassword:    false
IsOffscreen:    false
FrameworkId:    "Qt"
ProviderDescription:    "[pid:1752,hwnd:0x0 Main(parent link):Unidentified Provider (unmanaged:qwindows.dll)]"
Value.IsReadOnly:    false
Value.Value:    ""
LegacyIAccessible.ChildId:    0
LegacyIAccessible.DefaultAction:    "Нажать"
LegacyIAccessible.Description:    ""
LegacyIAccessible.Help:    ""
LegacyIAccessible.KeyboardShortcut:    ""
LegacyIAccessible.Name:    ""
LegacyIAccessible.Role:    панель (0x10)
LegacyIAccessible.State:    обычный (0x0)
LegacyIAccessible.Value:    ""
IsDockPatternAvailable:    false
IsExpandCollapsePatternAvailable:    false
IsGridItemPatternAvailable:    false
IsGridPatternAvailable:    false
IsInvokePatternAvailable:    true
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:    true
IsWindowPatternAvailable:    false
IsItemContainerPatternAvailable:    false
IsVirtualizedItemPatternAvailable:    false
IsSynchronizedInputPatternAvailable:    false
FirstChild:    [null]
LastChild:    [null]
Next:    [null]
Previous:    [null]
Other Props:    Object has no additional properties
Children:    Container has no children
Ancestors:    "" особый
    "Viber" окно
    "Рабочий стол" панель
    [ No Parent ]
 

Round

Новичок
Сообщения
3
Репутация
0
Создайте скрипт из двух строк: Sleep и MouseWheel. За время Sleep вручную кликните по элементу и убедитесь, что MouseWheel работает.
я так уже делаю. Но нужно каждый день и не по одному сообществу. В ручную - тяжко
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
После выполнения uia-кода курсор мыши находится над тем же элементом, что и при ручном клике?
Сообщение автоматически объединено:

А вы пробовали встроенными функциями AutoIt работать с контролом "[class:Qt5153QWindowOwnDCIcon]"?
Найти его положение и размеры, кликнуть мышью по его координатам или установить ему фокус?
 
Последнее редактирование:

Round

Новичок
Сообщения
3
Репутация
0
После выполнения uia-кода курсор мыши находится над тем же элементом, что и при ручном клике?
Сообщение автоматически объединено:

А вы пробовали встроенными функциями AutoIt работать с контролом "[class:Qt5153QWindowOwnDCIcon]"?
Найти его положение и размеры, кликнуть мышью по его координатам или установить ему фокус?
Встроенными - не пробовал. По координатам не хотелось, потом все надо будет привязывать к разрешению экрана, а работает на виртуалке все это дело.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Встроенными - не пробовал
Попробуйте. Вдруг получится.

По координатам не хотелось
А вы думаете, как работает _UIA_ElementMouseClick? Находит позицию и размеры элемента, вычисляет центр, перемещает мышь и кликает. То же самое можно сделать через ControlGetPos.
 

TrustedCo

Новичок
Сообщения
15
Репутация
0
Неплохо :good:
Позволю пару замечаний.
1. Метод называется Toggle, поэтому название функции лучше сделать _UIA_ElementToggle
2. В описании ошибки нужно поправить: ... на основе шаблона Toggle
3. В именах переменных можно заменить "IAccess" на "Toggle" для лучшей читаемости

Собственно в тему проблема, но не получается так решить посмотрите пожалуйста
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Кстати вот такой есть пример, шаблоны toggle не работает, в чём может быть проблема? Обращение через Inspect тоже не работает, хотя вроде как и используются шаблоны.
Код:
How found:    Selected from tree...
Name:    "Execute_Command"
ControlType:    UIA_ButtonControlTypeId (0xC350)
LocalizedControlType:    "кнопка"
BoundingRectangle:    {l:0 t:77 r:120 b:102}
IsEnabled:    true
IsOffscreen:    false
IsKeyboardFocusable:    true
HasKeyboardFocus:    false
AcceleratorKey:    "Execute_Command"
AccessKey:    ""
ProcessId:    26348
RuntimeId:    [7.66EC.A49637]
AutomationId:    "TbSetcdw_spc1"
FrameworkId:    "WPF"
ClassName:    "Button"
IsControlElement:    true
IsContentElement:    true
ProviderDescription:    "[pid:26348,providerId:0x0 Main(parent link):Unidentified Provider (managed:MS.Internal.Automation.ElementProxy, PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)]"
IsPassword:    false
ItemStatus:    ""
ItemType:    ""
IsRequiredForForm:    false
HelpText:    "Управление"
ClickablePoint:    {x:60 y:89}
Orientation:    0
LegacyIAccessible.ChildId:    0
LegacyIAccessible.DefaultAction:    "Нажать"
LegacyIAccessible.Description:    ""
LegacyIAccessible.Help:    "Управление"
LegacyIAccessible.KeyboardShortcut:    ""
LegacyIAccessible.Name:    "Execute_Command"
LegacyIAccessible.Role:    кнопка (0x2B)
LegacyIAccessible.State:    фокусируемое (0x100000)
LegacyIAccessible.Value:    ""
Toggle.ToggleState:    Off (0)
IsAnnotationPatternAvailable:    false
IsDragPatternAvailable:    false
IsDockPatternAvailable:    false
IsDropTargetPatternAvailable:    false
IsExpandCollapsePatternAvailable:    false
IsGridItemPatternAvailable:    false
IsGridPatternAvailable:    false
IsInvokePatternAvailable:    false
IsItemContainerPatternAvailable:    false
IsLegacyIAccessiblePatternAvailable:    true
IsMultipleViewPatternAvailable:    false
IsObjectModelPatternAvailable:    false
IsRangeValuePatternAvailable:    false
IsScrollItemPatternAvailable:    false
IsScrollPatternAvailable:    false
IsSelectionItemPatternAvailable:    false
IsSelectionPatternAvailable:    false
IsSpreadsheetItemPatternAvailable:    false
IsSpreadsheetPatternAvailable:    false
IsStylesPatternAvailable:    false
IsSynchronizedInputPatternAvailable:    true
IsTableItemPatternAvailable:    false
IsTablePatternAvailable:    false
IsTextChildPatternAvailable:    false
IsTextEditPatternAvailable:    false
IsTextPatternAvailable:    false
IsTextPattern2Available:    false
IsTogglePatternAvailable:    true
IsTransformPatternAvailable:    false
IsTransform2PatternAvailable:    false
IsValuePatternAvailable:    false
IsVirtualizedItemPatternAvailable:    false
IsWindowPatternAvailable:    false
IsCustomNavigationPatternAvailable:    false
FirstChild:    "" текст
LastChild:    "Управление" текст
Next:    "Execute_Command" кнопка
Previous:    "Execute_Command" кнопка
Other Props:    Object has no additional properties
Children:    "" текст
    "" текст
    "" текст
    "" текст
    "" текст
    "" текст
    "Управление" текст
Ancestors:    "" особый
    "" особый
      "Рабочий стол 1" панель
    [ No Parent ]

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

Неплохо :good:
Позволю пару замечаний.
1. Метод называется Toggle, поэтому название функции лучше сделать _UIA_ElementToggle
2. В описании ошибки нужно поправить: ... на основе шаблона Toggle
3. В именах переменных можно заменить "IAccess" на "Toggle" для лучшей читаемости
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
шаблоны toggle не работает
Шаблоны - это описания методов (интерфейсы). Чтобы методы работали разработчик должен их реализовать - написать код, выполняющий определённые действия при возникновении конкретного события (получении сообщения). В данном случае либо метод Toggle не реализован (если это возможно), либо ничего не делает. Такое часто случается даже у Microsoft: реализуют обработчик клика мыши (DoDefaultAction) и пропускают специфичные методы, которые обычным пользователям не нужны. Бывает, даже Invoke не работает, хотя этот метод фактически обёртка для DoDefaultAction.
 

saraconor

Новичок
Сообщения
404
Репутация
3
Мне даже с хелпом трудно разобраться, т.к. другой браузер. Помогите пожалуйста, хотя-бы на примере этой страницы в Mozila firefox, как обнаружить текст "автоматизация нестандартных" в заголовке темы, как это использовать чтобы дать переменную найденному элементу, и затем прочесть весь текст из найденного элемента: "UIAutomate - автоматизация нестандартных элементов GUI", а потом допустим нажать кнопку "справка" наверху? А то что ни делаю - ничего не работает ((
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Работать с Firefox через IUIAutomation очень сложно. Лучше сразу изучайте WebDriver на официальном сайте.
Код:
#include <UIAutomate.au3>

; окно firefox
$oParent = _UIA_GetElementFromHandle(WinGetHandle("[RegexpTitle:.*Mozilla Firefox]"))
; контейнер страницы
$oDocument = _UIA_GetControlTypeElement($oParent, "UIA_DocumentControlTypeId", "UIAutomate", "Name", True)
; поиск по части текста (поле Edit, не Text)
$oEdit = _UIA_GetControlTypeElement($oDocument, "UIA_EditControlTypeId", "автоматизация нестандартных", "Name", True)
; получение всего текста
$sText = _UIA_ElementGetPropertyValue($oEdit, "Name")
ConsoleWrite($sText & @CRLF)

; ссылка "СПРАВКА"
; имя ссылки начинается со значка, поэтому ищем по части текста
$oItem = _UIA_GetControlTypeElement($oDocument, "UIA_HyperlinkControlTypeId", "СПРАВКА", "Name", True)
; переход по ссылке
_UIA_ElementDoDefaultAction($oItem)
 

saraconor

Новичок
Сообщения
404
Репутация
3
Ошибку выдает:
Код:
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_GetControlTypeElement : ошибка создания массива элементов (объектов)
!> _UIA_GetControlTypeElement : первый параметр не является объектом
!> _UIA_ElementGetPropertyValue : первый параметр не является объектом
0
!> _UIA_GetControlTypeElement : первый параметр не является объектом
!> _UIA_ElementDoDefaultAction : параметр не является объектом
+>00:09:15 AutoIt3.exe ended.rc:0

Версия Autoit: 3.3.14.2
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Firefox перечисляет все вкладки, поэтому объектов может быть много. Попробуйте с одной вкладкой.
Если не получится - сообщите версию Firefox.
Также убедитесь, что Firefox не запущен с правами администратора.
 
Верх