Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
UIAutomate - автоматизация нестандартных элементов GUI
Нет, не все. Файл содержит определения констант и описания интерфейсов до Win10 1703 Creators Update включительно.
Но у меня пока не было необходимости использовать даже появившиеся в Win8 интерфейсы. Не говоря уже о дальнейшем их развитии.
#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-объектами, а они мне нужны).
Самое забавное, что позавчера код не работал, вчера внезапно заработал, сегодня снова не работает. При попытке искать в дереве элементов более глубоко вложенные объекты, типа кнопок, тоже валятся ошибки (но, кажется, другие, типа "неправильное условие поиска"; не вникал)
Метод FindAll завершился с ошибкой. Почему - не знаю. Но по опыту скажу: либо нет доступа (недостаточно прав), либо превышено количество элементов дерева. Максимальное количество может быть как 32000, так и 5000 (зависит от программы).
Здесь всё понятно. Панели найдены, но среди них нет ни одной с именем "The Ribbon". Такое бывает, когда inspect не отображает элемент в дереве (но у вас, я вижу, отображает), или когда дерево "устарело" (окно обновилось, вкладка переключилась и т.д.). Также убедитесь, что WinGetHandle() нашла именно то окно, которое нужно (т.к. она может и скрытые окна найти).
Пробуйте искать последовательно от родителя к потомку через _UIA_GetElementFromCondition() с ограничением $TreeScope_Children. Также можно попробовать _UIA_FindAllElementsEx() со сложным условием.
Спасибо за столь быстрый ответ. Действительно, дело оказалось в количестве элементов дерева (в окне программы грид с ~10k строк; когда он ещё не был прогружен - тогда программа и работала в исходном виде). Подскажите, где вы проходили курсы телепатии? =)
И да, отдельное спасибище за библиотеку!
Преамбула: В одном из моих AutoIT скриптов FF ходит со страницы на страницу, переходя по ссылкам (по разным сайтам). Ходит, используя в качестве прокси сеть TOR. Сама проблема: Видимо, некоторые сервера не всегда корректно передают данные, из-за чего иногда появляется следующее окошко с...
Описание:
Набор функций, расширяющий возможности AutoIt по работе с нестандартными элементами GUI. При помощи данных функций возможна автоматизация элементов таких классов, как DirectUIHWND, NetUIHWND, UIRibbonWorkPane, автоматизация таких программ, как Google Chrome, Mozilla Firefox, автоматизация элементов графических интерфейсов, написанных на Delphi, .NET (WPF), QT и т.д.
@InnI
Может уже спрашивали, но всё же...
Не планируется ли справка по данной библиотеке?
Штука полезная, но даже мне иногда трудно с ней разобраться...
Стесняюсь спросить что за консоль SciTe. А так ошибок нет. В коде , где идёт нажатие на вкладку "Лист рассылки" функция _UIA_ElementMouseClick не срабатывает а срабатывает _UIA_ElementDoDefaultAction. Почему так? И почему на левой панеле Inspect не показывает где объект вложен. Это происходит...
autoit-script.ru
Но моё отношение к "справке" не изменилось. Переводить текстовое описание в html смысла не вижу.
Возможно, разобраться нужно не с UDF, а с самим интерфейсом UIAutomation. Так же, как, например, для понимания работы с IE.au3 хорошо бы иметь представление о DOM и HTML.
To make it easier to maintain the UIA code, I've decided to split the code this way: This new thread is used for the actual UIA UDFs. Ie. the files stored in Includes folders and named UIA_*.au3 or UIAEH_*.au3. The UIASpy thread contains only code that is used directly in the UIASpy GUI, but not ...
Для меня описание перед каждой функцией и есть полноценное. Старался как мог. Лучше не сделаю.
К тому же вы сами предлагаете это описание через утилиту конвертнуть в справку. Ну и в чём смысл? Будет отдельный файл с тем же содержимым.
По поводу примеров - один приложен, плюс на форуме уже достаточно накопилось. Да и как узнать, что пример будет понятен? Справка AutoIt вся примерами забита и всё равно сюда приходят и спрашивают. Поэтому я уверен, что и эту справку читать не будут.
Так и здесь не обязательно. Специально так делал... ну, во всяком случае стремился к этому. Из Inspect копируете, в функцию подставляете, результат получаете. Всё.
Фактически из всей UDF нужно три функции: _UIA_GetElementFromHandle, _UIA_GetControlTypeElement, _UIA_ElementDoDefaultAction.
Это вы про примеры из IE.au3? По мне так это не примеры, а просто описание функции в виде кода, т.е. как она будет выглядеть с реальными параметрами и подсветкой.
Да но спрашивают меньше, по крайней мере те кто имеет желание изучать, а не решать одну конкретную одноразовую задачу.
В любом случае спасибо за библиотеку и ссылки выше, будет время (а сейчас кажется оно будет ) напишу подробные примеры.
Сегодня я столкнулся с интересной особенностью функции _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
Я очень извиняюсь, но данное примечание у меня ни как не связавается с необходимостью применения Number().
Возможно это прозрачно для програмиста C# или С++ , но не для кодера Autoit.
Сообщение автоматически объединено:
Было бы неплохо расширить примечание к данной функции несколькими дополнительными строчками с примерами по тому же принципу:
True – правильно, “True” – не правильно.
Что бы другие не наступали на те же грабли.
Это должно быть прозрачно для программиста в целом.
Если вы изучаете язык программирования, то должны знать основы программирования, а не только одного конкретного языка.
В данном случае нужно ещё и понимать спецификацию типизации языка.
Столкнулся с следующей ситуацией: Приложение имеет веб-интерфейс и судя по всему запускает Хром с какими-то параметрами, которые нарушают работу UIAutomate, а именно все элементы не относящееся к шапке браузера перестают детектица. Т.е. на тестовой странице без запущенного приложения _UIA_FindAllElements находит 2000 элементов, а после запуска, на этой же странице только 60. Как это можно обойти? Куда следует смотреть?