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

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

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 865
    • Награды
  • Версия 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 [?]

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

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 865
    • Награды
  • Версия 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 Гуру
  • *****
  • Сообщений: 3295

  • Автор темы
  • Репутация: 865
    • Награды
  • Версия 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 Гуру
  • *****
  • Сообщений: 3295

  • Автор темы
  • Репутация: 865
    • Награды
  • Версия 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пасибо большое, да и вправду было две одинаковых вкладки открыто! Буду дальше пробовать, спс!

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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #188 Отправлен: Март 30, 2017, 12:47:31 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
46448 Просмотров
Последний ответ Сентябрь 22, 2010, 22:13:33
от CreatoR
18 Ответов
11877 Просмотров
Последний ответ Сентябрь 18, 2011, 20:49:26
от Zalman1980
9 Ответов
4775 Просмотров
Последний ответ Март 12, 2012, 00:33:05
от cobra2029
0 Ответов
1761 Просмотров
Последний ответ Май 07, 2012, 15:00:44
от Dedullika
18 Ответов
4217 Просмотров
Последний ответ Октябрь 17, 2012, 00:07:30
от Kaster
0 Ответов
1769 Просмотров
Последний ответ Декабрь 02, 2012, 10:15:22
от madmasles
6 Ответов
2992 Просмотров
Последний ответ Декабрь 10, 2012, 11:30:14
от Zergii
3 Ответов
1651 Просмотров
Последний ответ Декабрь 21, 2014, 19:24:21
от brain
8 Ответов
1780 Просмотров
Последний ответ Ноябрь 26, 2015, 17:54:56
от Garrett
22 Ответов
1382 Просмотров
Последний ответ Июнь 09, 2017, 01:12:34
от Alofa