Что нового

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

Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
astanid
Я вам ещё раз повторю: интерфейс UIAutomation не работает с кодом страницы. С кодом работает браузер, который на его основе создаёт элементы. И вот с этими элементами уже работает IUIAutomation. Фактически страница представляется, как окно GUI с кнопками, полями ввода, списками и т.д. Поэтому нужно использовать Inspect.

Как узнать выделен или нет чекбокс ?
Если вы хотите работать с CheckBox, то и искать нужно CheckBox (UIA_CheckBoxControlTypeId), а не его текст. Запускаете Inspect и находите CheckBox. Смотрите, какое у него имя (почти всегда оно совпадает с его текстом). А за "выделение" отвечает свойство "Toggle.ToggleState": 0 - выключен, 1 - включён
Код:
#include <UIAutomate.au3>

$oParent = _UIA_GetElementFromHandle(ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1"))
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", "Outdated or irrelevant")
$iState = _UIA_ElementGetPropertyValue($oElement, "Toggle.ToggleState")
ConsoleWrite($iState & @CRLF)


Ещё есть свойство "LegacyIAccessible.State" - это набор флагов состояния элемента. Узнать состояние On/Off можно так
Код:
$iState = _UIA_ElementGetPropertyValue($oElement, "LegacyIAccessible.State")
If BitAND($iState, 0x10) Then
  ConsoleWrite("On" & @CRLF)
Else
  ConsoleWrite("Off" & @CRLF)
EndIf
 

astanid

Новичок
Сообщения
38
Репутация
0
Я вам ещё раз повторю: интерфейс UIAutomation не работает с кодом страницы.
спасибо. прочитать код страницы мне правда постоянно нужно - и как это сделать пока не придумал :(
http://autoit-script.ru/index.php?topic=23242.msg134428#new
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
А подскажите как работать с браузером Опера?
С IE проблем нет, все хорошо, но решил код переделать под оперу и все, ничего не могу найти. Ни одного элемента со страницы, ни элементов браузера!!!
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
mr.Gbabak
как работать с браузером Опера
Также, как с Google Chrome, Yandex Browser и подобными. Главное - запустить с параметром "--force-renderer-accessibility". А дальше см. пример в описании темы и кучу примеров на форуме. Кстати, все проблемы автоматизации Google Chrome вы ощутите и на Опере.
 

pasmo

Новичок
Сообщения
1
Репутация
0
Добрый день,


Пытался сделать отслеживание создания новых вкладок в браузере Firefox EST (версия 45.6.0)
делаю примерно так:
Код:
$oRCpage = null
while 1
   $oRCpage = _UIA_WaitControlTypeElement($oParent, 0xC36E, "Авторизация", "Name", False, 0)
   if IsObj($oRCpage) then ExitLoop
   Sleep(500)
wend

$sHttpAddr = _UIA_ElementGetPropertyValue($oRCpage, "LegacyIAccessible.Value")
MsgBox(0,'', $sHttpAddr)


но проблема из-за которой решил беспокоить такая
Браузер начинает заметно подтормаживать - выходит регулярный опрос тормозит его
игрался с параметрами задержки - если ставить 2 секунды
Код:
$oRCpage = _UIA_WaitControlTypeElement($oParent, 0xC36E, "Авторизация", "Name", False, 2)

и Sleep(2000) то тормозит меньше,
однако раз в две секунды, если например постоянно переключать вкладки (имитируя работу в браузере)
краткосрочные тормоза появляются снова

может подскажите как решить такую проблему и имеет ли она решение вообще?
Спасибо Вам
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
pasmo
Функция _UIA_WaitControlTypeElement сама является циклом. Каждые 100мс она пытается найти запрошенный элемент. Т.е. последний параметр влияет только на время, в течение которого будут производиться попытки, и не влияет на паузы между попытками. А FireFox работает с интерфейсом IUIAutomation (создаёт объекты) довольно долго и с большой нагрузкой. Поэтому, пробуйте так
Код:
$UIA_ConsoleWriteError = 0
Do
  Sleep(1000)
  $oRCpage = _UIA_GetControlTypeElement($oParent, 0xC36E, "Авторизация")
Until Not @error
$UIA_ConsoleWriteError = 1
 

Jenya-cook

Новичок
Сообщения
2
Репутация
0
Браузер: Firefox

Добрый вечер InnI !
Суть вопроса такова:
Хочу сделать проверку, если в в области уведомлений появляется красный круг, то выполнить "допустим нажатие на нем" Предоставляю скрин (Окно Вк и консоль autoit)

Я новичок прошу помощи.

Кратко мои мысли и что делаю по порядку:
1. Ищу все элементы $aAllElements[0]
2. Сравниваю по двум элементам чтобы сжать условие поиска, чтобы найти красный кружок
3. Далее по идее если его найду то можно нажать на него
4. Если его нет - то и ничего делать не надо

В результате слишком много элементов (4шт), как сузить до одного и только его проверять и чем проверять?

Прикладываю мой ерундовый код:
Код:
$hWnd = WinActivate("Страница Вк")
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель


$aAllElements = _UIA_FindAllElements($oParent)
   
    For $i = 1 To $aAllElements[0]
        If _UIA_ElementGetPropertyValue($aAllElements[$i], "LocalizedControlType") ="поле" And _   ;Ищу по двум критериям, но все равно не могу найти искомое только одно.
		   _UIA_ElementGetPropertyValue($aAllElements[$i], "AccessKey") = "Alt+Shift+2" Then

			$info = _UIA_ElementGetPropertyValue($aAllElements[$i], "name")

          	ConsoleWrite ($i &" ") ;вывожу номер из массива
			ConsoleWrite ($info &@CRLF) ;это вывод "name" для каждого $i
			
			$aRect = _UIA_ElementGetBoundingRectangle($aAllElements[$i])  ;здесь просто хочу подьехать мышкой к этому красному кружку 
			MouseMove($aRect[0] + ($aRect[2] - $aRect[0]) / 2, $aRect[1] + ($aRect[3] - $aRect[1]) / 2, 10)
		EndIf
	 Next


Что выводит консоль:
132 Уведомления
135 7
6596 Уведомления
6599 7
>Exit code: 0 Time: 13.14
 

Вложения

  • Снимок.JPG
    Снимок.JPG
    134.9 КБ · Просмотры: 27
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
Jenya-cook
Похоже на то, что у вас открыты две одинаковые вкладки. Дело в том, что FireFox перечисляет вообще все элементы - и видимые и невидимые. Поэтому попробуйте дополнительно искать по условию видимости IsOffscreen = False.

Если нужно найти ОДИН элемент, то нужно знать какое-то свойство, отличающее его от ВСЕХ других элементов. В противном случае, находим все элементы с каким-то общим свойством, затем при помощи _UIA_FindElementsInArray фильтруем полученный массив по другому свойству, затем по третьему и т.д. Когда останутся только одинаковые свойства, обращаемся к нужному элементу по индексу оставшегося массива
Код:
$oParent = _UIA_GetElementFromHandle($hWnd)

$aAccessKey = _UIA_FindAllElements($oParent, "AccessKey", "Alt+Shift+2")
$aEdit = _UIA_FindElementsInArray($aAccessKey, "LocalizedControlType", "поле")
$aVisible = _UIA_FindElementsInArray($aEdit, "IsOffscreen", False)

For $i = 1 To $aVisible[0]
  ConsoleWrite(_UIA_ElementGetPropertyValue($aVisible[$i], "Name") & @CRLF)
Next
Для вашего случая, я так понимаю, если останется два элемента, то "кружок" виден. А кликнуть, вероятно, можно в любой из них.

Ещё, как вариант, можно поискать видимую ссылку с наличием в имени строки "Уведомления". Затем, либо прочитать количество уведомлений, либо найти красный пиксель в области ссылки.
 

Jenya-cook

Новичок
Сообщения
2
Репутация
0
Cпасибо большое, да и вправду было две одинаковых вкладки открыто! Буду дальше пробовать, спс!
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
Нахожу нужный объект
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "name")
Пытаюсь проскролить на него _UIA_ElementScrollIntoView($oElement)
Не скролится. Может _UIA_ElementScrollIntoView только для браузеров?
_UIA_ElementMouseClick($oElement) работает, но когда объекта не видно в списке, то тыкает не туда куда надо.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
tryinfinity
Элемент должен поддерживать шаблон прокрутки IsScrollItemPatternAvailable: true (см. Inspect). Насколько я знаю, тексты данный шаблон не поддерживают. С другой стороны нет смысла кликать в текст, т.к. он ничего не сделает. Смотрите родителя текста в дереве Inspect - кнопка, ссылка, переключатель... Вот у них может быть поддержка прокрутки. Также, эти элементы, как правило, можно "кликать" через DoDefaulAction.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
Обновление до версии 1.7:
- добавлена поддержка Windows 10 (1703) "Creators Update": возможность создания объекта IUIAutomation версии 4 и элементов версий 6 и 7
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
Имею вот такую инфу в инспекторе:
ControlType: UIA_DataGridControlTypeId (0xC36C)
LocalizedControlType: "сетка данных"
Name: ""
AcceleratorKey: ""
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: true
IsEnabled: true
AutomationId: "AccountsListGridView"
ClassName: "RadGridView"
HelpText: "RadGridView"
Scroll.HorizontallyScrollable: false
Scroll.VerticallyScrollable: true
Selection.Selection:
Selection.CanSelectMultiple: false
Selection.IsSelectionRequired: false
Grid.RowCount: 9
Grid.ColumnCount: 11
Пытаюсь достать значение Grid.RowCount.
Т.к. name = "", ищу по LocalizedControlType
Код:
$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_DataGridControlTypeId", "сетка данных");
print(_UIA_ElementGetPropertyValue($oElement, "Grid.RowCount"));

Ошибок нет, значит объект находится, но Grid.RowCount почему-то распечатывае равным 0.
Хелп плз.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
tryinfinity
Т.к. name = "", ищу по LocalizedControlType
"Name" используется по умолчанию, а другие свойства нужно указывать явно
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_DataGridControlTypeId", "сетка данных", "LocalizedControlType")


почему-то распечатывае равным 0
Ну я же не знаю, что у вас функция print делает. Может, она только и умеет, что ноль "распечатывать" ;)
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
Огромное спасибо за помощь.
Появилась новая проблема. Есть основное окно приложения, на нем кнопка "Меню" с выскакивающим списком кнопок, жму "Меню", жму нужную кнопку из списка (_UIA_ElementDoDefaultAction($oElement)), появляется поверх диалоговое окно, которое делает неактивным главное, пока его не закрыть. В этот момент весь скрипт замирает и чего то ждет, пока не закроешь это окно. Через время в логах _UIA_ElementDoDefaultAction : ошибка выполнения метода (0x80042002)
Читал описание, но там нет параметра не ожидать ответа о выполнении. Как можно решить проблему?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
tryinfinity
скрипт замирает и чего то ждет
Скрипт выполняет указанные вами команды. Если вы, как разработчик скрипта, не можете понять, чего ожидает скрипт, то я, не видя кода, тем более не смогу это определить.

там нет параметра не ожидать ответа о выполнении
Не понял фразы. Функции выводят ошибки при возникновении этих самых ошибок. Вывод ошибок можно в любой момент отключить или включить
Код:
$UIA_ConsoleWriteError = 0 ; отключение вывода ошибок
$UIA_ConsoleWriteError = 1 ; включение вывода ошибок (по умолчанию - включено)


Как можно решить проблему?
Насколько я понял - проблема в открытом окне. Следовательно, нужно закрыть это диалоговое окно (или дождаться его закрытия) и только после этого вызывать функции, работающие с основным окном.
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
Если вы, как разработчик скрипта, не можете понять, чего ожидает скрипт, то я, не видя кода, тем более не смогу это определить.
Дак вроде понял и написал, что скрипт подвисает на _UIA_ElementDoDefaultAction($oElement). А чтоименно его стопорит его в самой ф-ции я не знаю, вот и спросил.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
tryinfinity
скрипт подвисает на _UIA_ElementDoDefaultAction($oElement)
Вы ошибаетесь. Если скрипт и подвисает, то не на этой функции. Чтобы выполнить эту функцию, вам нужно элемент найти. Вот при поиске, особенно, если использовать _UIA_Wait* функции, скрипт может "задуматься". Т.е. вам будет казаться, что скрипт завис, а на самом деле он пытается найти нужный вам элемент. С другой стороны, если окно заблокировано, то выполнение DoDefaultAction может привести к ошибке, по причине отсутствия доступа к элементу. К тому же, я не могу точно сказать, как будет вести себя поиск в заблокированном окне.

Я не пойму. Вы хотите проблему решить или пообщаться? Без кода проблемного участка мы проблему не решим. А бывает, что и код не помогает и нужно работать непосредственно с программой - изучать её реакцию на различные действия.
 

XakeP

Новичок
Сообщения
1
Репутация
0
для WinXP уже недоступно скачать API UIAutomation. :( если есть у кого - залейте куда нибудь
 
Верх