Автор Тема: UIAutomate - автоматизация нестандартных элементов GUI  (Прочитано 76731 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
astanid
Я вам ещё раз повторю: интерфейс UIAutomation не работает с кодом страницы. С кодом работает браузер, который на его основе создаёт элементы. И вот с этими элементами уже работает IUIAutomation. Фактически страница представляется, как окно GUI с кнопками, полями ввода, списками и т.д. Поэтому нужно использовать Inspect.

Цитировать
Как узнать выделен или нет чекбокс ?
Если вы хотите работать с CheckBox, то и искать нужно CheckBox (UIA_CheckBoxControlTypeId), а не его текст. Запускаете Inspect и находите CheckBox. Смотрите, какое у него имя (почти всегда оно совпадает с его текстом). А за "выделение" отвечает свойство "Toggle.ToggleState": 0 - выключен, 1 - включён
Код: AutoIt [Выделить]
#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 можно так
Код: AutoIt [Выделить]
$iState = _UIA_ElementGetPropertyValue($oElement, "LegacyIAccessible.State")
If BitAND($iState, 0x10) Then
  ConsoleWrite("On" & @CRLF)
Else
  ConsoleWrite("Off" & @CRLF)
EndIf


Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #180 Отправлен: Декабрь 29, 2016, 22:49:58 »

Оффлайн astanid [?]

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


« Последнее редактирование: Декабрь 30, 2016, 19:17:10 от astanid »

Оффлайн mr.Gbabak [?]

  • Новичок
  • *
  • Сообщений: 163
  • Репутация: 15
  • Пол: Мужской
    • Награды
А подскажите как работать с браузером Опера?
С IE проблем нет, все хорошо, но решил код переделать под оперу и все, ничего не могу найти. Ни одного элемента со страницы, ни элементов браузера!!!

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
mr.Gbabak
Цитировать
как работать с браузером Опера
Также, как с Google Chrome, Yandex Browser и подобными. Главное - запустить с параметром "--force-renderer-accessibility". А дальше см. пример в описании темы и кучу примеров на форуме. Кстати, все проблемы автоматизации Google Chrome вы ощутите и на Опере.

Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #183 Отправлен: Январь 19, 2017, 11:58:28 »

Оффлайн pasmo [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Добрый день,


Пытался сделать отслеживание создания новых вкладок в браузере Firefox EST (версия 45.6.0)
делаю примерно так:
Код: AutoIt [Выделить]
$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 секунды
Код: AutoIt [Выделить]
$oRCpage = _UIA_WaitControlTypeElement($oParent, 0xC36E, "Авторизация", "Name", False, 2)

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

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


Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655

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


Оффлайн Jenya-cook [?]

  • Новичок
  • *
  • Сообщений: 2
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Браузер: Firefox

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

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

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

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

Прикладываю мой ерундовый код:
Код: AutoIt [Выделить]
$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



Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
Jenya-cook
Похоже на то, что у вас открыты две одинаковые вкладки. Дело в том, что FireFox перечисляет вообще все элементы - и видимые и невидимые. Поэтому попробуйте дополнительно искать по условию видимости IsOffscreen = False.

Если нужно найти ОДИН элемент, то нужно знать какое-то свойство, отличающее его от ВСЕХ других элементов. В противном случае, находим все элементы с каким-то общим свойством, затем при помощи _UIA_FindElementsInArray фильтруем полученный массив по другому свойству, затем по третьему и т.д. Когда останутся только одинаковые свойства, обращаемся к нужному элементу по индексу оставшегося массива
Код: AutoIt [Выделить]
$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

Для вашего случая, я так понимаю, если останется два элемента, то "кружок" виден. А кликнуть, вероятно, можно в любой из них.

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

Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #187 Отправлен: Март 29, 2017, 13:02:34 »

Оффлайн Jenya-cook [?]

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

Оффлайн tryinfinity [?]

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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
tryinfinity
Цитировать
Не скролится.
Элемент должен поддерживать шаблон прокрутки IsScrollItemPatternAvailable: true (см. Inspect). Насколько я знаю, тексты данный шаблон не поддерживают. С другой стороны нет смысла кликать в текст, т.к. он ничего не сделает. Смотрите родителя текста в дереве Inspect - кнопка, ссылка, переключатель... Вот у них может быть поддержка прокрутки. Также, эти элементы, как правило, можно "кликать" через DoDefaulAction.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
Обновление до версии 1.7:
- добавлена поддержка Windows 10 (1703) "Creators Update": возможность создания объекта IUIAutomation версии 4 и элементов версий 6 и 7

Оффлайн tryinfinity [?]

  • Новичок
  • *
  • Сообщений: 22
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Имею вот такую инфу в инспекторе:
(нажмите для показа/скрытия)
Пытаюсь достать значение Grid.RowCount.
Т.к. name = "", ищу по LocalizedControlType
Код: AutoIt [Выделить]
$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_DataGridControlTypeId", "сетка данных");
print(_UIA_ElementGetPropertyValue($oElement, "Grid.RowCount"));

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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3655

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
tryinfinity
Цитировать
Т.к. name = "", ищу по LocalizedControlType
"Name" используется по умолчанию, а другие свойства нужно указывать явно
Код: AutoIt [Выделить]
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_DataGridControlTypeId", "сетка данных", "LocalizedControlType")


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

Оффлайн tryinfinity [?]

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

Русское сообщество AutoIt

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #194 Отправлен: Июль 15, 2017, 02:50:23 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
64518 Просмотров
Последний ответ Сентябрь 22, 2010, 22:13:33
от CreatoR
18 Ответов
12840 Просмотров
Последний ответ Сентябрь 18, 2011, 20:49:26
от Zalman1980
9 Ответов
5179 Просмотров
Последний ответ Март 12, 2012, 00:33:05
от cobra2029
0 Ответов
1871 Просмотров
Последний ответ Май 07, 2012, 15:00:44
от Dedullika
18 Ответов
4613 Просмотров
Последний ответ Октябрь 17, 2012, 00:07:30
от Kaster
0 Ответов
1902 Просмотров
Последний ответ Декабрь 02, 2012, 10:15:22
от madmasles
6 Ответов
3238 Просмотров
Последний ответ Декабрь 10, 2012, 11:30:14
от Zergii
3 Ответов
1830 Просмотров
Последний ответ Декабрь 21, 2014, 19:24:21
от brain
8 Ответов
2118 Просмотров
Последний ответ Ноябрь 26, 2015, 17:54:56
от Garrett
22 Ответов
2065 Просмотров
Последний ответ Июнь 09, 2017, 01:12:34
от Alofa