Что нового

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

Vengro

Новичок
Сообщения
4
Репутация
0
Приветствую. Попробовал я эту библиотеку, но почему-то не получается установить текст в адресную строку FireFox.
Вроде находит объект, кликается, устанавливается фокус, но текст не вставляется.

Устанавливает @error = 3 - ошибка выполнения метода.

Код:
#include <UIAutomate.au3>
Local $h1 = WinGetHandle("[CLASS:MozillaWindowClass]"), $oParent, $oButton
WinActivate($h1)
$oParent = _UIA_GetElementFromHandle($h1)
;$oButton = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Search or enter address", "LegacyIAccessible.Name")
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Search or enter address")
_UIA_ElementSetFocus($oButton)
_UIA_ElementTextSetValue($oButton, "autoit-script.ru")
MsgBox(0, @error & '           ' & @extended, IsObj($oParent) & @CR & @CR &  IsObj($oButton))
 
Последнее редактирование:

Gsq

Новичок
Сообщения
1
Репутация
0
Добрый день. В приложении Viber Win 8.1. не удаётся найти элементы. Кто-то добился успеха ? Спасибо.
 

Tick

Новичок
Сообщения
3
Репутация
0
Добрый день! Огромное спасибо уважаемому автору за огромный труд!
Я пытаюсь заставить скрипт работать при заблокированном экране.

Сначала я вызываю всплывающее меню (было непросто научиться сюда нажимать).
ControlClick(WinGetHandle (" MAIN WINDOW TITLE"),"","[CLASS:AfxWnd140; INSTANCE:24]","left",1,2,2)
Затем я нахожу нужный элемент и кликаю по нему.
Код:
$hWnd = WinWait("[class:#32768]"); окно меню 
$oParent = _UIA_GetElementFromHandle($hWnd)
$aElements = _UIA_FindAllElements($oParent, "ControlType", $UIA_MenuItemControlTypeId)
_UIA_ElementMouseClick($aElements[4],"left",2,2,2,True);

Все прекрасно работает, пока экран не заблокирован.
При заблокированном экране ControlClick нормально отрабатывает и возникает меню.
Но кликнуть по элементу меню не получается.
Я попробовал заменить последнюю строку на
_UIA_ElementDoDefaultAction($aElements[4])
работает на разблокированном экране почему-то только в случае, если выполнить две таких команды подряд :smile:
На заблокированном экране - не работает :(
Нашел мануал :smile:
https://www.autoitscript.com/wiki/FAQ#Why_doesn.27t_my_script_work_on_a_locked_workstation.3F
On a locked station any window will never be active (active is only dialog with text "Press Ctrl+Alt+Del"). In Windows locked state applications run hidden (behind that visible dialog) and do not have focus and active status. So generally don't use Send() MouseClick() WinActivate() WinWaitActive() WinActive() etc. Instead use ControlSend() ControlSetText() ControlClick() WinWait() WinExists() WinMenuSelectItem() etc. Doing so allows you to interact with an application regardless of whether it is active or not. It's possible to run such a script from scheduler on locked Windows stations.
соответственно, ControlClick работает, а _UIA_ElementMouseClick - нет. Но почему не работает _UIA_ElementDoDefaultAction? :(
ПОЖАЛУЙСТА, посоветуйте, есть ли какой-то выход?
буду вам бесконечно признателен...
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Затрудняюсь ответить, почему не работает _UIA_ElementDoDefaultAction на заблокированном экране. В связи с отсутствием ошибок можно предположить, что метод работает, только пункт меню его игнорирует.

Попробуйте стандартными средствами
Код:
; Вызов всплывающего меню SciTE и выбор "Select All"

#include <GuiMenu.au3>
#include <SendMessage.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

$sText = "Select All" ; текст пункта

Sleep(3333) ; время на блокировку вручную (Win+L)

ControlClick("[Class:SciTEWindow]", "", "Scintilla1", "right")
$hWnd = WinWait("[class:#32768]")
$hMenu = _SendMessage($hWnd, 0x01E1)
$iItem = _GUICtrlMenu_FindItem($hMenu, $sText)
$aRect = _GUICtrlMenu_GetItemRect($hWnd, $hMenu, $iItem)
_MouseLeftClick($hWnd, $aRect[0] + 3, $aRect[1] + 3)

Func _MouseLeftClick($hWnd, $X, $Y, $Sleep = 10)
  Local Const $MK_LBUTTON = 0x0001
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, $MK_LBUTTON, _WinAPI_MakeLong($X, $Y))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
EndFunc
 
  • Like
Реакции: Tick

grostech

Новичок
Сообщения
14
Репутация
0
Добрый день!
Стоит задача получить классы (идентификаторы) кнопок на сайте через браузер google chrome, и в соответствующей последовательности и с соответствующими паузами произвести по ним клики. Соответственно вопрос, можно ли при помощи Inspect_W10 получить необходимые классы нужных кнопок, сходу не получилось, поэтому прошу оказать помощи, какую функцию лучше использовать и каким образом идентифицировать требуемые кнопки. За помощь буду очень благодарен.
 

grostech

Новичок
Сообщения
14
Репутация
0
Для доступа к элементам страницы нужно запустить chrome с параметром --force-renderer-accessibility
Спасибо за подсказку, буду пробовать.
А можно тогда уточнить, каким образом можно проверить с каким параметром запущен chrome, чтобы цикл обходил запуск chrome с данным параметром в случае если он запущен надлежащим образом? Спасибо
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
@grostech
Наличие параметра при запуске - это лишь один из способов включения поддержки IUIAutomation в chrome. Можно ещё перейти по ссылке chrome://accessibility и включить/отключить доступ к странице. Ещё можно отправить специальное сообщение:
Поэтому наличие/отсутствие параметра при запуске может не совпадать с фактическим наличием/отсутствием доступа к элементам страницы.
 

grostech

Новичок
Сообщения
14
Репутация
0
Поэтому наличие/отсутствие параметра при запуске может не совпадать с фактическим наличием/отсутствием доступа к элементам страницы.
Спасибо, буду разбираться !!!
Сообщение автоматически объединено:

Добрый день. В процессе возникла элементарная проблема.
Как выдернуть координаты найденного элемента _UIA_ElementGetBoundingRectangle($oElement). Необходимо получить из массива левые x и y, после функцией MouseMove я хочу направить курсор на данные координаты, но проблема в том, что я не понимаю логики, а поиском я нашел только то что эта функция возвращает координаты найденного объекта. Одновременно хотел поинтересоваться, а есть мануал по описанию функций, в самом UIAutomate.au3 функции описаны исключительно по принципу относимости решения определенной задачи, но возникают элементарные вопросы, а ответ кроме как тут получить негде. Спасибо !
... Я Извиняюсь, все получилось !!!!
Сообщение автоматически объединено:

Добрый день. В процессе реализации требуемого алгоритма возникла сложность следующего вида. Необходимо найти на открытой странице сайта все кнопки одного типа, их там две, и получить координаты определенной, последовательность была следующая:
в начале функцией _UIA_GetControlTypeElement нахожу кнопку, после в функции _UIA_FindAllElements пытаюсь найти все элементы того типа, соответственно ничего не получается. Причина скорее всего не понимаю синтаксис, если можно сделайте примеры использования, потому, как в сухую вопрос застопорился. Также можете пояснить, что именно в с правой стороны инспектора является свойством объекта, значением, типом?img.jpg
На примере скриншота, если с типом еще более менее понятно это UIA_ButtonControlTypeId, то значение и свойство где найти в данном списке?

Благодарю за терпение и понимание!
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
все кнопки одного типа
Кнопка - это и есть тип элемента
Код:
; поиск всех кнопок
$aBtns = _UIA_FindAllElements($oParent, "ControlType", $UIA_ButtonControlTypeId)

значение и свойство где найти в данном списке
Слева - свойства, справа - значения.
 

breakin

Новичок
Сообщения
4
Репутация
0
Тему прочитал на 2 раза, не нашел про это.
Приложение, написанное на QT5, там есть combobox с детьми Edit и List.
Edit для ввода значения из списка, или вообще любого. Это работает с
сабжевым UDF.
У List есть куча ListItems, причем при раскрытии этого контрола
возникает панель, не дочерняя приложению, а дочерняя десктопу, со списком
ListItems. И со скролбаром, потому что все ListItems не влезают.
Список я могу получить с помощью
Local $aList = _UIA_FindAllElements($oMain, "ControlType", $UIA_ListControlTypeId)
и потом
Local $aListItems = _UIA_FindAllElements($aList[$i], "ControlType", $UIA_ListItemControlTypeId)
и там будут все ListItems, но только до первого вызова этой панели. После этого
$aList уже будет содержать не все ListItems.
Какие есть способы получить весь список, кроме перезапуска приложения?
Inspect сообщает следующее о панели
How found: Mouse move (533,177)
hwnd=0x000104E0 32bit class="Qt5QWindowPopupDropShadowSaveBits" style=0x96000000 ex=0x88
RuntimeId: "[42.66784]"
BoundingRectangle: {l:480 t:123 r:629 b:255}
ProcessId: 1664
ControlType: UIA_PaneControlTypeId (0xC371)
LocalizedControlType: "панель"
Name: ""
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: false
IsEnabled: true
ClassName: "Qt5QWindowPopupDropShadowSaveBits"
HelpText: ""
IsPassword: false
NativeWindowHandle: 0x104E0
IsOffscreen: false
FrameworkId: "Win32"
ProviderDescription: "[pid:2520,hwnd:0x104E0 Main:Nested [pid:1664,hwnd:0x104E0 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: ""
LegacyIAccessible.Role: граница (0x13)
LegacyIAccessible.State: изменяемого размера,перемещаемое (0x60000)
LegacyIAccessible.Value: ""
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: "" панель
Previous: [null]
Other Props: Object has no additional properties
Children: Container has no children
Ancestors: "Рабочий стол" панель
[ No Parent ]
 

Vengro

Новичок
Сообщения
4
Репутация
0
Innl, подскажите, вот в новой версии FireFox 88 стали недоступны элементы/объекты DOM.
А в старой версии, 56-ой объекты были доступны. Как это можно исправить?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
После этого $aList уже будет содержать не все ListItems.
Встречал я такой Combo, только без поля ввода - просто раскрывающийся список. Да, он так работает: возвращает только те пункты, которые отображались при закрытии списка. Но у меня список был заранее известен. Поэтому я тупо устанавливал в Combo фокус, отправлял {home} и нужное количество {down}.



Как это можно исправить?
Сложно это исправить.
Можно попробовать после полной загрузки Firefox вызвать эту функцию
Код:
Func _FirefoxAccessInit($hWnd = WinGetHandle("[RegexpTitle:.*Mozilla Firefox]"))
  Local $tIID_IAccessible = DllStructCreate("dword;word;word;byte[8]")
  DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", "{618736E0-3C3D-11CF-810C-00AA00389B71}", "struct*", $tIID_IAccessible)
  DllCall("oleacc.dll", "int", "AccessibleObjectFromWindow", "hwnd", $hWnd, "dword", 0xFFFFFFFC, "struct*", $tIID_IAccessible, "ptr*", 0)
  Sleep(111)
EndFunc

Если не поможет, можно включить вручную: вызвать средства разработчика (F12) и выбрать вкладку "Поддержка доступности". И, желательно, до запуска утилиты Inspect.
 

Vengro

Новичок
Сообщения
4
Репутация
0
Да, именно то, что надо. А то UIAccessiblity, то работало, то нет. Хотя MSAA, показывало всегда, но я не нашёл способа, как её прикрутить к скрипту.
В MSAccessibility.au3 нет хороших функций или примеров.
 

elread

Новичок
Сообщения
3
Репутация
0
Скажите, а можно с помощью вашего хорошего набора функций найти текст между двумя другими текстами на странице? Например, текст "Джонатан Беннет" между фразами "Класс языка" и "Повлиял на" на: этой странице.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Например, текст "Джонатан Беннет" между фразами "Класс языка" и "Повлиял на"
Да, можно найти. Только не понятно - зачем. Текст "Джонатан Беннет" там встречается всего один раз. Какая разница между чем и чем он находится.
 

elread

Новичок
Сообщения
3
Репутация
0
Да, можно найти. Только не понятно - зачем. Текст "Джонатан Беннет" там встречается всего один раз. Какая разница между чем и чем он находится.
Это я для примера, чтобы узнать про случай когда inspect не видит разницы между этими тремя текстами. Ну кроме мышиных координат. В моём случае, мне нужно на динамической странице искать текст каждый раз между разными текстами. Innl, поиск по форуму не находит примеров использования ваших функций в таком ключе. Пока я насилую ClipGet() + _StringBetween, можете привести пример как это делается?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
пример как это делается
Пример для Chrome.
Chrome должен быть запущен с параметром --force-renderer-accessibility и отображать страницу https://ru.wikipedia.org/wiki/AutoIt
Код:
#include <UIAutomate.au3>

$oPage = _UIA_GetElementFromHandle(ControlGetHandle("AutoIt — Википедия - Google Chrome", "", "Chrome_RenderWidgetHostHWND1"))
$aText = _UIA_FindAllElements($oPage, "ControlType", $UIA_TextControlTypeId)
For $i = 1 To $aText[0]
  If _UIA_ElementGetPropertyValue($aText[$i], "Name") = "Класс языка" Then
    For $j = $i + 1 To $aText[0]
      $sText = _UIA_ElementGetPropertyValue($aText[$j], "Name")
      If $sText = "Повлиял на" Then Exit
      ConsoleWrite($sText & @CRLF)
    Next
  EndIf
Next
 
Верх