Что нового

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

tryinfinity

Новичок
Сообщения
40
Репутация
0
Спасибо. Еще такой вопрос, нужный элемент имеет ControlType: UIA_TextControlTypeId
Я так понимаю его не получится кликнуть по _UIA_ElementDoDefaultAction($oElement), т.к. это не кнопка? А хотелось бы кликать при свернутом окне)
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
tryinfinity [?]
ControlType: UIA_TextControlTypeId
Если вы можете кликнуть этот элемент мышью и получить реакцию, то посмотрите в дереве Inspect родителя этого текста. Возможно, это одноимённая гиперссылка, которую можно "кликнуть" через DefaultAction.
 

sterro_sasha

Новичок
Сообщения
44
Репутация
1
Мне кажется это невозможно. Но спрошу.

Есть текстовое поле в Хроме, в которое я пишу текст. Можно ли как-то этот текст скопировать? Ctrl + C - работает.. но не совсем нужное, ибо текст выделяется, моя позиция курсора сбивается.. Плохо то, что по Ctrl + U - текста нет, то есть он.. есть только в текстовом поле.

В IE есть чудесная функция - _IEBodyReadText, но.. вот бы такую для Хрома. Что думаете? Заранее спасибо :smile:
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
sterro_sasha [?]
Утилита текст вообще не видит
Вообще не видеть текст она не может. Например, текст ссылок она видит. Вот конкретно вашего контрола может и не видеть.
Убедитесь, что Chrome запущен с параметром --force-renderer-accessibility и что утилита видит хоть какой-нибудь элемент на странице. Затем посмотрите на нужный вам - если обнаружит текст, значит его можно прочитать, если нет - значит нет.
 

sterro_sasha

Новичок
Сообщения
44
Репутация
1
Текст нашла, ура, видимо все благодаря --force-renderer-accessibility :smile:

Главное решено! Теперь пробую понять как его извлечь. Наверно нужно по какому-то ID искать поле?

извините за глупые вопросы. продолжаю изучать.

не могу понять алгоритм, как извлечь текст из поля?

так почему-то не работает:

Код:
$hWnd = WinGetHandle('test.htm') ;заголовок окна
Sleep(2000)
;UIA_EditControlTypeId
$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "поле") ;извлекаем текст указанного контрола с именем.. (может глупость написал))

ConsoleWrite(_UIA_ElementGetPropertyValue($oElement, "Name") & @CRLF)



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

InnI сказал(а):
sterro_sasha [?]Вообще не видеть текст она не может. Например, текст ссылок она видит. Вот конкретно вашего контрола может и не видеть.
Убедитесь, что Chrome запущен с параметром --force-renderer-accessibility и что утилита видит хоть какой-нибудь элемент на странице. Затем посмотрите на нужный вам - если обнаружит текст, значит его можно прочитать, если нет - значит нет.

МОЖЕТЕ МЕНЯ ПОЗДРАВИТЬ!

Код:
$oParent = _UIA_GetElementFromHandle($hWnd)

$control = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "поле", "LocalizedControlType")
;_UIA_ElementMouseClick($control)
MsgBox(64,"",_UIA_ElementGetPropertyValue($control,"value.value"))


Наверно это был самый сложный этап в освоении!!!!! аж голова разболелась.
 

Вложения

  • image.jpg
    image.jpg
    26.9 КБ · Просмотры: 39
  • Untitled 2.jpg
    Untitled 2.jpg
    29.1 КБ · Просмотры: 34

Fallen

Новичок
Сообщения
39
Репутация
0
Добрый день,
Столкнулся с проблемой.
В кратце - открываю хром, перехожу по адресу, ввожу логин, пароль(как в примере) далее нахожу "войти" и делаю дефолт действие. Все работает. Но, пытаюсь отловить событие при неудачной авторизации. В Inspect-e нахожу нужный текст события, но обработать и найти его Autoit не могу. Вылетает ошибка, с информацией о том, что такой текст не найден.
Код:
;Проверка авторизации
	$UIA_DefaultWaitTime = 5
	$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Вы ввели неправильный логин или пароль.")
	If IsObj($oElement) Then
		$oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "ОК")
		_UIA_ElementDoDefaultAction($oElement)
		ConsoleWriteError("Указан неверный логин или пароль!")

И еще одна загвоздка... Для того, что бы открыть новую вкладку, используется мышь, в таком случае огромный профит от использования библиотеки теряется( Может я что-то не так делаю конечно, но код брал из примера и адаптировал под себя.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Fallen [?]
такой текст не найден
Попробуйте обновить $oParent - вызовите повторно функцию, его создающую.

что бы открыть новую вкладку, используется мышь
Ну это же пример. Не нравится мышь - используйте DoDefaultAction (на версии Chrome 74.0.3729.169 работает даже в свёрнутом окне)
Код:
#include <UIAutomate.au3>

$oParent = _UIA_GetElementFromHandle(WinGetHandle("[RegexpTitle: - Google Chrome]"))
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Новая вкладка")
_UIA_ElementDoDefaultAction($oButton)
 

Fallen

Новичок
Сообщения
39
Репутация
0
Очень круто) Спасибо большое) Сегодня, очередной бессонной ночью, буду пробовать)
 

Fallen

Новичок
Сообщения
39
Репутация
0
Добрый вечер,
Попробуйте обновить $oParent - вызовите повторно функцию, его создающую.
Помогло.
Код:
_UIA_ElementDoDefaultAction($oButton)
тоже работает. Вставку текста из примера просто заменил на ControlSend, т.к. defaultaction не везде срабатывал. Теперь столкнулся с проблемой переключения между вкладками. Inspect при наведении показывает UIA_ToolTipControlTypeId и текст, но Autoit их не находит. Постоянно выдает ошибку


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

Пока обошелся ControlClick-ом по координатам) Но не продакшн, не продакшн конечно)))
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Fallen [?]
Inspect при наведении показывает UIA_ToolTipControlTypeId и текст
У меня при наведении на вкладку Inspect показывает UIA_PaneControlTypeId.
Inspect не всегда корректно отображает элементы под курсором (и это не его вина - так работает приложение). Пользуйтесь деревом элементов - кликайте по пунктам и ищите нужный вам элемент. Вкладки имеют тип UIA_TabItemControlTypeId. Также, в меню Action вы можете сразу проверить работу некоторых команд (для разных элементов будет свой набор команд).

Вот пример переключения между вкладками Яндекс и Google
Код:
#include <UIAutomate.au3>

$oParent = _UIA_GetElementFromHandle(WinGetHandle("[RegexpTitle: - Google Chrome]"))
$oTabYandex = _UIA_GetControlTypeElement($oParent, "UIA_TabItemControlTypeId", "Яндекс")
$oTabGoogle = _UIA_GetControlTypeElement($oParent, "UIA_TabItemControlTypeId", "Google")
_UIA_ElementDoDefaultAction($oTabYandex)
Sleep(1000)
_UIA_ElementDoDefaultAction($oTabGoogle)
Sleep(1000)
_UIA_ElementDoDefaultAction($oTabYandex)
Sleep(1000)
_UIA_ElementDoDefaultAction($oTabGoogle)
 

Fallen

Новичок
Сообщения
39
Репутация
0
Благодарю за ответ.
Извините, пожалуйста, что мучаю вас глупыми вопросами. Нашел по дереву форму для ввода логина, но вообще не соображу, как к нему обратиться(
How found: Selected from tree...
Name: ""
ControlType: UIA_EditControlTypeId (0xC354)
LocalizedControlType: ""
BoundingRectangle: {l:2726 t:289 r:3034 b:315}
IsEnabled: true
IsOffscreen: true
IsKeyboardFocusable: true
HasKeyboardFocus: true
AccessKey: ""
ProcessId: 12372
RuntimeId: [2A.440CE6.4.FFFFFB26]
AutomationId: "loginEdit-el"
FrameworkId: "Chrome"
IsControlElement: true
ProviderDescription: "[pid:12372,providerId:0x0 Main(parent link):Microsoft: MSAA Proxy (IAccessible2) (unmanaged:UIAutomationCore.DLL)]"
IsPassword: false
IsRequiredForForm: false
IsDataValidForForm: true
HelpText: ""
Culture: 0
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: "активировать"
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: ""
LegacyIAccessible.Role: редактируемый текст (0x2A)
LegacyIAccessible.State: с фокусом ввода,фокусируемое (0x100004)
LegacyIAccessible.Value: ""
Value.IsReadOnly: false
Value.Value: ""
IsAnnotationPatternAvailable: false
IsDragPatternAvailable: false
IsDockPatternAvailable: false
IsDropTargetPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: true
IsItemContainerPatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsObjectModelPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollItemPatternAvailable: true
IsScrollPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsSpreadsheetItemPatternAvailable: false
IsSpreadsheetPatternAvailable: false
IsStylesPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
IsTableItemPatternAvailable: false
IsTablePatternAvailable: false
IsTextChildPatternAvailable: true
IsTextEditPatternAvailable: true
IsTextPatternAvailable: true
IsTextPattern2Available: true
IsTogglePatternAvailable: false
IsTransformPatternAvailable: false
IsTransform2PatternAvailable: false
IsValuePatternAvailable: true
IsVirtualizedItemPatternAvailable: false
IsWindowPatternAvailable: false
IsCustomNavigationPatternAvailable: false
Не так ведь?)
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "loginEdit-el", "AutomationId")
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Fallen [?]
Можно и так. Если не находит, то, опять же, попробуйте обновить $oParent. Если не поможет - пробуйте функцию _UIA_WaitControlTypeElement.
 

Fallen

Новичок
Сообщения
39
Репутация
0
Спасибо за ответ)
Извините, пожалуйста, понимаю, что туплю безбожно) Но процесс этот остановить уже не в силах)))
Можно описать в различных примерах использование вот этой функции?))
; ============================================================================================
; Имя функции : _UIA_GetControlTypeElement
; Описание : Находит элемент (объект) указанного типа с заданным свойством и значением
; Синтаксис : _UIA_GetControlTypeElement($oElementFrom, $vControlType, $vPropertyValue[, $vProperty = Default[, $fInStr = False]])
; Параметры : $oElementFrom - элемент (объект), от которого начинается поиск
; : $vControlType - идентификатор типа искомого элемента
; : $vPropertyValue - значение свойства искомого элемента
; : $vProperty - свойство искомого элемента (по умолчанию "Name" - $UIA_NamePropertyId)
; : $fInStr - полное совпадение значения свойства (по умолчанию) или частичное
; Возвращает : Успех - элемент (объект)
; : Неудача - 0 и устанавливает @error
; : @error = 1 - первый параметр не является объектом
; : @error = 2 - ошибка преобразования типа
; : @error = 3 - ошибка преобразования свойства
; : @error = 4 - ошибка создания массива элементов (объектов)
; : @error = 5 - элементы указанного типа не найдены
; : @error = 6 - значение указанного свойства найденных элементов не соответствует заданному
; Автор : InnI
; Примечание : Поиск производится от указанного элемента по его дереву и всем поддеревьям
; : Идентификатор типа можно скопировать из значения свойства "ControlType" утилиты Inspect
; : Название свойства можно скопировать из левой части списка утилиты Inspect
; : Значение свойства можно скопировать из правой части списка утилиты Inspect
; ============================================================================================

Например, как найти поле логина по любому параметру, кроме текста? Как осуществлять поиск по части текста? Я вижу, что нужно добавить $fInStr, какое значение ему надо присвоить?) В каком месте функции?)
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Fallen [?]
как найти поле логина по любому параметру, кроме текста?
Вы это уже делали в предыдущем сообщении: "loginEdit-el", "AutomationId"
Вместо "AutomationId" можете подставить любой другой параметр (желательно уникальный) и вместо "loginEdit-el" значение этого параметра.

нужно добавить $fInStr, какое значение ему надо присвоить?) В каком месте функции?)
Просто последним параметром добавляете True
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "inEdit", "AutomationId", True) ; inEdit часть от loginEdit-el
 

liond66

Новичок
Сообщения
117
Репутация
2
Здравствуйте.
Как нарисовать красную рамку вокруг элемента, как в Inspect жёлтая, найденного с помощью _UIA_GetControlTypeElement ?
Есть такая тема для стандартных элементов и для UIAWrappers.au3,
но применить для UIAutomate.au3 я не смог.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
liond66 [?]
Как нарисовать красную рамку вокруг элемента
С помощью UIAutomate - никак. Единственно, чем она может помочь - это найти координаты элемента через функцию _UIA_ElementGetBoundingRectangle. А дальше рисуйте рамку по координатам любым известным вам способом.
 

liond66

Новичок
Сообщения
117
Репутация
2
Спасибо. В рамках этой темы это исчерпывающий ответ.
 
Верх