Что нового

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

JRay

Новичок
Сообщения
4
Репутация
0
На сколько я понимаю, алгоритмов борьбы с этим неудобством нет ?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Обновление до версии 1.4:
- файл с описанием констант CUIAutomation2.au3 переименован в UIAConstants.au3
- в файл UIAConstants.au3 добавлены новые константы (до Windows 10 включительно)
- добавлена функция _UIA_ElementScrollIntoView(), прокручивающая элемент в область видимости
- обновлена утилита Inspect (из пакета SDK для Windows 10)
 

dr.room

Новичок
Сообщения
283
Репутация
0
У меня ошибка при запуске примера из спойлера (да и везде) - не найдена библиотека
:( Что не так ?
Ps
Всё - разобрался, просто не распаковал "полный комплект"
Правильно ли я понимаю - понадобиться в папку с моим макросом поместить 2 файла : UIAutomate.au3,
UIAConstants.au3
 

Вложения

  • Ощибка.png
    Ощибка.png
    3.7 КБ · Просмотры: 21

alex33

Скриптер
Сообщения
1,457
Репутация
186
dr.room сказал(а):
Правильно ли я понимаю - понадобиться в папку с моим макросом поместить 2 файла : UIAutomate.au3,
UIAConstants.au3
Можно и так, а можно в папку \Program Files\AutoIt3\Include - и тогда эти файлы будут доступны из любого места и их не надо будет каждый раз копировать...
 

dr.room

Новичок
Сообщения
283
Репутация
0
alex33 сказал(а):
Спасибо большое, alex33.
Да уж, впечатляющая работа, InnI
А не подскажете - можно как то с помощью этой библиотеки или без неё решить такую задачу:
- найти на любой веб странице, в браузере Google Chrome, гиперссылки (4шт. к примеру)
- перейти по ним, с интервалом 20 сек.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
найти на любой веб странице, в браузере Google Chrome, гиперссылки
Создайте отдельную тему и подробно опишите проблему. Попробуем поискать.
 

ini

Новичок
Сообщения
55
Репутация
0
Здравствуйте InnI, пробую воспользоваться функцией
Код:
_UIA_FindAllElementsEx
так как есть много элементов с идентичными свойствами.
Делаю так, нахожу первый элемент
Код:
$oEl = _UIA_GetControlTypeElement($oP, 0xC352, '')
. Далее пытаюсь получить массив элементов '
Код:
_UIA_FindAllElementsEx($oEl)
' и установить фокус на элементе N '2',
Код:
_UIA_ElementSetFocus($aArray[2])
. Делаю не правильно, подскажите как правильно воспользоваться этой функцией?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ini
Если вам нужно получить массив чекбоксов, то так
Код:
$aArray = _UIA_FindAllElements($oP, "ControlType", 0xC352)
If IsArray($aArray) Then _UIA_ElementSetFocus($aArray[2])
А функция _UIA_FindAllElementsEx() работает не с элементом, а с предварительно созданным условием.
 

ini

Новичок
Сообщения
55
Репутация
0
InnI сказал(а):
ini
Если вам нужно получить массив чекбоксов, то так
Код:
$aArray = _UIA_FindAllElements($oP, "ControlType", 0xC352)
If IsArray($aArray) Then _UIA_ElementSetFocus($aArray[2])
А функция _UIA_FindAllElementsEx() работает не с элементом, а с предварительно созданным условием.

Спасибо, разобрался уже, условие не указывал :-[
 

dr.room

Новичок
Сообщения
283
Репутация
0
Всем привет
Такой вопрос - Inspect видит практически любой (имхо )элемент управления браузера (у меня - Google Chrome) или веб страницы.
Но не совсем понятно как мне воспользоватся информацией предоставленной Inspect чтобы просто кликнуть по элементу.
Например есть на панели управления ссылка (кнопка) - что мне предпринять чтобы:
- определить свойство элемента
- и кликнуть по нему
Пример с ссылкой на YouTube выводит такую информацию
Код:
How found:	Mouse move (554,85)
	hwnd=0x002E1376 32bit class="Chrome_WidgetWin_1" style=0x17CF0000 ex=0x100
Name:	"YouTube"
ControlType:	UIA_TextControlTypeId (0xC364)
LocalizedControlType:	"текстовый"
BoundingRectangle:	{l:524 t:67 r:583 b:93}
IsEnabled:	true
IsOffscreen:	false
IsKeyboardFocusable:	true
HasKeyboardFocus:	false
AccessKey:	""
ProcessId:	4524
ProviderDescription:	"[pid:4524,hwnd:0x0 Main(parent link):Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]"
IsPeripheral:	[Not supported]
LiveSettingProperty:	[Not supported]
IsPassword:	false
HelpText:	""
FlowsFrom:	[Not supported]
OptimizeForVisualContent:	[Not supported]
PositionInSet:	[Not supported]
SizeOfSet:	[Not supported]
Level:	[Not supported]
AnnotationTypes:	[Not supported]
AnnotationObjects:	[Not supported]
LandmarkType:	[Not supported]
LocalizedLandmarkType:	[Not supported]
Annotation.AnnotationAuthor:	[Not supported]
Annotation.AnnotationTypeId:	[Not supported]
Annotation.Author:	[Not supported]
Annotation.DateTime:	[Not supported]
Annotation.Target:	[Not supported]
Drag.DropEffect:	[Not supported]
Drag.DropEffects:	[Not supported]
Drag.GrabbedItems:	[Not supported]
Drag.IsGrabbed:	[Not supported]
DropTarget.DropTargetEffect:	[Not supported]
DropTarget.DropTargetEffects:	[Not supported]
LegacyIAccessible.ChildId:	0
LegacyIAccessible.DefaultAction:	""
LegacyIAccessible.Description:	""
LegacyIAccessible.Help:	""
LegacyIAccessible.KeyboardShortcut:	""
LegacyIAccessible.Name:	"YouTube"
LegacyIAccessible.Role:	текст (0x29)
LegacyIAccessible.State:	только чтение,фокусируемое (0x100040)
LegacyIAccessible.Value:	""
ObjectModel.UnderlyingObjectModel:	[Error: calling getter for this property: hr=0x80070057 - Параметр задан неверно.]
SpreadsheetItem.AnnotationObjects:	[Not supported]
SpreadsheetItem.AnnotationTypes:	[Not supported]
SpreadsheetItem.Formula:	[Not supported]
Style.ExtendedProperties:	[Not supported]
Style.FillColor:	[Not supported]
Style.FillPatternColor:	[Not supported]
Style.FillPatternStyle:	[Not supported]
Style.Shape:	[Not supported]
Style.StyleId:	[Not supported]
Style.StyleName:	[Not supported]
Transform2.CanZoom:	[Not supported]
Transform2.ZoomLevel:	[Not supported]
Transform2.ZoomMinimum:	[Not supported]
Transform2.ZoomMaximum:	[Not supported]
IsAnnotationPatternAvailable:	[Not supported]
IsDragPatternAvailable:	[Not supported]
IsDockPatternAvailable:	false
IsDropTargetPatternAvailable:	[Not supported]
IsExpandCollapsePatternAvailable:	false
IsGridItemPatternAvailable:	false
IsGridPatternAvailable:	false
IsInvokePatternAvailable:	false
IsItemContainerPatternAvailable:	false
IsLegacyIAccessiblePatternAvailable:	true
IsMultipleViewPatternAvailable:	false
IsObjectModelPatternAvailable:	[Not supported]
IsRangeValuePatternAvailable:	false
IsScrollItemPatternAvailable:	false
IsScrollPatternAvailable:	false
IsSelectionItemPatternAvailable:	false
IsSelectionPatternAvailable:	false
IsSpreadsheetItemPatternAvailable:	[Not supported]
IsSpreadsheetPatternAvailable:	[Not supported]
IsStylesPatternAvailable:	[Not supported]
IsSynchronizedInputPatternAvailable:	false
IsTableItemPatternAvailable:	false
IsTablePatternAvailable:	false
IsTextChildPatternAvailable:	[Not supported]
IsTextEditPatternAvailable:	[Not supported]
IsTextPatternAvailable:	false
IsTextPattern2Available:	[Not supported]
IsTogglePatternAvailable:	false
IsTransformPatternAvailable:	false
IsTransform2PatternAvailable:	[Not supported]
IsValuePatternAvailable:	false
IsVirtualizedItemPatternAvailable:	false
IsWindowPatternAvailable:	false
IsCustomNavigationPatternAvailable:	[Not supported]
FirstChild:	[null]
LastChild:	[null]
Next:	[null]
Previous:	"" рисунок
Other Props:	Object has no additional properties
Children:	Container has no children
Ancestors:	"YouTube" кнопка
	"Закладки" панель инструментов
	"" 
	"Google Chrome" 
	"Новая вкладка - Google Chrome" окно
	"Рабочий стол" панель
	[ No Parent ]
Эх, мне бы в детали вникнуть ...что бы на будущее знать.
 

Вложения

  • закладка.2.png
    закладка.2.png
    33.2 КБ · Просмотры: 33
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
Ссылка UIA_HyperlinkControlTypeId и кнопка UIA_ButtonControlTypeId - это разные элементы. Но каждый из них, как правило, реагирует на функцию _UIA_ElementDoDefaultAction(). Это фактически клик без использования мыши (как ControlClick для стандартного элемента).
В данном случае Inspect показывает информацию о текстовом элементе UIA_TextControlTypeId, который на вышеуказанную функцию не реагирует, но вы можете по нему кликнуть мышью при помощи функции _UIA_ElementMouseClick(). Найти данный элемент можно, например, по имени
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "YouTube")
_UIA_ElementMouseClick($oElement)
 

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
но вы можете по нему кликнуть мышью
У меня уровень знания скриптов ~0 (та получилось )
Потому запустил Ваш скрипт и ошибка - что не так?
И еще вопрос: что есть $oElement и $oParent ?
 

Вложения

  • Ошибка.png
    Ошибка.png
    22.6 КБ · Просмотры: 22
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
уровень знания скриптов ~0
Для самостоятельной работы с UDF этого слишком мало.

что есть $oElement и $oParent
$oElement - это тот элемент, по которому кликаем. $oParent - это родительский элемент, по дочерним элементам которого производится поиск. Но я не знаю, как это объяснить человеку с уровнем знаний ~0.
 

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
Но я не знаю, как это объяснить человеку с уровнем знаний ~0

А тем не менее - Вы только что это сделали ;)
Т.е. это означает что вы умеете объяснить на элементарном уровне, спасибо



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

InnI сказал(а):
Для самостоятельной работы с UDF этого слишком мало.
Согласен, трудновато. Но
- мне жуть как всё интересно
- и не могли бы вы предложить полный вариант кода. Т.е. чтобы клик работал по искомому элементу
(а,если что не ясно, я уточню после)
- я же изучил (не много) html и css, что позволяет мне теперь писать свои стили для плагина Stylish
так что не будем слишком расстраиваться :smile:
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
полный вариант кода
Если не заработает, покажите ошибки, выводимые в консоль, и приложите скриншот части дерева, чтобы видно было родителей этого текста
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

$hWnd = WinWait(" - Google Chrome", "", 3)
If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)

$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "YouTube")
_UIA_ElementMouseClick($oElement)
 

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
Если не заработает
Напротив - всё работает, спасибо
Готовлю вопросы по коду...


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

Есть несколько вопросов
  • Клик проводится простой по найденному элементу. А есть ли возможность - с нажатым Cntrl или Shift ?
  • Не уверен что понимаю правильно назначение вот этого.
    Код:
    $hWnd
  • В комментариях к коду изложил своё понимание его, не посмотрите?
    Код:
    #cs ----------------------------------------------------------------------------
    
     AutoIt Version: 3.3.14.2
     Author:         myName
    
     Script Function:
    	Template AutoIt script.
    
    #ce ----------------------------------------------------------------------------
    
    ; Script Start - Add your code below here
    
    ;~ подключаем библиотеку
    #include "UIAutomate.au3"
    
    ;~ меняем способ поиска заголовка окна при сопоставлении с образцом: с полного совпадения на частичный
    Opt("WinTitleMatchMode", 2)
    
    ;~ останавливаем работу скрипта до появления нужного заголовка окна - и ждем 3 сек
    $hWnd = WinWait(" - Google Chrome", "", 3)
    
    ;~ Ставим условие: Если искомое окно так и не найдено в отпущенное для этого время , то выводим в консоль сообщение и выходим
    ;~   "а не найдено Окно браузера "  :).  Вы такой  скрин запрашивали, если что -то не так ?
    If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)
    
    ;~ создаём дескриптор для родительского элемента  - а именно : для Google Chrome.  Но название окна пишем через переменную
    ;~ т.е  через $hWnd
    $oParent = _UIA_GetElementFromHandle($hWnd)
    
    ;~ Находим дочерний элемент, который: через родителя т.е. от него и начнём поиск ,
    ;~ обладающего собственным  ID и способом управления (текстовый тип управления) и именем YouTube
    $oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "YouTube")
    
    ;~ уж коли элемент определён и найден - почему бы не кликнуть по нему  :)
    ;~ укажем  для  этого дела не  координаты  клика а  свойство искомого элемента - через переменную...
    _UIA_ElementMouseClick($oElement)
  • Очень хочется понять, как именно происходит процесс получения дескриптора окна ?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
с нажатым Cntrl или Shift
Код:
Send("{SHIFTDOWN}")
_UIA_ElementMouseClick($oElement)
Send("{SHIFTUP}")


укажем для этого дела не координаты клика
В этой функции используются именно координаты. Но, если вы их не указали, то используются по умолчанию - середина ширины и высоты.
Откройте файл UIAutomate.au3 и прочитайте подробное описание, расположенное перед кодом каждой функции.

процесс получения дескриптора окна
Основы программирования под Windows никакого отношения к данной теме не имеют.
 

dr.room

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

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
относительно границ самого элемента
Да, только координаты границ - экранные. Т.е. нужно прибавить координату левого верхнего угла. Вот так будет правильнее кликать с нажатым Shift
Код:
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "YouTube") ; элемент
$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) ; смещение мыши в середину элемента с учётом левого верхнего угла элемента
  Send("{SHIFTDOWN}") ; нажатие Shift
  MouseClick("left") ; клик в текущие координаты курсора
  Send("{SHIFTUP}") ; отпускание Shift
EndIf
 
Верх