Что нового

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

hexin

Новичок
Сообщения
32
Репутация
0
Убедитесь в правильном названии строки адреса - её текст зависит от поиска по умолчанию (Google, Яндекс и т.д.)
Точно!
А я не мог понять в чем дело...
Оказывается после обновления поиск меняется с гугла на яндекс...
Спасибо!
Сообщение автоматически объединено:

Подскажите пожалуйста, а можно ли определить номер по порядку (слева на право) активной вкладки в Firefox?
То есть например открыто 10 страниц, а соответсвенно 10 вкладок, и активна 5тая вкладка, вот номер её слева на право можно определить?
чтобы скрипт показал что активна 5тая вкладка.
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
определить номер по порядку (слева на право) активной вкладки в Firefox
Код:
#include "UIAutomate.au3"

$oParent = _UIA_GetElementFromHandle(WinWait("[RegexpTitle:.*Mozilla Firefox]"))
$aTab = _UIA_FindAllElements($oParent, "ControlType", $UIA_TabItemControlTypeId)
ConsoleWrite("Всего вкладок: " & $aTab[0] & @CRLF)
$aSel = _UIA_FindElementsInArray($aTab, "SelectionItem.IsSelected", True)
ConsoleWrite("Выбрано вкладок: " & $aSel[0] & @CRLF)
$aFocus = _UIA_FindElementsInArray($aTab, "IsKeyboardFocusable", True, False, True)
ConsoleWrite("Номер активной вкладки: " & $aFocus[1] & @CRLF)
 

hexin

Новичок
Сообщения
32
Репутация
0
Не знаю почему но у меня практически не работает.
А именно если в браузере открыта одна вкладка то затрачивается время в 5 секунд, а если вкладок 2 то 48 секунд и увеличивается с колличеством вкладок.
Ну ждать 48 секунд на две вкладки это не те скорости...
Может у меня только так?
Лиса портейбл версия 92, виндовс10.
Зависание идет именно на функции $aTab = _UIA_FindAllElements($oParent, "ControlType", $UIA_TabItemControlTypeId)
Код:
#include "UIAutomate.au3"
WinActivate("[REGEXPTITLE:.*Mozilla Firefox]")

$oParent = _UIA_GetElementFromHandle(WinWait("[RegexpTitle:.*Mozilla Firefox]"))
ToolTip("1",0,0)

$timer = TimerInit()
$aTab = _UIA_FindAllElements($oParent, "ControlType", $UIA_TabItemControlTypeId)
MsgBox(4096, "", TimerDiff($timer)/1000)

ToolTip("2",0,0)
ConsoleWrite("Всего вкладок: " & $aTab[0] & @CRLF)
$aSel = _UIA_FindElementsInArray($aTab, "SelectionItem.IsSelected", True)
ConsoleWrite("Выбрано вкладок: " & $aSel[0] & @CRLF)
$aFocus = _UIA_FindElementsInArray($aTab, "IsKeyboardFocusable", True, False, True)
ConsoleWrite("Номер активной вкладки: " & $aFocus[1] & @CRLF)


А так же через раз и вообще не считывает из за ошибки
"D:\script5.au3" (12) : ==> Subscript used on non-accessible variable.:
ConsoleWrite("Всего вкладок: " & $aTab[0] & @CRLF)
ConsoleWrite("Всего вкладок: " & $aTab^ ERROR
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Зависание идет именно на функции
Пробуйте
Код:
#include "UIAutomate.au3"

$oParent = _UIA_GetElementFromHandle(WinWait("[RegexpTitle:.*Mozilla Firefox]"))
$oTabCond = _UIA_CreatePropertyCondition("ControlType", $UIA_TabControlTypeId)
$oTab = _UIA_GetElementFromCondition($oParent, $oTabCond)
$oItemCond = _UIA_CreatePropertyCondition("ControlType", $UIA_TabItemControlTypeId)
$aItems = _UIA_FindAllElementsEx($oTab, $oItemCond, $TreeScope_Children)
$aFocus = _UIA_FindElementsInArray($aItems, "IsKeyboardFocusable", True, False, True)
ConsoleWrite("Номер активной вкладки: " & $aFocus[1] & @CRLF)

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

А так же через раз и вообще не считывает из за ошибки
Firefox при этом продолжает работать или завершается с ошибкой?
 
Последнее редактирование:

hexin

Новичок
Сообщения
32
Репутация
0
Он как бы замораживается, вкладки невозможно переключить, ссылки не работают, скрол вверх вниз страницу невозможно прокрутить, текст мышкой выделить не даёт, ну то есть окно лисы полностью заморажиавется, даже кнопки меню Файл, Правка, Вид... и даже кнопки "свернуть" и "закрыть" окно боаузера тоже заморожены.
Ну а потом вот когда скрипт завершит работу, эти 48 секунд, то он размораживается и всё работает как и прежде.
А вот если не дождаться завершения скрипта а самому его выключить то браузер так и остается замороженым.

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

Спасибо!
Вот этот код прекрасно работает.
10 вкладок считывает за 0,93 секунды, это уже совсем другое дело.
 
Последнее редактирование:

index

Новичок
Сообщения
2
Репутация
0
Здравствуйте.
Впервые сегодня узнал об UIAutomate.
Скажите, пожалуйста, есть ли возможность получить HTML-текст всей страницы из браузера Google Chrome (класс окна "Chrome_RenderWidgetHostHWND")?
Почитал форум, не нашёл ничего об этом. В списке увидел функцию "_UIA_ElementTextSetValue", но соответствующую функцию "_UIA_ElementTextGetValue" тоже не нашёл.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
получить HTML-текст всей страницы из браузера Google Chrome
Код:
WinActivate("[RegexpTitle: - Google Chrome]")
Send("^u")
Sleep(5555)
Send("^a")
Sleep(555)
Send("^c")
Sleep(555)
Send("^w")
Sleep(555)
$HTMLText = ClipGet()
ConsoleWrite($HTMLText & @CRLF)
 

hexin

Новичок
Сообщения
32
Репутация
0
Подскажите пожалуйста а как активизировать (навести фокус) на вкладку Firefox по её номеру по порядку?
Нашел пример как активизировать по имени, но не пойму как активизировать но её номеру.
То есть если считать вкладки слева на право, 1,2,3...и тд. и например нужно активизировать перувую вкладку, то как это сделать?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include "UIAutomate.au3"
$Num = 3
$oParent = _UIA_GetElementFromHandle(WinWait("[RegexpTitle:.*Mozilla Firefox]"))
$oTabCond = _UIA_CreatePropertyCondition("ControlType", $UIA_TabControlTypeId)
$oTab = _UIA_GetElementFromCondition($oParent, $oTabCond)
$oItemCond = _UIA_CreatePropertyCondition("ControlType", $UIA_TabItemControlTypeId)
$aItems = _UIA_FindAllElementsEx($oTab, $oItemCond, $TreeScope_Children)
If $Num > 0 And $Num <= $aItems[0] Then _UIA_ElementMouseClick($aItems[$Num])
 

hexin

Новичок
Сообщения
32
Репутация
0
InnI
Спасибо.
Но я так понял таким способом можно выделять вкладки если вкладок мало, а если вкладок много, ну например 50, то там появляются прокрутки влево и вправо и те ссылки скрываются с экрана и код не срабатывает. То есть все те вкладки которые будут скрыты в списке их не получится выделить
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
То есть все те вкладки которые будут скрыты в списке их не получится выделить
Верно. Потому что вкладки Firefox не реагируют на команду установки фокуса ввода. И шаблон прокрутки не поддерживают.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Добрый день. Пробую кликать по вкладкам и кнопкам окна, созданного с помощью фреймворка WPF. Пробую сделать так:
Код:
#include <UIAutomate.au3>
Local $hWnd = WinGetHandle("Программа") & " 32bit" ; без этой дописки почему-то стопорится. Эта дописка взята из отчета Inspect_W10
ConsoleWrite($hWnd & @CR)
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
 EndIf
 ConsoleWrite($hWnd & @CR)
Local $oParent = _UIA_GetElementFromHandle($hWnd)
 ConsoleWrite($oParent & @CR)
; Поиск вкладки с именем "Звіти, що налаштовуються" и клик по ней
Local $oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "Звіти, що налаштовуються")
_UIA_ElementMouseClick($oElement)

Получаю такой отчет
Код:
0x012A0B52 32bit ; естественно эти цифры разные при новом запуске, но они совпадают с данными, полученными другим способом
0x012A0B52 32bit
!> _UIA_GetElementFromHandle : параметр не является дескриптором
0
!> _UIA_GetControlTypeElement : первый параметр не является объектом
!> _UIA_ElementMouseClick : первый параметр не является объектом

Что может быть не так?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
без этой дописки почему-то стопорится
Вот с этим и нужно разобраться. Дескриптор окна (handle) - это число. И никаких "дописок" не должно быть.
И ещё. Вы некорректно используете условие. Лучше так
Код:
;~ If Not $hWnd Then
If IsHWnd($hWnd) Then


Эта дописка взята из отчета Inspect_W10
Inspect нужен для функций этой UDF. Для встренных функций AutoIt лучше использовать Au3Info.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Inspect нужен для функций этой UDF.
Тоесть нужно рядом со скриптом положить/прописать Inspect?
Для встренных функций AutoIt лучше использовать Au3Info
Так он почти не дает инфы по окошку, только Handle и ещё пару каких-то значений. Именно про него я говорил, когда упоминал, что цифры совпадают, если пробовать получить его другим способом (Au3Info)
Лучше так

Код:
;~ If Not $hWnd Then
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] [URL='https://autoit-script.ru/docs/functions/ishwnd.htm']IsHWnd[/URL]($hWnd) [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL]
А вот этого не знал, спасибо, чуть позже проверю.
Вот с этим и нужно разобраться. Дескриптор окна (handle) - это число. И никаких "дописок" не должно быть.
Как бы в курсе, что это должно быть число. Но с числом ничего не получалось. Стопорилось и висело, ничего не делая. По крайней мере в консоли для отладки ничего не писало. А в отчете Inspect есть такая строка:
Код:
hwnd=0x00180BE4 32bit class="HwndWrapper[Название программы.exe;;31ddbc2a-037d-40e6-bec7-9a57fa5692b1]" style=0x16CF0000 ex=0x401Name:    "Название вкладки"

Вот отсюда и взял от безысходности. С такой допиской хоть какой-то результат получил.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Тоесть нужно рядом со скриптом положить/прописать Inspect?
Нет. Информация из окна Inspect используется для UDF, информация из окна au3info - для нативных функций.

Так он почти не дает инфы по окошку
Так вам и нужен только заголовок окна. Скопируйте из au3info поле Title и вставьте в WinGetHandle без всяких дописок.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Так вам и нужен только заголовок окна. Скопируйте из au3info поле Title и вставьте в WinGetHandle без всяких дописок
Странно, вроде так пробовал раньше, не получалось. Вышел из отпуска, подставил и все заработало.

Сейчас другая проблема. Не могу выбрать нужный чекбокс. Ставит галочку на первом. В отчете Inspect следующая инфа:
Код:
How found:    Selected from tree...
Name:    ""
ControlType:    UIA_CheckBoxControlTypeId (0xC352)
LocalizedControlType:    "флажок"
BoundingRectangle:    {l:-31487 t:-31823 r:-31463 b:-31805}
IsEnabled:    true
IsOffscreen:    false
IsKeyboardFocusable:    true
HasKeyboardFocus:    false
AcceleratorKey:    ""
AccessKey:    ""
ProcessId:    11060
RuntimeId:    [7.2B34.3A8E721]
AutomationId:    "ChekBoxListItem"
FrameworkId:    "WPF"
ClassName:    "CheckBox"
IsControlElement:    true
IsContentElement:    true
ProviderDescription:    "[pid:11060,providerId:0x0 Main(parent link):Unidentified Provider (managed:MS.Internal.Automation.ElementProxy, PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)]"
IsPassword:    false
ItemStatus:    ""
ItemType:    ""
IsRequiredForForm:    false
HelpText:    ""
ClickablePoint:    {x:-31475 y:-31814}
Orientation:    0
LegacyIAccessible.ChildId:    0
LegacyIAccessible.DefaultAction:    "Пометить"
LegacyIAccessible.Description:    ""
LegacyIAccessible.Help:    ""
LegacyIAccessible.KeyboardShortcut:    ""
LegacyIAccessible.Name:    ""
LegacyIAccessible.Role:    флажок (0x2C)
LegacyIAccessible.State:    фокусируемое (0x100000)
LegacyIAccessible.Value:    ""
Toggle.ToggleState:    Off (0)
IsAnnotationPatternAvailable:    false
IsDragPatternAvailable:    false
IsDockPatternAvailable:    false
IsDropTargetPatternAvailable:    false
IsExpandCollapsePatternAvailable:    false
IsGridItemPatternAvailable:    false
IsGridPatternAvailable:    false
IsInvokePatternAvailable:    false
IsItemContainerPatternAvailable:    false
IsLegacyIAccessiblePatternAvailable:    true
IsMultipleViewPatternAvailable:    false
IsObjectModelPatternAvailable:    false
IsRangeValuePatternAvailable:    false
IsScrollItemPatternAvailable:    false
IsScrollPatternAvailable:    false
IsSelectionItemPatternAvailable:    false
IsSelectionPatternAvailable:    false
IsSpreadsheetItemPatternAvailable:    false
IsSpreadsheetPatternAvailable:    false
IsStylesPatternAvailable:    false
IsSynchronizedInputPatternAvailable:    true
IsTableItemPatternAvailable:    false
IsTablePatternAvailable:    false
IsTextChildPatternAvailable:    false
IsTextEditPatternAvailable:    false
IsTextPatternAvailable:    false
IsTextPattern2Available:    false
IsTogglePatternAvailable:    true
IsTransformPatternAvailable:    false
IsTransform2PatternAvailable:    false
IsValuePatternAvailable:    false
IsVirtualizedItemPatternAvailable:    false
IsWindowPatternAvailable:    false
IsCustomNavigationPatternAvailable:    false
FirstChild:    [null]
LastChild:    [null]
Next:    "Название пункта списка возле чекбокса" текст
Previous:    [null]
Other Props:    Object has no additional properties
Children:    Container has no children
Ancestors:    "ReportsApp.Model.CustomReportsModule.CustomReportModel" элемент списка
    "" список
    "Отчеты, которые настраиваются" элемент вкладки
    "" вкладка
    "System.Windows.Controls.TabItem Header: Content:" элемент вкладки
    "" вкладка
    "Название программы" окно
    "Рабочий стол 1" панель
    [ No Parent ]
Пробовал так:
Код:
Local $oElement5 = _UIA_GetControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", "") ; ПРОБОВАЛ тут вставить значение строки рядом с чекбоксом, типа (_UIA_GetControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", "Название пункта списка возле чекбокса")) но не работает
_UIA_ElementDoDefaultAction($oElement5)

Пробовал найти предыдущие и следующие элементы на основе вот этих строк из отчета Inspector:
Код:
Next:    "Название пункта списка возле чекбокса" текст
Previous:    [null]

Код:
Local $oElement5 = _UIA_ElementGetPreviousNext($oElement4)
_ArrayDisplay($aArray)

Получаю пустой массив
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Ставит галочку на первом
У чекбокса нет имени. Подозреваю, что остальные тоже безымянные. Поэтому находит всегда первый.
Вам нужно определить какое-то свойство, уникальное для каждого чекбокса. Возможно, это LegacyIAccessible.ChildId. Тогда можно попробовать так
Код:
$ChildId = 5
Local $oElement5 = _UIA_GetControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", $ChildId, "LegacyIAccessible.ChildId")

Также можно найти все чекбоксы через _UIA_FindAllElements() и отмечать нужный по индексу полученного массива.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Вам нужно определить какое-то свойство, уникальное для каждого чекбокса.
Меняется только несколько значений:
Код:
BoundingRectangle:                     ; значение по такому принципу  {l:-31487 t:-31823 r:-31463 b:-31805}
RuntimeId:                                     ; значение по такому принципу  [7.2B34.3A8E721]
ClickablePoint:                              ; значение по такому принципу  {x:-31475 y:-31814}   НО тут координаты меняются в зависимости от положения окна
Next:                                               ; значение по такому принципу  "Название пункта списка возле чекбокса" текст

Возможно не правильно понял пример, но пробовал так (и остальные по такому же принципу):
Код:
Local $ChildId = "[7.2B34.3A8E721]"
Local $oElement5 = _UIA_GetControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", $ChildId, "RuntimeId")

А из LegacyIAccessible всё одинаковое, ничего не меняется
Код:
LegacyIAccessible.ChildId:    0
LegacyIAccessible.DefaultAction:    "Пометить"
LegacyIAccessible.Description:    ""
LegacyIAccessible.Help:    ""
LegacyIAccessible.KeyboardShortcut:    ""
LegacyIAccessible.Name:    ""
LegacyIAccessible.Role:    флажок (0x2C)
LegacyIAccessible.State:    фокусируемое (0x100000)
LegacyIAccessible.Value:    ""

Также можно найти все чекбоксы через _UIA_FindAllElements() и отмечать нужный по индексу полученного массива.
Это я пробовал, но что-то не получилось. Пробовал так:
Код:
_UIA_FindAllElements($oElement4, 0, "UIA_CheckBoxControlTypeId")  ; тут $oElement4 по идее список, который я получил перед этим и к которому эти чекбоксы относятся, но могу ошибаться.
и так
_UIA_FindAllElements($oParent, 0, "UIA_CheckBoxControlTypeId")  ; $oParent - окно программы

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

Пробовал и так, но тоже без результата:
Код:
; Local $All = _UIA_FindAllElements($oParent)  ; Этот вариант тоже не работает
   Local $All = _UIA_FindAllElements($oParent, 0, "UIA_CheckBoxControlTypeId")
   For $i = 1 to $All[0]
      If $All[$i] = "UIA_CheckBoxControlTypeId" Then
        _ArrayAdd($aArray, $All[$i])
      Endif
  Next

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

Почти получилось таким образом, но приходится считать чекбоксы по порядку
Код:
Local $All = _UIA_FindAllElements($oParent)
   ConsoleWrite(UBound($All) & @CR)
   For $i = 1 to $All[0]
      If _UIA_ElementGetPropertyValue($All[$i], "LocalizedControlType") = "флажок" Then
         _ArrayAdd($aArrayBox, $All[$i])
      Endif
  Next
  _ArrayDisplay($aArrayBox)
  Local $oElement6 = $aArrayBox[10]
  _UIA_ElementDoDefaultAction($oElement6)

Ну и несколько лишних чекбоксов считает, не могу понять откуда берет
 
Последнее редактирование:
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Вот так можно найти все чекбоксы
Код:
$All = _UIA_FindAllElements($oParent, "ControlType", $UIA_CheckBoxControlTypeId)

Если $oParent главное окно, то будут найдены все чекбоксы окна. Но лучше найти элемент, содержащий нужные вам чекбоксы, и использовать его в качестве $oParent. И да, чекбоксы нужно считать (аналогично Instance в нативных функциях AutoIt).
 
Верх