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

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

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
alp2
Цитировать
нужно определить, что это рекламный блок
Попробуйте так
Код: AutoIt [Выделить]
#include <UIAutomate.au3>

$oRootElement = _UIA_GetElementFromHandle(WinGetHandle("[RegexpTitle:- Mozilla Firefox]"))
; находим все ссылки
$aLinks = _UIA_FindAllElements($oRootElement, "ControlType", $UIA_HyperlinkControlTypeId)
For $i = 1 To $aLinks[0]
  ; получаем родителя ссылки
  $oParent = _UIA_ElementGetParent($aLinks[$i])
  ; ищем слово "Реклама" в имени родителя
  If StringInStr(_UIA_ElementGetPropertyValue($oParent, "Name"), "Реклама") Then ConsoleWrite("Рекламный блок" & @CRLF)
Next


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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #210 Отправлен: Август 11, 2017, 13:21:29 »

Оффлайн mixpp [?]

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

Столкнулся с проблемой которая называется ControlType: UIA_MenuItemControlTypeId(0xC35B)
Не смог понять какой функцией воспользоваться для клика данного меню.
Программа написано на Qt. Задача состоит в том что в главном окне есть вкладки и в них нужно зайти.

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
mixpp
Цитировать
какой функцией воспользоваться для клика данного меню
Код: AutoIt [Выделить]
_UIA_ElementDoDefaultAction()
; или
_UIA_ElementMouseClick()


Оффлайн mixpp [?]

  • Новичок
  • *
  • Сообщений: 5
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
У нас получился вот такой код, но получается первый Элемент выделяется (Help alt+H) и открывается вкладки но дальше когда мы хотим открыть About уже ничего не происходит.
Код: AutoIt [Выделить]
#include <UIAutomate.au3>
Opt("WinTitleMatchMode", 2)

WinActivate("Radmin VPN")
$hWnd = WinActivate("Radmin VPN") ;активация  окна
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Help Alt+H") ; элемент
_UIA_ElementMouseClick($oElement); клик по элементу
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "About... Alt+A") ; элемент
_UIA_ElementMouseClick($oElement); клик по элементу
 



Добавлено: Август 17, 2017, 14:04:41
Решили проблему, но тут возникли вопросики.
Как сделать так чтоб ElementMouseClick делал не левой клик а правой?

Пример решение:
Код: AutoIt [Выделить]
WinActivate("Radmin VPN")
$hWnd = WinActivate("Radmin VPN") ;активация  окна
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Network Alt+N") ;  клик мыши по меню Network
_UIA_ElementMouseClick($oElement); клик по элементу
$hWnd = WinActivate("Radmin VPN") ;активация  окна
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Create new network Alt+C") ; клик мыши по меню Create new network Alt+C
_UIA_ElementMouseClick($oElement); клик по элементу

« Последнее редактирование: Август 17, 2017, 14:04:42 от mixpp, Причина: Объединение сообщений »

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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #213 Отправлен: Август 17, 2017, 13:16:00 »

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
mixpp
Цитировать
когда мы хотим открыть About уже ничего не происходит
Потому что пункт меню About принадлежит другому окну - всплывающему меню
(нажмите для показа/скрытия)

Цитировать
чтоб ElementMouseClick делал не левой клик а правой
Укажите вторым параметром нужную кнопку
Код: AutoIt [Выделить]
_UIA_ElementMouseClick($oElement, "right")


Оффлайн paa13 [?]

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

Подскажите пж-ста, как убыстрить выполнение такого кода?
Если поиск по 5-6 текстам, то занимает примерно 5-6 сек, но текстов будет примерно 40-50 и время сканирования увеличивается в разы
сравнения три (состояние чекбокса, имя чекбокса и текст)
строк UIA_TextControlTypeId на странице порядка 300

Код: AutoIt [Выделить]
  Global $checksys[7] = [6, GUICtrlRead($Checkbox1), GUICtrlRead($Checkbox2), GUICtrlRead($Checkbox3), GUICtrlRead($Checkbox4), GUICtrlRead($Checkbox5), GUICtrlRead($Checkbox6)
  Global $checkname[7] = [6, GUICtrlRead($Checkbox1, 1), GUICtrlRead($Checkbox2, 1), GUICtrlRead($Checkbox3, 1), GUICtrlRead($Checkbox4, 1), GUICtrlRead($Checkbox5, 1), GUICtrlRead($Checkbox6, 1)]
  Global $lists[7] = [6, $text1, $text2, $text3, $text4, $text5, $text6]

  For $i = 1 To $checksys[0] Step 1
  For $i = 1 To $checkname[0] Step 1
  For $i = 1 To $lists[0] Step 1

    $oneElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", $lists[$i])
    If IsObj($oneElement) and $checksys[$i]=1 and $lists[$i]=$checkname[$i] Then
    MsgBox(4096, "Внимание!", "Найдено-" & $lists[$i])  
    EndIf
   
  Next
  Next
  Next


Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
paa13
Цитировать
как убыстрить выполнение
Попробуйте так
Код: AutoIt [Выделить]
    Global $oneElement
    For $i = 1 To $lists[0] Step 1

      If $checksys[$i]=1 and $lists[$i]=$checkname[$i] Then $oneElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", $lists[$i])
      If IsObj($oneElement) Then MsgBox(4096, "Внимание!", "Найдено-" & $lists[$i])

    Next


Оффлайн mixpp [?]

  • Новичок
  • *
  • Сообщений: 5
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
При выполнение цикла переменная i записывается в результат. Но получается когда начинаешь сверять с файлом то там 10 значений, а в программе всего 7
Сохранение в файл
Код: AutoIt [Выделить]
#include <UIAutomate.au3>
Opt("WinTitleMatchMode", 2)
ProcessClose("RvRvpnGui.exe")
; Запуск GUI Radmin VPN
Run(@ProgramFilesDir & "\Radmin VPN\RvRvpnGui.exe")
; Удаление файла-лога с записью начала теста
FileDelete('Time.txt')
; Удаление файла со списком имён сетей
FileDelete('NetworkName_wtith_pass_No_allow.txt')
; Запись начала времени теста
FileWrite(@ScriptDir & '\Time.txt' , @HOUR & ':' & @MIN & ':' & @SEC & ':' & @MSEC & @CRLF)
$i=1
While $i<=10
; Переменная имени сети. Задаётся рандом от 0 до 999999999
$Net_Name=Random(0,999999999,1)
; Запись переменной имени сети в файл, для дальнейших подключений join
FileWrite(@ScriptDir & '\NetworkName_wtith_pass_No_allow.txt' , $Net_Name & @CRLF)
; Переменная для отслеживания окна Create Network
$wnd = ControlGetHandle("[class:Qt5QWindowIcon]", "Create network", "")
$hWnd = WinActivate("[title:Radmin VPN;class:Qt5QWindowIcon]") ; активация  окна
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель (главное окно)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Network Alt+N") ; элемент
_UIA_ElementMouseClick($oElement) ; клик по элементу

$hWnd = WinWait("[class:Qt5QWindowPopupDropShadowSaveBits]", "", 1) ; ожидание окна меню
$oPopup = _UIA_GetElementFromHandle($hWnd) ; родитель (окно меню)
$oElement = _UIA_GetControlTypeElement($oPopup, "UIA_MenuItemControlTypeId", "Create new network Alt+C") ; элемент
_UIA_ElementMouseClick($oElement) ; клик по элементу
; Ввод имени сети из рандомной переменной
Send($Net_Name)
; Переключение табуляцией на поле пароля
Send ("{TAB}")
; Ввод пароля аналогичного имени сети
Send($Net_Name)
; Переключение табуляцией на поле подтверждения пароля
Send ("{TAB}")
; Ввод пароляаналогичного имени сети
Send($Net_Name)
; Отправка enter
Send ("{ENTER}")
; Ожидание закрытия окна create network
WinWaitClose($wnd)
; Увеличение счётчика цикла на единицу
$i=$i+1
; Конец цикла
WEnd
; Запись в файл времени окончания теста
FileWrite(@ScriptDir & '\Time.txt' , @HOUR & ':' & @MIN & ':' & @SEC & ':' & @MSEC & @CRLF)



Добавлено: Август 17, 2017, 16:25:06
Уже нашел ответ, и оказалось нужно в двух местах добавить sleep

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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #217 Отправлен: Август 17, 2017, 16:21:02 »

Оффлайн paa13 [?]

  • Новичок
  • *
  • Сообщений: 19
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
paa13
Цитировать
как убыстрить выполнение
Попробуйте так
Код: AutoIt [Выделить]
    Global $oneElement
    For $i = 1 To $lists[0] Step 1

      If $checksys[$i]=1 and $lists[$i]=$checkname[$i] Then $oneElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", $lists[$i])
      If IsObj($oneElement) Then MsgBox(4096, "Внимание!", "Найдено-" & $lists[$i])

    Next


При таком варианте, если стоит галка на 1-2 чекбоксах, сканирует 1-2 сек, но если поставить штук 20-30, то ситуация повторяется.....
Может возможно ограничить как-то диапазон поиска на экране или какие то дополнительные критерии отбора к _UIA_GetControlTypeElement ?

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
paa13
Цитировать
ситуация повторяется
Пробуйте так
Код: AutoIt [Выделить]
    For $i = 1 To $lists[0]
      If $checksys[$i] = 1 And $lists[$i] = $checkname[$i] Then
        $oCond1 = _UIA_CreatePropertyCondition("ControlType", $UIA_TextControlTypeId)
        $oCond2 = _UIA_CreatePropertyCondition("Name", $lists[$i])
        $oCond = _UIA_CreateLogicalCondition($oCond1, "AND", $oCond2)
        $oneElement = _UIA_GetElementFromCondition($oParent, $oCond)
        If IsObj($oneElement) Then MsgBox(4096, "Внимание!", "Найдено-" & $lists[$i])
      EndIf
    Next


Цитировать
Может возможно ограничить как-то диапазон поиска
Всё зависит от программы: чем ближе "родитель", тем быстрей.

Цитировать
какие то дополнительные критерии отбора
Всё в ваших руках. Создавайте условия при помощи _UIA_CreatePropertyCondition и _UIA_CreateLogicalCondition и ищите через _UIA_GetElementFromCondition.

Цитировать
строк UIA_TextControlTypeId на странице порядка 300
Перебрать 300 строк - это пара десятков миллисекунд. Либо вы не всё видите. Либо у программы проблемы совместимости с IUIAutomation. Либо вы не там замеры делаете.

Оффлайн paa13 [?]

  • Новичок
  • *
  • Сообщений: 19
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
Перебрать 300 строк - это пара десятков миллисекунд. Либо вы не всё видите. Либо у программы проблемы совместимости с IUIAutomation. Либо вы не там замеры делаете.

Спасибо, этот вариант гораздо быстрее сканирует!
Без галочек моментально (1 сек) , с 20-30ю примерно около 3сек.

Цитировать
Либо у программы проблемы совместимости с IUIAutomation. Либо вы не там замеры делаете.

программа Гугл хром 58

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
OffTopicpaa13
Цитировать
программа Гугл хром 58
По моим замерам _UIA_GetControlTypeElement обрабатывает примерно одну строку за миллисекунду (300 строк за 290 мс, 1500 строк за 1400 мс). Использование _UIA_GetElementFromCondition в три раза быстрее (100 мс и 450 мс соответственно). Но так и должно быть, т.к. _UIA_GetControlTypeElement содержит цикл сравнения значений найденных элементов.

Оффлайн paa13 [?]

  • Новичок
  • *
  • Сообщений: 19
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
_UIA_GetControlTypeElement

Спасибо еще раз, опять загвоздка  :(
Не могу понять как теперь искать совпадения не полного имени, а части его...

Например:
Краска Empis - белая
Краска Empis - красная

поиск тока названия Краска Empis, чтобы и ту и ту надпись находил

Онлайн InnI [?]

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

  • Автор темы
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
paa13
Цитировать
как теперь искать совпадения не полного имени
Во-о-от. Теперь мы понимаем, почему медленно работает функция _UIA_GetControlTypeElement ;)
А если использовать условия, то пробуйте так
Код: AutoIt [Выделить]
        $oCond1 = _UIA_CreatePropertyCondition("Name", "Краска Empis - белая")
        $oCond2 = _UIA_CreatePropertyCondition("Name", "Краска Empis - красная")
        $oCondOr = _UIA_CreateLogicalCondition($oCond1, "OR", $oCond2)
        $oCond3 = _UIA_CreatePropertyCondition("ControlType", $UIA_TextControlTypeId)
        $oCondAnd = _UIA_CreateLogicalCondition($oCondOr, "AND", $oCond3)
        $oneElement = _UIA_GetElementFromCondition($oParent, $oCondAnd)

Если эти названия только у текстов, то можно сразу искать по $oCondOr.

Кстати. Ещё немного ускорить поиск в Chrome можно, если искать не от главного окна, а от элемента отображения страницы
Код: AutoIt [Выделить]
$oParent = _UIA_GetElementFromHandle(ControlGetHandle("[RegexpTitle:- Google Chrome]", "", "Chrome_RenderWidgetHostHWND1"))


Оффлайн paa13 [?]

  • Новичок
  • *
  • Сообщений: 19
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
Код: AutoIt [Выделить]
$oParent = _UIA_GetElementFromHandle(ControlGetHandle("[RegexpTitle:- Google Chrome]", "", "Chrome_RenderWidgetHostHWND1"))

Спасибо! Даже визуально ускорила сканирование

Цитировать
Код: AutoIt [Выделить]
$oCond1 = _UIA_CreatePropertyCondition("Name", "Краска Empis - белая")
$oCond2 = _UIA_CreatePropertyCondition("Name", "Краска Empis - красная")


ведь эти названия и так объявляются в массиве       
Код: AutoIt [Выделить]
Global $lists[7] = [6, $text1, $text2, $text3, $text4, $text5, $text6]
$oCond2 = _UIA_CreatePropertyCondition("Name", $lists[$i])


да и функция _UIA_CreateLogicalCondition как я понимаю поддерживает только два условия, это просто кода будет на две страницы.....

Красок их порядка 40-50 наименований, а вот цветов может еще 10 каждой и это получается очень много условий, еслиб был вариант искать тока по части названия
Код: AutoIt [Выделить]
Global $lists[7] = [6, "Краска Empis", "Краска ЛАКРА", $text3, $text4, $text5, $text6]


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

Re: UIAutomate - автоматизация нестандартных элементов GUI
« Ответ #224 Отправлен: Август 17, 2017, 19:14:37 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
63413 Просмотров
Последний ответ Сентябрь 22, 2010, 22:13:33
от CreatoR
18 Ответов
12811 Просмотров
Последний ответ Сентябрь 18, 2011, 20:49:26
от Zalman1980
9 Ответов
5170 Просмотров
Последний ответ Март 12, 2012, 00:33:05
от cobra2029
0 Ответов
1865 Просмотров
Последний ответ Май 07, 2012, 15:00:44
от Dedullika
18 Ответов
4605 Просмотров
Последний ответ Октябрь 17, 2012, 00:07:30
от Kaster
0 Ответов
1901 Просмотров
Последний ответ Декабрь 02, 2012, 10:15:22
от madmasles
6 Ответов
3231 Просмотров
Последний ответ Декабрь 10, 2012, 11:30:14
от Zergii
3 Ответов
1825 Просмотров
Последний ответ Декабрь 21, 2014, 19:24:21
от brain
8 Ответов
2105 Просмотров
Последний ответ Ноябрь 26, 2015, 17:54:56
от Garrett
22 Ответов
2058 Просмотров
Последний ответ Июнь 09, 2017, 01:12:34
от Alofa