Что нового

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

saraconor

Новичок
Сообщения
418
Репутация
3
Firefox перечисляет все вкладки, поэтому объектов может быть много. Попробуйте с одной вкладкой.
Если не получится - сообщите версию Firefox.
Также убедитесь, что Firefox не запущен с правами администратора.
Может быть тогда на примере обычного блокнота ? Скажем, в текстовом поле написано "я люблю манную кашу", ищем вначале текст "манную", найдя элемент интерфейса с данным куском текста, копируем весь текст из элемента, а потом жмем кнопку "Справка" в верхней панели.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
на примере обычного блокнота
Код:
#include <UIAutomate.au3>

; окно блокнота
$oNotepad = _UIA_GetElementFromHandle(WinGetHandle("[class:Notepad]"))

; поиск по части текста
$aElements = _UIA_FindAllElements($oNotepad)
For $i = 1 To $aElements[0]
  $sText = _UIA_ElementGetPropertyValue($aElements[$i], "Value.Value")
  If StringInStr($sText, "манную") Then ExitLoop
Next
ConsoleWrite($sText & @CRLF)

; Если заранее известен тип элемента, то лучше так
$oEdit = _UIA_GetControlTypeElement($oNotepad, "UIA_EditControlTypeId", "манную", "Value.Value:", True)
; получение всего текста
$sText = _UIA_ElementGetPropertyValue($oEdit, "Value.Value")
ConsoleWrite($sText & @CRLF)

; пункт меню "Справка"
$oItem = _UIA_GetControlTypeElement($oNotepad, "UIA_MenuItemControlTypeId", "Справка")
_UIA_ElementMouseClick($oItem)
 

saraconor

Новичок
Сообщения
418
Репутация
3
Спасибо большое за пример, буду пробывать...
Сообщение автоматически объединено:

В конце выходит вроде как двойное нажатие по пункту "справка", меню открывается и мгновенно закрывается. И так на всех кнопках, в разных программах.
 
Последнее редактирование:

SharkyEXE

Новичок
Сообщения
134
Репутация
0
Всем здравствуйте

Пожалуйста, будьте так, любезны, помогите закрыть окно с заголовком "Kaspersky Internet Security", текстом "Срок действия лицензии истекает через 13 дней. Вы можете продлить срок действия лицензии. Если вы уже продлили срок действия лицензии, пожалуйста, активируйте программу сейчас.", кнопкой "Продлить срок действия лицензии", кнопкой "Ввести код активации", в верхнем правом углу активна кнопка "Свернуть", в верхнем правом углу активна кнопка "Закрыть", в верхнем правом углу НЕ активна кнопка "Развернуть"

Отчёты утилит Inspect_W7.exe и Inspect_W10.exe прилагаю

Спасибо.
 

Вложения

  • Запись_2023_12_31_09_45_06_202.mp4_20231231_100407.953.jpg
    Запись_2023_12_31_09_45_06_202.mp4_20231231_100407.953.jpg
    35.3 КБ · Просмотры: 8
  • Inspect_W7.exe.txt
    2.7 КБ · Просмотры: 1
  • Inspect_W10.exe.txt
    5 КБ · Просмотры: 1
  • Inspect_W10.exe.png
    Inspect_W10.exe.png
    376 КБ · Просмотры: 8
  • Inspect_W7.exe.png
    Inspect_W7.exe.png
    378 КБ · Просмотры: 7
Последнее редактирование:

lagovi

Новичок
Сообщения
1
Репутация
0
Хочу поработать с сообщениями в Viber, но не могу понять как считать их, не говоря уже о идентификации непрочитанных. Это вообще реально?
 

sterro_sasha

Новичок
Сообщения
45
Репутация
1
Я так понимаю, что изменить заголовок вкладки никак нельзя при помощи UIAutomate? Value.value есть, заголовок легко считывается при помощи _UIA_GetControlTypeElement и _UIA_ElementGetPropertyValue($oElement, "Value.Value"), но вот свой поставить - никак. Перепробовал уже сотни раз. Стоит защита? Хотя функция _UIA_ElementTextSetValue вроде как возвращает успех.
Сообщение автоматически объединено:

Заголовок вкладки к сожалению поменять нельзя. Убил пару часов на поиск id, но в конце концов перебрав все, решил просто везде установить текст где только можно... и да - заголовок вкладки Chrome не меняется (но при этом легко считывается).

Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

Sleep(1000)
;Chrome должен быть запущен с ключем --force-renderer-accessibility
;Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" & " --force-renderer-accessibility")

$hWnd = WinGetHandle('[ACTIVE]') ;активный - Хром
$oParent = _UIA_GetElementFromHandle($hWnd)

;обычный режим перебора элементов
;(глобально проверяем вообще можно ли менять заголовок, по id вкладки ничего не меняется вообще)
$aElements = _UIA_FindAllElements($oParent)
For $i = 1 To $aElements[0]
    _UIA_ElementTextSetValue($aElements[$i], "New text (title) for Google Chrome")
    ConsoleWrite( _UIA_ElementGetPropertyValue($aElements[$i], "Value.Value") & @CRLF)
Next

;расширенный режим перебора элементов
$aElements = _UIA_FindAllElementsEx($oParent)
For $i = 1 To $aElements[0]
    _UIA_ElementTextSetValue($aElements[$i], "New text (title) for Google Chrome")
    ConsoleWrite( _UIA_ElementGetPropertyValue($aElements[$i], "Value.Value") & @CRLF)
Next

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

Библиотека супер!!! Подскажите пожалуйста, может ли работать _UIA_ElementTextSetValue, когда окно куда нужно ввести данные - неактивно? пока решения не нашел никакого
Сообщение автоматически объединено:

Ответ найден. Работает только с видимыми или НЕ свернутыми окнами. Увы. IUIAutomation с офф форума - тоже самое, хотя эти библиотеки используют одну и туже технологию, чего удивляться)
 
Последнее редактирование:

grostech

Новичок
Сообщения
14
Репутация
0
Добрый день. Подскажите пожалуйста синтаксис к функции UIA_GetControlTypeElement для поиска с ее помощью элемента в браузере по ClassName,
Пробовал разными способами, но по ControlType и name все ищет, но т.к. на странице много одинаковых элементов при таком поиске не получается сфокусироваться на необходимом, что могло бы решить проблему использования параметра элемента ClassName.
Заранее спасибо
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
синтаксис к функции UIA_GetControlTypeElement для поиска с ее помощью элемента в браузере по ClassName
ClassName - это свойство, отображаемое в Inspect? Если да, то так.
Тип: кнопка UIA_ButtonControlTypeId, свойство: ClassName, значение свойства: ButtonClassName.
Код:
_UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "ButtonClassName", "ClassName")
 

grostech

Новичок
Сообщения
14
Репутация
0
ClassName - это свойство, отображаемое в Inspect? Если да, то так.
Тип: кнопка UIA_ButtonControlTypeId, свойство: ClassName, значение свойства: ButtonClassName.
Код:
_UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "ButtonClassName", "ClassName")

Есть строка
Код:
_UIA_GetControlTypeElementNEW($oParent, "UIA_ButtonControlTypeId", "Параметр Name")
, вот мне необходимо было поменять по умолчанию установленный параметр в файле UIAutomate где
Код:
$vProperty = Default
на тип свойства ClassName, вопрос решил установкой в коде UIAutomate вместо
Код:
$vProperty = Default -> $vProperty = "ClassName"

в этом случае функция _UIA_GetControlTypeElementNEW в месте где параметр $vProperty по умолчанию "Name" - $UIA_NamePropertyId теперь из инспектора можно ставить параметр ClassName, который в своем роде уникальный для большего количества элементов чем параметр name.
Скажите пожалуйста есть ли инструкция, мануал к UIAutomate ?

Спасибо за ответ
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
есть ли инструкция, мануал к UIAutomate ?
Описания функций находятся непосредственно в файле UIAutomate.au3. Отдельных инструкций-мануалов я не знаю. Сам делать не планирую.
Сообщение автоматически объединено:

вопрос решил установкой в коде UIAutomate вместо
Я же вам написал код. Просто укажите четвёртым параметром "ClassName" и не нужно ничего менять в функции.
 
Последнее редактирование:

grostech

Новичок
Сообщения
14
Репутация
0
Описания функций находятся непосредственно в файле UIAutomate.au3. Отдельных инструкций-мануалов я не знаю. Сам делать не планирую.
Сообщение автоматически объединено:


Я же вам написал код. Просто укажите четвёртым параметром "ClassName" и не нужно ничего менять в функции.
Понял, попробую предложенный вами вариант, просто информации очень мало, описание в самой функции очень краткое.
Сообщение автоматически объединено:

Возникла следующая задачи. Подскажите пожалуйста, необходимо реализовать код, чтоб он находил все элементы одного типа, а после я бы смог обратиться к последнему из них, для получения его свойств. Можно путём записи всех элементов в массив, или путем перебора циклом. Может есть какие нибудь примеры ?
 
Последнее редактирование:
Автор
I

InnI

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

joker85

Новичок
Сообщения
9
Репутация
0
Всем здравствуйте. Вопрос. А как мне выцепить Фамилию?
Смотрел программой Inspect_W10 в AutoIt Window Info (x64) это скрытый текст
 

Вложения

  • qaz000000000000zzzz.png
    qaz000000000000zzzz.png
    184.3 КБ · Просмотры: 2
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
выцепить Фамилию
Код:
#include <UIAutomate.au3>

$hWnd = WinGetHandle("Менеджер приложений")
$oParent = _UIA_GetElementFromHandle($hWnd)
$oElem = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Фамилия", "LegacyIAccessible.Name")
$sVal1 = _UIA_ElementGetPropertyValue($oElem, "Value.Value")
ConsoleWrite($sVal1 & @CRLF)
$sVal2 = _UIA_ElementGetPropertyValue($oElem, "LegacyIAccessible.Value")
ConsoleWrite($sVal2 & @CRLF)
 

joker85

Новичок
Сообщения
9
Репутация
0
Код:
#include <UIAutomate.au3>

$hWnd = WinGetHandle("Менеджер приложений")
$oParent = _UIA_GetElementFromHandle($hWnd)
$oElem = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Фамилия", "LegacyIAccessible.Name")
$sVal1 = _UIA_ElementGetPropertyValue($oElem, "Value.Value")
ConsoleWrite($sVal1 & @CRLF)
$sVal2 = _UIA_ElementGetPropertyValue($oElem, "LegacyIAccessible.Value")
ConsoleWrite($sVal2 & @CRLF)
Спасибо за код, но результат выдает 0

Код:
#include <ScreenCapture.au3>
#include <UIAutomate.au3>

$hWnd = WinWait("[CLASS:WindowsForms10.Window.8.app.0.1569a64_r6_ad1]", "", 5)

;MouseClick("left", 430, 142, 10)
;Sleep(2000)

$hWnd2 = WinGetHandle("[ACTIVE]")
$oParent = _UIA_GetElementFromHandle($hWnd2)
$oElem = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Фамилия", "LegacyIAccessible.Name")
$sVal1 = _UIA_ElementGetPropertyValue($oElem, "Value.Value")

MsgBox(4096, $sVal1, 'Нажата кнопка "Да"')

На скриншоте отметил красным это ошибки? А то я давно не программировал
 

Вложения

  • qaz000000000000zzzz000000000.png
    qaz000000000000zzzz000000000.png
    17.5 КБ · Просмотры: 3
Последнее редактирование:

joker85

Новичок
Сообщения
9
Репутация
0
Убедитесь, что класс главного окна одинаковый при каждом запуске.
Запустите код из SciTE нажатием F5 и посмотрите вывод в консоль.
Классы одинаковые
Код:
$hWnd = WinWait("[CLASS:WindowsForms10.Window.8.app.0.1569a64_r6_ad1]", "", 3)

$hWnd2 = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.1569a64_r6_ad1]")

Скрин вывода в консоль я разместил выше
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Да, ошибки. Первая: ошибка создания объекта массива. Обычно такое случается при большом количестве элементов. Попробуйте сначала найти панель, в которой находится этот Edit. Потом используйте эту панель в качестве родителя для поиска Edit.
 
Верх