Что нового

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

Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
файл UIAConstants.au3 содержит все доступные действия с элементами?
Нет, не все. Файл содержит определения констант и описания интерфейсов до Win10 1703 Creators Update включительно.
Но у меня пока не было необходимости использовать даже появившиеся в Win8 интерфейсы. Не говоря уже о дальнейшем их развитии.
 

Dragonling

Новичок
Сообщения
3
Репутация
0
Здравствуйте. Есть такой код:
Код:
#include "UIAutomate.au3"

Opt ("MustDeclareVars", 1)

global const $gsWinNameRemoteConsole = "Консоль управления ЦР"

Func main()
    local $hwnd = WinGetHandle($gsWinNameRemoteConsole)
    local $oWindow = _UIA_GetElementFromHandle($hWnd)
    if @error then Exit
    local $oRibbon = _UIA_GetControlTypeElement($oWindow, $UIA_PaneControlTypeId, "The Ribbon")
    if @error then
        MsgBox (0, @ScriptLineNumber, @error)    ; @error = 4
        Exit
    EndIf
    msgbox (0, "", "OK!")
EndFunc

main()

Если запустить скрипт и "Консоль управления ЦР" под одним и тем же непривилегированным пользователем, то выдаётся ошибка 4, а в консоли текст:
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
!> _UIA_FindAllElements : ошибка создания массива элементов (объектов)
!> _UIA_GetControlTypeElement : ошибка создания массива элементов (объектов)

Если запустить скрипт из scite под админом, то выдаётся ошибка 6, а в консоли текст:
!> _UIA_GetControlTypeElement : значение указанного свойства найденных элементов не соответствует заданному

Операционка Win7Corp х32. Autoit 3.3.12.0 (более высокие версии глючат с COM-объектами, а они мне нужны).

Информация об элементе из inspect.exe
How found: Selected from tree...
RuntimeId: "[42.131708]"
BoundingRectangle: {l:0 t:-4 r:1280 b:148}
ProcessId: 2304
ControlType: UIA_PaneControlTypeId (0xC371)
LocalizedControlType: "панель"
Name: "The Ribbon"
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: false
IsEnabled: true
AutomationId: "ribbon"
ClassName: "WindowsForms10.Window.8.app.0.2d4d161_r12_ad1"
HelpText: ""
IsPassword: false
NativeWindowHandle: 0x2027C
IsOffscreen: false
FrameworkId: "WinForm"
ProviderDescription: "[pid:4736,hwnd:0x2027C Main:Nested [pid:2304,hwnd:0x2027C Main(parent link):Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: ""
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "The Ribbon"
LegacyIAccessible.Role: страница свойств (0x26)
LegacyIAccessible.State: обычный (0x0)
LegacyIAccessible.Value: "The Ribbon"
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: "" кнопка
LastChild: "Lower Ribbon" панель
Next: [null]
Previous: "Status Bar" панель
Other Props: Object has no additional properties
Children: "" кнопка
"Quick Access Toolbar" панель инструментов
"Ribbon Tabs" вкладка
"Lower Ribbon" панель
Ancestors: "Консоль управления ЦР" окно
"Рабочий стол" панель
[ No Parent ]
Самое забавное, что позавчера код не работал, вчера внезапно заработал, сегодня снова не работает. При попытке искать в дереве элементов более глубоко вложенные объекты, типа кнопок, тоже валятся ошибки (но, кажется, другие, типа "неправильное условие поиска"; не вникал)

Подскажите, пожалуйста, куда копать?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
!> _UIA_FindAllElementsEx : ошибка создания объекта массива
Метод FindAll завершился с ошибкой. Почему - не знаю. Но по опыту скажу: либо нет доступа (недостаточно прав), либо превышено количество элементов дерева. Максимальное количество может быть как 32000, так и 5000 (зависит от программы).
!> _UIA_GetControlTypeElement : значение указанного свойства найденных элементов не соответствует заданному
Здесь всё понятно. Панели найдены, но среди них нет ни одной с именем "The Ribbon". Такое бывает, когда inspect не отображает элемент в дереве (но у вас, я вижу, отображает), или когда дерево "устарело" (окно обновилось, вкладка переключилась и т.д.). Также убедитесь, что WinGetHandle() нашла именно то окно, которое нужно (т.к. она может и скрытые окна найти).
Пробуйте искать последовательно от родителя к потомку через _UIA_GetElementFromCondition() с ограничением $TreeScope_Children. Также можно попробовать _UIA_FindAllElementsEx() со сложным условием.
 

Dragonling

Новичок
Сообщения
3
Репутация
0
Спасибо за столь быстрый ответ. Действительно, дело оказалось в количестве элементов дерева (в окне программы грид с ~10k строк; когда он ещё не был прогружен - тогда программа и работала в исходном виде). Подскажите, где вы проходили курсы телепатии? =)
И да, отдельное спасибище за библиотеку!
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Подскажите, где вы проходили курсы телепатии?
Тут недалеко
 

betauto

Новичок
Сообщения
15
Репутация
0
Описание:
Набор функций, расширяющий возможности AutoIt по работе с нестандартными элементами GUI. При помощи данных функций возможна автоматизация элементов таких классов, как DirectUIHWND, NetUIHWND, UIRibbonWorkPane, автоматизация таких программ, как Google Chrome, Mozilla Firefox, автоматизация элементов графических интерфейсов, написанных на Delphi, .NET (WPF), QT и т.д.
Как мне испольщовать ее в c#, в dll Autoit,подключаемой в проект, нет же этой библиотеки ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
@InnI
Может уже спрашивали, но всё же...
Не планируется ли справка по данной библиотеке?
Штука полезная, но даже мне иногда трудно с ней разобраться...
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Может уже спрашивали
Да, спрашивали:
Но моё отношение к "справке" не изменилось. Переводить текстовое описание в html смысла не вижу.

даже мне иногда трудно с ней разобраться
Возможно, разобраться нужно не с UDF, а с самим интерфейсом UIAutomation. Так же, как, например, для понимания работы с IE.au3 хорошо бы иметь представление о DOM и HTML.

Кстати, совсем недавно на официальном форуме появились:
- учебник по "чистому" IUIAutomation с примерами
- аналог Inspect под названием UIASpy
- работа с событиями (events)
Ссылки на эти и другие материалы собраны в одной теме:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Переводить текстовое описание в html смысла не вижу.
Я не про перевод, а про полноценное описание и примеры к библиотеке.

для понимания работы с IE.au3 хорошо бы иметь представление о DOM и HTML
Хорошо бы - да, но не всегда обязательно, да и там есть документация с примерами.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
полноценное описание и примеры
Для меня описание перед каждой функцией и есть полноценное. Старался как мог. Лучше не сделаю.
К тому же вы сами предлагаете это описание через утилиту конвертнуть в справку. Ну и в чём смысл? Будет отдельный файл с тем же содержимым.
По поводу примеров - один приложен, плюс на форуме уже достаточно накопилось. Да и как узнать, что пример будет понятен? Справка AutoIt вся примерами забита и всё равно сюда приходят и спрашивают. Поэтому я уверен, что и эту справку читать не будут.

Хорошо бы - да, но не всегда обязательно
Так и здесь не обязательно. Специально так делал... ну, во всяком случае стремился к этому. Из Inspect копируете, в функцию подставляете, результат получаете. Всё.
Фактически из всей UDF нужно три функции: _UIA_GetElementFromHandle, _UIA_GetControlTypeElement, _UIA_ElementDoDefaultAction.

там есть документация с примерами
Это вы про примеры из IE.au3? По мне так это не примеры, а просто описание функции в виде кода, т.е. как она будет выглядеть с реальными параметрами и подсветкой.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Справка AutoIt вся примерами забита и всё равно сюда приходят и спрашивают
Да но спрашивают меньше, по крайней мере те кто имеет желание изучать, а не решать одну конкретную одноразовую задачу.
В любом случае спасибо за библиотеку и ссылки выше, будет время (а сейчас кажется оно будет :morning:) напишу подробные примеры.
 

liond66

Новичок
Сообщения
117
Репутация
2
Сегодня я столкнулся с интересной особенностью функции _UIA_CreatePropertyCondition.
Может кому-то пригодиться.
Усли значение свойства элемента это число, полученное через переменную чтением поля ввода Input, то функция возвращает ошибку.
Решается некоторой хитростью: добавлением функции Number().
Вот для наглядности часть кода, которая выдаёт ошибку:
Код:
$InputRow = GUICtrlCreateInput("", 140, 128, 30, 20)
$Row = GUICtrlRead($InputRow)
$pCond = _UIA_CreatePropertyCondition("GridItem.Row", $Row)
$aEdit = _UIA_FindAllElementsEx($oParent, $pCond)
If Not @error Then


А вот так работает исправно:
Код:
$InputRow = GUICtrlCreateInput("", 140, 128, 30, 20)
$Row = Number(GUICtrlRead($InputRow))
$pCond = _UIA_CreatePropertyCondition("GridItem.Row", $Row)
$aEdit = _UIA_FindAllElementsEx($oParent, $pCond)
If Not @error Then
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Сегодня я столкнулся с интересной особенностью функции _UIA_CreatePropertyCondition.
Это указанно в справке к функции:
Значения свойств типизированы. Например, для свойства "IsEnabled" нужно указывать значение True, а не 1 и не "True"
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Я даже больше скажу. В консоль будет выведено сообщение
Код:
!> _UIA_CreatePropertyCondition : ошибка создания условия (см. примечание о типизации)
Но кто их читает эти ненужные сообщения, справки...
 

liond66

Новичок
Сообщения
117
Репутация
2
примечание о типизации
Я очень извиняюсь, но данное примечание у меня ни как не связавается с необходимостью применения Number().
Возможно это прозрачно для програмиста C# или С++ , но не для кодера Autoit.
Сообщение автоматически объединено:

Было бы неплохо расширить примечание к данной функции несколькими дополнительными строчками с примерами по тому же принципу:
True – правильно, “True” – не правильно.
Что бы другие не наступали на те же грабли.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Возможно это прозрачно для програмиста C# или С++ , но не для кодера Autoit.
Это должно быть прозрачно для программиста в целом.
Если вы изучаете язык программирования, то должны знать основы программирования, а не только одного конкретного языка.
В данном случае нужно ещё и понимать спецификацию типизации языка.
 

byby

Новичок
Сообщения
3
Репутация
0
Столкнулся с следующей ситуацией: Приложение имеет веб-интерфейс и судя по всему запускает Хром с какими-то параметрами, которые нарушают работу UIAutomate, а именно все элементы не относящееся к шапке браузера перестают детектица. Т.е. на тестовой странице без запущенного приложения _UIA_FindAllElements находит 2000 элементов, а после запуска, на этой же странице только 60. Как это можно обойти? Куда следует смотреть?
 

Soderling

Новичок
Сообщения
29
Репутация
0
Здравствуйте! Помогите пожалуйста.

Как узнать на каком месте в выдаче Yandex находится сайт, исключая рекламные объявления (тобишь их считать не нужно).
 
Верх