Что нового

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

tryinfinity

Новичок
Сообщения
40
Репутация
0
Столкнулся с проблемой, что Inspect не находит кнопки в панели. RadioButton в той же панели находит, а вот кнопки никак. Это может защита такая в программе? Сколько окон просматривал Inspect, работает идеально, а тут на тебе.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
tryinfinity
Inspect не находит кнопки в панели
Возможно, их там и нет. Вызовите функцию _UIA_FindAllElements для панели и посмотрите результат.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
tryinfinity
по факту кнопка есть
Подобные "кнопки", как правило, не меняют размер и положение относительно панели. Поэтому можно кликать саму панель по координатам "кнопок".
 

tryinfinity

Новичок
Сообщения
40
Репутация
0
Поэтому можно кликать саму панель по координатам "кнопок".
Ну координаты кнопок я достать не могу, могу вытащить другой элемент, который не двигается относительно этих кнопок и потом к примеру делать клик мышкой
_UIA_ElementMouseClick($oElement, "", Default, Default+100, 1, True)
Только вот не знаю как это 100 определить, может просто замерить и потом методом тыка?
Или можно как то вывести в консоль координаты $oElement?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
tryinfinity
координаты кнопок я достать не могу
:shok: Вы это серьёзно?
Сделайте скриншот панели или окна и в любом графическом редакторе посчитайте пиксели от левого верхнего угла панели до центра кнопки. Теперь кликайте панель по координатам кнопки
Код:
_UIA_ElementMouseClick($oPanel, "", $iDeltaX)
$iDeltaX - это расстояние от левого края панели до центра кнопки (ну или не до центра - лишь бы в кнопку попасть). Четвёртый параметр $iY можете оставить по умолчанию - клик будет в середину высоты панели.

вывести в консоль координаты $oElement
Код:
_UIA_ElementGetBoundingRectangle() ; возвращает массив(!) координат


Не знаю, что у вас за программа, но часто панели определяются и стандартными функциями AutoIt. Если так, то попробуйте ControlClick в панель по координатам "кнопок". Координаты найдёте с помощью Au3Info.
 

alp2

Новичок
Сообщения
2
Репутация
0
Столкнулся с проблемой, нужно открыть сайт по ссылке в FF, но на странице имеется реклама этого же сайта, по которой кликать нежелательно. Нужную ссылка в FF можно идентифицировать только по отсутствию текста "Реклама" внизу списка в Inspect (ниже свойства "Ancestors"). Непонятно к какому свойству оно относится.
Если смотреть инфу в Inspect, то "Ancestors" - это массив, куда входят все нижеперечисленные данные?
Или у всех свойств, которые идут ниже "Ancestors" нет имени, тогда как их получить?
Может кто-то реализовывал подобное, поделитесь опытом.
Код:
Ancestors:	"Топливораздаточные колонки - Более 15 лет на рынке - azs-atris.ru" гиперссылка
	
	"Топливораздаточные колонки - Более 15 лет на рынке - azs-atris.ruРекламаwww.azs-atris.ru/всё-для-АЗС Почему мне показано это об
	"" список
	"Реклама"
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
alp2
"Ancestors" - это не свойство. Это список родительских элементов (пункты с "плюсиками" в дереве Inspect). Родительский элемент можно получить через
Код:
_UIA_ElementGetParent()

Судя по предоставленному вами списку "Ancestors", вы смотрите на элемент Edit, родителем которого является ссылка (Hyperlink). Кликнуть по этой ссылке можно так
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_HyperlinkControlTypeId", "Топливораздаточные колонки - Более 15 лет на рынке - azs-atris.ru")
_UIA_ElementDoDefaultAction($oElement)
 

alp2

Новичок
Сообщения
2
Репутация
0
В том то и дело, что кликать не нужно. Мне нужно определить, что это рекламный блок, но каким образом? Речь идет о поисковой выдаче в гугле.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
alp2
нужно определить, что это рекламный блок
Попробуйте так
Код:
#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
 

mixpp

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

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

mixpp

Новичок
Сообщения
5
Репутация
0
У нас получился вот такой код, но получается первый Элемент выделяется (Help alt+H) и открывается вкладки но дальше когда мы хотим открыть About уже ничего не происходит.
Код:
#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); клик по элементу



Добавлено:
Сообщение автоматически объединено:

Решили проблему, но тут возникли вопросики.
Как сделать так чтоб ElementMouseClick делал не левой клик а правой?

Пример решение:
Код:
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); клик по элементу
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
mixpp
когда мы хотим открыть About уже ничего не происходит
Потому что пункт меню About принадлежит другому окну - всплывающему меню
Код:
#include <UIAutomate.au3>

$hWnd = WinActivate("[title:Radmin VPN;class:Qt5QWindowIcon]") ; активация  окна
$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель (главное окно)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Help Alt+H") ; элемент
_UIA_ElementMouseClick($oElement) ; клик по элементу

$hWnd = WinWait("[class:Qt5QWindowPopupDropShadowSaveBits]", "", 1) ; ожидание окна меню
$oPopup = _UIA_GetElementFromHandle($hWnd) ; родитель (окно меню)
$oElement = _UIA_GetControlTypeElement($oPopup, "UIA_MenuItemControlTypeId", "About... Alt+A") ; элемент
_UIA_ElementMouseClick($oElement) ; клик по элементу

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

paa13

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

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

Код:
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
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
paa13
как убыстрить выполнение
Попробуйте так
Код:
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
При выполнение цикла переменная i записывается в результат. Но получается когда начинаешь сверять с файлом то там 10 значений, а в программе всего 7
Сохранение в файл
Код:
#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)



Добавлено:
Сообщение автоматически объединено:

Уже нашел ответ, и оказалось нужно в двух местах добавить sleep
 

paa13

Новичок
Сообщения
44
Репутация
1
InnI сказал(а):
paa13
как убыстрить выполнение
Попробуйте так
Код:
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 ?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
paa13
ситуация повторяется
Пробуйте так
Код:
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. Либо вы не там замеры делаете.
 
Верх