Что нового

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

John26

Новичок
Сообщения
6
Репутация
0
Подскажите пожалуйста, можно как-нибудь пользуясь этими функциями найти по регулярному выражению, а то функция поиска в массиве долго работает...
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
John26
пользуясь этими функциями найти по регулярному выражению
Готовой функции с поддержкой RegExp в этой UDF на данный момент нет.

Методы объекта UIAutomation не работают ни с частью значений свойств, ни, тем более, с регулярными выражениями. В любом случае придётся получать массив (коллекцию) подходящих элементов и дополнительно обрабатывать значения нужных свойств через RegExp.
 

John26

Новичок
Сообщения
6
Репутация
0
Подскажите пожалуйста, что я не так делаю..., допустим нужно средствами UIAutomate получить 14-й элемент массива от найденного (в данном случае от "Покупка/продажа, поиск услуг"), но только в том случае если он виден!, то есть я хочу чтоб каждый раз проверялось виден ли данный элемент, и если виден то вывести его в консоль, а если нет, то провернуть страницу вниз, до тех пор пока он не станет виден ... Но то что написано в коде, не совсем ожидаемо работает, то есть всегда выполняется else, даже тогда когда элемент становится видным. Как это исправить? весь день тыкался с разными циклами, всегда один и тот же результат ...

Код:
#include "UIAutomate.au3"

$hWnd = WinWait("Русское сообщество AutoIt - Главная страница - Mozilla Firefox", "", 3)
If Not $hWnd Then Exit

$oParent = _UIA_GetElementFromHandle($hWnd)

$aAllElements = _UIA_FindAllElements($oParent)
For $i = 1 To $aAllElements[0]
  If _UIA_ElementGetPropertyValue($aAllElements[$i], "Name") = "Покупка/продажа, поиск услуг" and _UIA_ElementGetPropertyValue($aAllElements[$i], "IsOffscreen") = False Then
    ConsoleWrite(_UIA_ElementGetPropertyValue($aAllElements[$i + 14], "Name") & @CRLF)
  else
	sleep(1000)
	send("{Down}")
	sleep(1000)
  EndIf
Next
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
John26
получить 14-й элемент массива от найденного <...>, но только в том случае если он виден
Какой элемент должен быть виден - найденный или 14-й? В коде у вас проверяется на видимость найденный, а не 14-й.

провернуть страницу вниз, до тех пор пока он не станет виден
Если элементу установить фокус ввода, то он автоматически будет перемещён в область видимости
Код:
_UIA_ElementSetFocus($aAllElements[$i + 14])
 

Kasper

Знающий
Сообщения
70
Репутация
8
InnI, Для работы вашей библиотеки окно должно быть открыто или можно что бы оно было свернуто?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Kasper
окно должно быть открыто или можно что бы оно было свернуто
Зависит от конкретного окна или элемента. В свёрнутом Chrome не работает. В свёрнутом IE работает, но только, если родительским элементом назначать не само окно [class:IEFrame], а элемент [class:Internet Explorer_Server;instance:1]. В неактивных и "задвинутых" окнах - работает, но некоторые окна при этом активируются. Короче, как разработчики обеспечили поддержку данного интерфейса в своих программах, так он в этих программах и работает.
 

John26

Новичок
Сообщения
6
Репутация
0
InnI сказал(а):
John26
получить 14-й элемент массива от найденного <...>, но только в том случае если он виден
Какой элемент должен быть виден - найденный или 14-й? В коде у вас проверяется на видимость найденный, а не 14-й.

провернуть страницу вниз, до тех пор пока он не станет виден
Если элементу установить фокус ввода, то он автоматически будет перемещён в область видимости
Код:
_UIA_ElementSetFocus($aAllElements[$i + 14])
Спасибо, все как всегда элементарно и просто :rofl:
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Прокрутка элемента в видимую область без установки фокуса
Код:
Local $pScrollItem, $oScrollItem
$oElement.GetCurrentPattern($UIA_ScrollItemPatternId, $pScrollItem)
$oScrollItem = ObjCreateInterface($pScrollItem, $sIID_IUIAutomationScrollItemPattern, $dtagIUIAutomationScrollItemPattern)
If IsObj($oScrollItem) Then $oScrollItem.ScrollIntoView
 

John26

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

$hWnd = WinWait("Русское сообщество AutoIt - Главная страница - Mozilla Firefox", "", 3)
If Not $hWnd Then Exit

$oParent = _UIA_GetElementFromHandle($hWnd)
Func _UIA_ElementScroll($oElement) 
Local $pScrollItem, $oScrollItem
$oElement.GetCurrentPattern($UIA_ScrollItemPatternId, $pScrollItem)
$oScrollItem = ObjCreateInterface($pScrollItem, $sIID_IUIAutomationScrollItemPattern, $dtagIUIAutomationScrollItemPattern)
If IsObj($oScrollItem) Then $oScrollItem.ScrollIntoView
EndFunc

$aAllElements = _UIA_FindAllElements($oParent)
For $i = 1 To $aAllElements[0]
  If _UIA_ElementGetPropertyValue($aAllElements[$i], "Name") = "Покупка/продажа, поиск услуг" and _UIA_ElementGetPropertyValue($aAllElements[$i], "IsOffscreen") = False Then
_UIA_ElementScroll($aAllElements[$i + 14])
_UIA_ElementSetFocus($aAllElements[$i + 14])    ConsoleWrite(_UIA_ElementGetPropertyValue($aAllElements[$i + 14], "Name") & @CRLF)
  EndIf
Next


Всё равно не прокручивать до видимости... , или я че-то не так делаю?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
John26
Всё равно не прокручивать до видимости
Чтобы подобная прокрутка сработала, у элемента должен быть шаблон ScrollItemPattern. Утилита Inspect отображает его наличие как "IsScrollItemPatternAvailable : true". В браузере Mozilla Firefox на странице http://autoit-script.ru нет ни одного элемента с таким шаблоном, следовательно прокрутка с помощью метода ScrollIntoView работать не будет. Используйте _UIA_ElementSetFocus().

или я че-то не так делаю?
Давайте разбирать ваш код.
Вы получаете массив всех элементов страницы. Затем ищете в этом массиве ВИДИМЫЙ элемент с именем "Покупка/продажа, поиск услуг" (IsOffscreen = False означает, что элемент НЕ за пределами видимости). После этого вы пытаетесь прокрутить до "плюс 14-го" элемента. Но этот элемент - текстовое поле (ник пользователя, оставившего последний ответ) и находится он в той же строке, что и "Покупка/продажа, поиск услуг". Другими словами, если элемент с именем "Покупка/продажа, поиск услуг" будет виден, то и "плюс 14-й" элемент тоже будет виден. Вероятно, вам нужно делать условие так
Код:
; проверка видимости элемента "Покупка/продажа, поиск услуг"
If _UIA_ElementGetPropertyValue($aAllElements[$i], "Name") = "Покупка/продажа, поиск услуг" And _UIA_ElementGetPropertyValue($aAllElements[$i], "IsOffscreen") = True Then
; проверка видимости "плюс 14-го" элемента
If _UIA_ElementGetPropertyValue($aAllElements[$i], "Name") = "Покупка/продажа, поиск услуг" And _UIA_ElementGetPropertyValue($aAllElements[$i + 14], "IsOffscreen") = True Then
 

John26

Новичок
Сообщения
6
Репутация
0
Все понятно, разобрался, только _UIA_ElementSetFocus не на всех элементах работает, отсюда вопрос, как тогда быть если не скролл, ни сет фокус не работает? :stars:

Сделал как мог, через цикл проверки на видимость)
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
John26
как тогда быть если не скролл, ни сет фокус не работает?
С какой целью вы смещаете элемент в область видимости?
И можно пример такого элемента?
 

John26

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

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
John26
необходимо выбрать элемент списка
Попробуйте применить к этому элементу _UIA_ElementDoDefaultAction().
А чтобы не гадать... выделите элемент при помощи Inspect - в меню Action появятся пункты возможных действий. Выбирая эти пункты можете отслеживать реакцию элемента на команды.
 

_kadr_

Новичок
Сообщения
1
Репутация
0
Возможно ли прикрутить метод противоположный _UIA_ElementGetPropertyValue - _UIA_ElementSetPropertyValue?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
_kadr_
прикрутить метод
Методы нельзя "прикручивать", они либо есть (реализованы), либо их нет. Реализацией методов IUIAutomation занимается Microsoft.
 

coolpunk

Новичок
Сообщения
7
Репутация
2
Inspect заканчивает разворачивать дерево объектов на
ControlType: UIA_DocumentControlTypeId (0xC36E)
LocalizedControlType: "документ"

Спрашиваю, как специалиста по UI Automate, есть возможность залезть внутрь него? (html)
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
coolpunk
залезть внутрь него
Это зависит от реализации интерфейсов IAccessible или IUIAutomation в самой программе, отображающей html. Например, в некоторых программах на основе Chromium (Google Chrome, Яндекс браузер) доступ к элементам страницы можно получить через параметр командной строки --force-renderer-accessibility или перейдя по "внутреннему" адресу chrome://accessibility.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Никак не могу додумать, как это использовать чтобы получить выделенный текст в любой программе?
Возможно ли такое с помощью этой штуки?

Попытка:
Код:
$oEl = _UIA_GetElementFromPoint(MouseGetPos(0), MouseGetPos(1))
ConsoleWrite(_UIA_ElementGetPropertyValue($oEl, 'UIA_TextControlTypeId') & @CRLF)

как и ожидалось, ничего не дала.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
CreatoR
получить выделенный текст
Для работы с текстом элемент должен поддерживать шаблон TextPattern. Наличие поддержки шаблона показывает Inspect - IsTextPatternAvailable: true. В противном случае можно прочитать только весь текст целиком в свойствах Name или Value.Value. При наличии шаблона текст можно получить так
Код:
Global $pText, $pRange, $pRangeArray, $iLength, $sText
; $oElement = _UIA_GetElementFrom...

$oElement.GetCurrentPattern($UIA_TextPatternId, $pText)
$oText = ObjCreateInterface($pText, $sIID_IUIAutomationTextPattern, $dtagIUIAutomationTextPattern)
If Not IsObj($oText) Then Exit ConsoleWrite("Ошибка создания шаблона" & @CRLF)

; весь текст
$oText.DocumentRange($pRange)
$oRange = ObjCreateInterface($pRange, $sIID_IUIAutomationTextRange, $dtagIUIAutomationTextRange)
If Not IsObj($oRange) Then Exit ConsoleWrite("Ошибка создания объекта" & @CRLF)
$oRange.GetText(-1, $sText)
ConsoleWrite($sText & @CRLF)

; выделенный текст
$oText.GetSelection($pRangeArray)
$oRangeArray = ObjCreateInterface($pRangeArray, $sIID_IUIAutomationTextRangeArray, $dtagIUIAutomationTextRangeArray)
If Not IsObj($oRangeArray) Then Exit ConsoleWrite("Ошибка создания объекта массива" & @CRLF)
$oRangeArray.Length($iLength)
For $i = 0 To $iLength - 1
  $oRangeArray.GetElement($i, $pRange)
  $oRange = ObjCreateInterface($pRange, $sIID_IUIAutomationTextRange, $dtagIUIAutomationTextRange)
  $oRange.GetText(-1, $sText)
  ConsoleWrite($sText & @CRLF)
Next
 
Верх