Что нового

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

Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429

Soderling

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

Код:
If _ElementGetPropertyValue($aAllElements[$i], "LocalizedControlType") = "сложная библиотека" then


сделать что бы условие было верно, даже если ввести только "сложная"… т.е. частичное соответствие должно делать условие верным
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
что бы условие было верно, даже если ввести только "сложная"
Код:
If StringInStr(_UIA_ElementGetPropertyValue($aAllElements[$i], "LocalizedControlType"), "сложная") Then


Для поиска в массиве элементов есть функции _UIA_FindElementsInArray и _UIA_ElementFindInArray с поддержкой частичного совпадения значения свойства (параметр $fInStr)
 

Soderling

Новичок
Сообщения
29
Репутация
0
Код:
If StringInStr(_UIA_ElementGetPropertyValue($aAllElements[$i], "LocalizedControlType"), "сложная") Then


Для поиска в массиве элементов есть функции _UIA_FindElementsInArray и _UIA_ElementFindInArray с поддержкой частичного совпадения значения свойства (параметр $fInStr)
Работает! Спасибо огромное InnI
Сообщение автоматически объединено:

Помогите с кодом пожалуйста.

Как понять, что функция _UIA_ElementScrollIntoView($All[$i]) проскроллила страницу до зоны видимости элемента " $All[$i] " ?
Если после _UIA_ElementScrollIntoView() сразу сделать _UIA_ElementMouseClick(), то не срабатывает клик, так как страница еще не проскроллилась (как я понимаю)

К СУТИ: Как сделать проверку на то, что элемент " $All[$i] " в данный момент в зоне видимости?

Код:
Global $open_link = "https://auto.keyauto.ru/used/toyota/new_lc200"
$all =  _UIA_FindAllElements($oParent)
    For $i = 1 to  $all[0]
        If _UIA_ElementGetPropertyValue($All[$i], "Value.Value") = $open_link Then
            _UIA_ElementScrollIntoView($All[$i])
            sleep (1000) ; Все что пришло в голову :(
            _UIA_ElementMouseClick($All[$i], "left", Default, Default, 1, FALSE)
            ExitLoop
        EndIf  
    Next
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Как понять, что функция _UIA_ElementScrollIntoView($All[$i]) проскроллила страницу до зоны видимости элемента " $All[$i] " ?
Проанализировать @error. Если 1, то это не элемент. Если 2, то элемент не поддерживает прокрутку. Если 3, то возникли проблемы (какие - неизвестно). Если 0, то хотя бы часть элемента в зоне видимости.

Как сделать проверку на то, что элемент " $All[$i] " в данный момент в зоне видимости?
Проверить свойство элемента IsOffscreen. Но элемент будет виден даже если видна только его часть.

Попробуйте в функции _UIA_ElementMouseClick() включить последний параметр в True, как это сделано по умолчанию. Многие элементы при получении фокуса автоматически прокручивают себя в область видимости.
 

Soderling

Новичок
Сообщения
29
Репутация
0
Что то я даже и не подумал про @error. Благодарю за помощь InnI
Сообщение автоматически объединено:

Здравствуйте. Помогите решить проблему.

Установить Windows Windows10Enterprise_LTSC_2019_v1809_by_LeX_6000 - перестала работать библиотека UIAutomate, запустил Inspect_W10 , как оказалось он тоже не видит содержимое окна браузера гугл хром, но Inspect_W10 видит все что касается интерфейса винды, окно браузера тоже видит, но не содержание страницы. Пробовал поставить старый Хром, не помогло.
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Может у вас Chrome с правами администратора запущен? Если нет, то не знаю в чём проблема. У меня нет указанной вами версии Windows. А на той, что есть, нормально работает с Chrome 88.
 

Soderling

Новичок
Сообщения
29
Репутация
0
Запускал и с правами администратора и без. Одинаково

Винда 10 - Версия 1809 (сборка ОС 17763.914)
Хром - Версия 88.0.4324.104 (Официальная сборка), (64 бит)
Сообщение автоматически объединено:

Куда не наводишь, вот так рамка рисуется.
 

Вложения

  • Безымянный.png
    Безымянный.png
    16.3 КБ · Просмотры: 10
  • 2.png
    2.png
    69.6 КБ · Просмотры: 10
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Ещё раз повторяю. Отсутствие доступа к содержимому страницы - это проблема Chrome, а не inspect.
В Chrome перейдите по адресу chrome://accessibility и посмотрите включена ли поддержка доступности.
 

Soderling

Новичок
Сообщения
29
Репутация
0
Здравствуйте, почему в такой конструкции мышка наводит на ссылки по очереди 2 раза. Наводит с первой по последнюю и не останавливается, а делает тоже самое второй раз.
Может в браузере что то нужно настроить? Chrome 88

Код:
$All =  _UIA_FindAllElements($oParent) 
For $i = 1 to  $All[0]
If _UIA_ElementGetPropertyValue($All[$i], "LocalizedControlType") = "ссылка" then   
_UIA_ElementMouseMOVE($All[$i], 'left', Default, Default, 1, True)
EndIf
Next
 
Последнее редактирование:

Soderling

Новичок
Сообщения
29
Репутация
0
Не знал как сделать, чтобы курсор наводился на элемент, но не нажимал его, добавил еще одну функцию _UIA_ElementMouseClick внес изменение Local $iResult = MouseMove($aRect[0] + $iX, $aRect[1] + $iY, 0) и переименовал в _UIA_ElementMouseMOVE

_UIA_ElementMouseClick -
если этой функцией можно просто навести курсор и не нажимать, то как это сделать?

ПРИМЕР С РЕАЛЬНОЙ СТРАНИЦЕЙ:

Для теста взял "https://ya.ru/"

Код:
Local $arr[0]
$All =  _UIA_FindAllElements($oParent)
  For $i = 1 to  $All[0]
   
    If _UIA_ElementGetPropertyValue($All[$i], "LocalizedControlType") = "ссылка" then
   
      $Value = _UIA_ElementGetPropertyValue($All[$i], "Value.Value")
      _Arrayadd($arr,$Value)
    Endif
  Next
 
  _ArrayDisplay($arr)


Прошу прощения, что то я не углядел...
$All = _UIA_FindAllElements($oParent) - сюда все элементы заносятся 2 раза, но почему? не понятно и как исправить
 

Вложения

  • Безымянный.png
    Безымянный.png
    16.1 КБ · Просмотры: 15
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
_UIA_ElementMouseClick - если этой функцией можно просто навести курсор и не нажимать, то как это сделать?
Никак. Эта функция сделана именно для клика.
А "кликать" ссылки лучше через _UIA_ElementDoDefaultAction(). Эта функция работает даже для ссылок за пределами видимости.


$All = _UIA_FindAllElements($oParent) - даже сюда все элементы заносятся 2 раза
Потому что в качестве $oParent вы используете главное окно. Посмотрите в дереве Inspect - содержимое страницы там будет два раза - в разных ветвях. Поэтому нужно искать от элемента, который отображает страницу
Код:
#include "UIAutomate.au3"
#include <Array.au3>

$hPage = ControlGetHandle("[RegexpTitle: - Google Chrome]", "", "Chrome_RenderWidgetHostHWND1")
$oParent = _UIA_GetElementFromHandle($hPage)

Local $arr[0]
$All = _UIA_FindAllElements($oParent, "ControlType", $UIA_HyperlinkControlTypeId) ; так проще искать ссылки
For $i = 1 To $All[0]
  _Arrayadd($arr, _UIA_ElementGetPropertyValue($All[$i], "Value.Value"))
  ; _UIA_ElementDoDefaultAction($All[$i]) ; "клик" по ссылке
Next

_ArrayDisplay($arr)
 

Anch665

Новичок
Сообщения
3
Репутация
0
Начала изучать Autoit, все классно, нравится, но есть небольшой затык.
Есть программа с вот таким интерфейсом, как с помощью AutoIt кликнуть по этим двум кнопкам? Пока делаю только через MouseClick, но это не спортивно.
Au3Info.exe не видит в данном интерфейсе кнопок.

1612880592928.png
 

Anch665

Новичок
Сообщения
3
Репутация
0
Вот что удалось получить с помощью inspect в режиме UI Automation
Это те самые две кнопки, на которые мне надо нажать. Не подскажите как теперь к ним обратиться?

PS Видимо в связи с тем что я новичок на форуме мне недоступны теги спойлер и код, по этому вставил результат через тег автоит


Код:
hwnd=0x000202D4 64bit class="Afx:00007FF6A76D0000:b:0000000000010003:0000000000000006:0000000000000000" style=0x52800000 ex=0x0ControlType:    UIA_ImageControlTypeId (0xC356)
LocalizedControlType:    "рисунок"
BoundingRectangle:    {l:344 t:188 r:360 b:204}
IsEnabled:    true
IsOffscreen:    false
HasKeyboardFocus:    false
ProcessId:    9716
RuntimeId:    [2A.202D4.4.D1]
ClassName:    "item-icon"
IsControlElement:    true
IsContentElement:    true
ProviderDescription:    "[pid:9716,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:sciter.dll)]"
LegacyIAccessible.ChildId:    209
LegacyIAccessible.DefaultAction:    ""
LegacyIAccessible.Description:    ""
LegacyIAccessible.Help:    ""
LegacyIAccessible.KeyboardShortcut:    ""
LegacyIAccessible.Name:    ""
LegacyIAccessible.Role:    графика (0x28)
LegacyIAccessible.State:    обычный (0x0)
LegacyIAccessible.Value:    "this://app/TlsClientGui/icons/CertSettings.svg"
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:    false
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:    [null]
LastChild:    [null]
Next:    [null]
Previous:    [null]


Код:
How found:    Mouse move (386,185)
    hwnd=0x000202D4 64bit class="Afx:00007FF6A76D0000:b:0000000000010003:0000000000000006:0000000000000000" style=0x52800000 ex=0x0Name:    "Создать запрос"
ControlType:    UIA_TextControlTypeId (0xC364)
LocalizedControlType:    "текстовый"
BoundingRectangle:    {l:343 t:177 r:435 b:202}
IsEnabled:    true
IsOffscreen:    false
HasKeyboardFocus:    false
ProcessId:    9716
RuntimeId:    [2A.202D4.4.1F3E]
ClassName:    "item-name"
IsControlElement:    true
IsContentElement:    true
ProviderDescription:    "[pid:9716,providerId:0x0 Main(parent link):Unidentified Provider (unmanaged:sciter.dll)]"
LegacyIAccessible.ChildId:    7998
LegacyIAccessible.DefaultAction:    ""
LegacyIAccessible.Description:    ""
LegacyIAccessible.Help:    ""
LegacyIAccessible.KeyboardShortcut:    ""
LegacyIAccessible.Name:    ""
LegacyIAccessible.Role:    текст (0x29)
LegacyIAccessible.State:    обычный (0x0)
LegacyIAccessible.Value:    ""
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:    false
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:    [null]
LastChild:    [null]
Next:    [null]
Previous:    "" рисунок
Other Props:    Object has no additional properties




Посмотрел внимательно, у этих кнопок только отличаются параметры
LegacyIAccessible.ChildId:
LegacyIAccessible.Value:
RuntimeId:
 
Последнее редактирование:

Anch665

Новичок
Сообщения
3
Репутация
0
Нашёл UIASpy, с помощью конструктора кода в нем создал такой код, пока не понятно как это работает, но работает
По уму конечно надо разобраться и научиться этому самостоятельно

Код:
Func MainForm()
    ; Create UI Automation object
    Local $oUIAutomation = ObjCreateInterface( $sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtag_IUIAutomation )
    If Not IsObj( $oUIAutomation ) Then Return ConsoleWrite( "$oUIAutomation ERR" & @CRLF )
    Local $pDesktop, $oDesktop
    $oUIAutomation.GetRootElement( $pDesktop )
    $oDesktop = ObjCreateInterface( $pDesktop, $sIID_IUIAutomationElement, $dtag_IUIAutomationElement )
    If Not IsObj( $oDesktop ) Then Return ConsoleWrite( "$oDesktop ERR" & @CRLF )

   ; --- Find window/control ---
   Local $pCondition0
   $oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, "Континент TLS-клиент", $pCondition0 )
   If Not $pCondition0 Then Return ConsoleWrite( "$pCondition0 ERR" & @CRLF )
   Local $pWindow1, $oWindow1
   $oDesktop.FindFirst( $TreeScope_Children, $pCondition0, $pWindow1 )
   $oWindow1 = ObjCreateInterface( $pWindow1, $sIID_IUIAutomationElement, $dtag_IUIAutomationElement )
   If Not IsObj( $oWindow1 ) Then Return ConsoleWrite( "$oWindow1 ERR" & @CRLF )


   ; --- найти кнопку Управление сертификатами
   Local $pCondition1
   $oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, "Управление сертификатами", $pCondition1 )
   If Not $pCondition1 Then Return ConsoleWrite( "$pCondition1 ERR" & @CRLF )
   Local $pText1, $oText1
   $oWindow1.FindFirst( $TreeScope_Descendants, $pCondition1, $pText1 )
   $oText1 = ObjCreateInterface( $pText1, $sIID_IUIAutomationElement, $dtag_IUIAutomationElement )
   If Not IsObj( $oText1 ) Then Return ConsoleWrite( "$oText1 ERR" & @CRLF )
   UIA_MouseClick( $oText1 )
   Sleep(100)

   ; --- найти кнопку Создать запрос
   Local $pCondition1
   $oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, "Создать запрос", $pCondition1 )
   If Not $pCondition1 Then Return ConsoleWrite( "$pCondition1 ERR" & @CRLF )
   Local $pText1, $oText1
   $oWindow1.FindFirst( $TreeScope_Descendants, $pCondition1, $pText1 )
   $oText1 = ObjCreateInterface( $pText1, $sIID_IUIAutomationElement, $dtag_IUIAutomationElement )
   If Not IsObj( $oText1 ) Then Return ConsoleWrite( "$oText1 ERR" & @CRLF )
   UIA_MouseClick( $oText1 )
EndFunc
 
Верх