Готовой функции с поддержкой RegExp в этой UDF на данный момент нет.пользуясь этими функциями найти по регулярному выражению
#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
Какой элемент должен быть виден - найденный или 14-й? В коде у вас проверяется на видимость найденный, а не 14-й.получить 14-й элемент массива от найденного <...>, но только в том случае если он виден
Если элементу установить фокус ввода, то он автоматически будет перемещён в область видимостипровернуть страницу вниз, до тех пор пока он не станет виден
_UIA_ElementSetFocus($aAllElements[$i + 14])
Зависит от конкретного окна или элемента. В свёрнутом Chrome не работает. В свёрнутом IE работает, но только, если родительским элементом назначать не само окно [class:IEFrame], а элемент [class:Internet Explorer_Server;instance:1]. В неактивных и "задвинутых" окнах - работает, но некоторые окна при этом активируются. Короче, как разработчики обеспечили поддержку данного интерфейса в своих программах, так он в этих программах и работает.окно должно быть открыто или можно что бы оно было свернуто
Спасибо, все как всегда элементарно и простоInnI сказал(а):John26
Какой элемент должен быть виден - найденный или 14-й? В коде у вас проверяется на видимость найденный, а не 14-й.получить 14-й элемент массива от найденного <...>, но только в том случае если он виден
Если элементу установить фокус ввода, то он автоматически будет перемещён в область видимостипровернуть страницу вниз, до тех пор пока он не станет виденКод:_UIA_ElementSetFocus($aAllElements[$i + 14])
Local $pScrollItem, $oScrollItem
$oElement.GetCurrentPattern($UIA_ScrollItemPatternId, $pScrollItem)
$oScrollItem = ObjCreateInterface($pScrollItem, $sIID_IUIAutomationScrollItemPattern, $dtagIUIAutomationScrollItemPattern)
If IsObj($oScrollItem) Then $oScrollItem.ScrollIntoView
#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
Чтобы подобная прокрутка сработала, у элемента должен быть шаблон ScrollItemPattern. Утилита Inspect отображает его наличие как "IsScrollItemPatternAvailable : true". В браузере Mozilla Firefox на странице http://autoit-script.ru нет ни одного элемента с таким шаблоном, следовательно прокрутка с помощью метода ScrollIntoView работать не будет. Используйте _UIA_ElementSetFocus().Всё равно не прокручивать до видимости
Давайте разбирать ваш код.или я че-то не так делаю?
; проверка видимости элемента "Покупка/продажа, поиск услуг"
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
С какой целью вы смещаете элемент в область видимости?как тогда быть если не скролл, ни сет фокус не работает?
Я бы с радостью, но данное решение требуется на работе...,пытаюсь построить взаимодействие с локальным сайтом,который к сожалению очень коряво отображается в IE...,в общих словах,в сплывающем окне необходимо выбрать элемент списка, который может быть за зоной видимости, затем его необходимо активировать, и нажать на кнопку, для этого и необходим скролл до элемента...InnI сказал(а):John26
С какой целью вы смещаете элемент в область видимости?как тогда быть если не скролл, ни сет фокус не работает?
И можно пример такого элемента?
Попробуйте применить к этому элементу _UIA_ElementDoDefaultAction().необходимо выбрать элемент списка
Методы нельзя "прикручивать", они либо есть (реализованы), либо их нет. Реализацией методов IUIAutomation занимается Microsoft.прикрутить метод
Это зависит от реализации интерфейсов IAccessible или IUIAutomation в самой программе, отображающей html. Например, в некоторых программах на основе Chromium (Google Chrome, Яндекс браузер) доступ к элементам страницы можно получить через параметр командной строки --force-renderer-accessibility или перейдя по "внутреннему" адресу chrome://accessibility.залезть внутрь него
$oEl = _UIA_GetElementFromPoint(MouseGetPos(0), MouseGetPos(1))
ConsoleWrite(_UIA_ElementGetPropertyValue($oEl, 'UIA_TextControlTypeId') & @CRLF)
Для работы с текстом элемент должен поддерживать шаблон 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