Что нового

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

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
$aTimes = _UIA_FindAllElements($oParent, "AutomationId", "PART_TextBox")
Есть два способа ввода нужного времени в найденные поля. Оба вроде бы как визуально по результату абсолютно одинаковые, в консоли отображаются вроде как идентично, но реально срабатывает, тоесть переносится в отчет, только дата введенная одним способом. Другой способ почему-то не срабатывает, и в отчет уходит время, которое было введено либо руками, либо стоит по умолчанию.
Способ №1
Код:
Local $stTime = $oDen1 & "." & $oMonth1 & "." & $oYear1 & " " & $oHour1 & ":" & $oMin1
Local $endTime = $oDen2 & "." & $oMonth2 & "." & $oYear2 & " " & $oHour2 & ":" & $oMin2
_UIA_ElementTextSetValue($aTimes[1], $stTime)
_UIA_ElementTextSetValue($aTimes[2], $endTime)

так время вбивается, но в отчет не переносится
Способ №2
Код:
_UIA_ElementSetFocus($aTimes[1])
Send(StringFormat($oDen1))
   Send("{RIGHT}")
Send(StringFormat($oMonth1))
   Send("{RIGHT}")
Send(StringFormat($oYear1))
   Send("{RIGHT}")
   Send(StringFormat($oHour1))
   Send("{RIGHT}")
    Send(StringFormat($oMin1))
   Send("{TAB}")
Send(StringFormat($oDen2))
   Send("{RIGHT}")
Send(StringFormat($oMonth2))
   Send("{RIGHT}")
Send(StringFormat($oYear2))
   Send("{RIGHT}")
   Send(StringFormat($oHour2))
   Send("{RIGHT}")
   Send(StringFormat($oMin2))

Так и вводится и переносится в отчет.
Первый способ вроде как интересней, короче. Ставил и задержку после него. Но все равно не срабатывает. Видимо какие-то типа "подъячейки" в этом поле есть, раз имитация нажатия клавишь вправо/влево как бы перескакивает через точки и пробелы.
Можно ли как-то модифицировать первый способ?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Так и вводится и переносится в отчет.
Значит контрол отслеживает изменения по нажатию клавиш, а не по изменению содержимого. Ради интереса попробуйте вставить текст из буфера обмена и посмотрите на реакцию элемента.

Можно ли как-то модифицировать первый способ?
Запрета на изменение функций UDF нет. Хотите - модифицируйте текущие, хотите - пишите собственные на базе текущих.
Сообщение автоматически объединено:

вроде как интересней, короче
Запишите весь Send в одну строку. И зачем там StringFormat?
Ещё попробуйте отправить строку с точками
Код:
Send($stTime)
 
Последнее редактирование:

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Ещё попробуйте отправить строку с точками
тогда оно типа все в первую "ячейку" забивает, тоесть до первой точки в поле даты, а оставшаяся часть даты остается на месте. При этом вбивается все вместе с точками и пробелом.
Ради интереса попробуйте вставить текст из буфера обмена и посмотрите на реакцию элемента.
Реакция такая же, как при вводе Send($stTime). Все вбивается в первую "ячейку".
Кстати, если ставить на поле ввода даты фокус, то эта первая "ячейка" выделяется. Если руками поставить туда мышь, то тоже выделяется. Если стрелками передвигаться вправо/влево, то выделение скачет по "ячейкам (на скринах)

Запрета на изменение функций UDF нет. Хотите - модифицируйте текущие, хотите - пишите собственные на базе текущих.
Я не про модификацию UDF ))) я про модификацию строки $stTime интересовался.
Сообщение автоматически объединено:

И зачем там StringFormat?
Без него почему-то реакция такая же, как при вставке из буфера, тоесть все вставляется в первую "ячейку"
 

Вложения

  • Время под стрелкой 3.jpg
    Время под стрелкой 3.jpg
    10.3 КБ · Просмотры: 1
  • Время под стрелкой 2.jpg
    Время под стрелкой 2.jpg
    10.2 КБ · Просмотры: 0
  • Время под стрелкой 1.jpg
    Время под стрелкой 1.jpg
    11.2 КБ · Просмотры: 1
  • Screenshot 11-19-2021 10.17.15.jpg
    Screenshot 11-19-2021 10.17.15.jpg
    15.4 КБ · Просмотры: 1
  • Screenshot 11-19-2021 10.17.45.jpg
    Screenshot 11-19-2021 10.17.45.jpg
    15.1 КБ · Просмотры: 1
Последнее редактирование:

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Замените точку, пробел и двоеточие на "{RIGHT}" и отправляйте через Send
Сделал так:
Код:
Local $stTime = $oDen1 & "{RIGHT}" & $oMonth1 & "{RIGHT}" & $oYear1 & "{RIGHT}" & $oHour1 & "{RIGHT}" & $oMin1
; Local $stTime = $oDen1 & "{RIGHT}" & $oMonth1 & "{RIGHT}" & $oYear1 & "{RIGHT}" & $oHour1 & "{RIGHT}" & $oMin1 & "{TAB}" ; такой вариант для перехода на новую строку со второй датой
Local $endTime = $oDen2 & "{RIGHT}" & $oMonth2 & "{RIGHT}" & $oYear2 & "{RIGHT}" & $oHour2 & "{RIGHT}" & $oMin2
_UIA_ElementSetFocus($aTimes[1])
Send($stTime)
Send($endTime)

и получил тоже самое, если вставлять из буфера
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Значит, пользуйтесь тем, что работает.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Это набор примеров поиска различных объектов. Чтобы вы разобрались, что относительно чего искать и по каким параметрам. Сейчас не применяется, потом может понадобится.
Опять не могу разобраться что относительно чего искать. Кручусь возле того же списка, что и раньше. Только теперь задача получить все названия пунктов списка (видимо все UIA_TextControlTypeId в списке) и вторая - проверить значения всех чекбоксов, привести их к одному виду "Пометить"/"Снять пометку"
Пока только подобные идеи:
Код:
#include <Array.au3>

#include <UIAutomate.au3>

; главное окно
$oWnd = _UIA_GetElementFromHandle(WinGetHandle("Статистика ОДС 103"))
If @error Then ConsoleWrite("Главное окно не найдено" & @CRLF)

; вкладка со списком
$oTab = _UIA_GetControlTypeElement($oWnd, "UIA_TabItemControlTypeId", "Звіти, що налаштовуються")
If @error Then ConsoleWrite("Вкладка не найдена" & @CRLF)
   _ArrayDisplay($oTab, "$oTab")

; список
$oList = _UIA_GetControlTypeElement($oTab, "UIA_ListControlTypeId", "ReportListBox", "AutomationId")
If @error Then ConsoleWrite("Список не найден" & @CRLF)
   _ArrayDisplay($oList, "Список")
      _UIA_ElementMouseClick($oList)
   Send("{END}")

; пункты списка
$aListItems = _UIA_FindAllElements($oList, "ControlType", $UIA_ListItemControlTypeId)
If @error Then ConsoleWrite("Пункты списка не найдены" & @CRLF)
   _ArrayDisplay($aListItems, "$aListItems")  ; так массив по размеру соответствует числу пунктов в списке, но ячейки пустые

;Моя проба 1
Local $sItems[0]
For $i = 1 To $aListItems[0]
    Local $seeItems = _UIA_ElementGetPropertyValue($aListItems[$i], $UIA_NamePropertyId)
        _ArrayAdd($sItems, $seeItems)
 Next
 _ArrayDisplay($sItems, "Пункты") ; Получается массив с названиями в каждой ячейке значение типа: ReportsApp.Model.CustomReportsModule.CustomReportModel

; моя проба 2
 $aName = _UIA_ElementGetFirstLastChild($oList)
 If @error Then ConsoleWrite("Дети не найден" & @CRLF)
    _ArrayDisplay($aName, "$aName") ; две строки в массиве

Local $arrayName[0]
For $i = 0 To $aName[0]
   Local $oName = _UIA_ElementGetPropertyValue($aName[$i], $UIA_NamePropertyId)
   _ArrayAdd($arrayName, $oName)
Next
_ArrayDisplay($arrayName, "$arrayName") ; так в массиве одна ячейка со значением: ReportsApp.Model.CustomReportsModule.CustomReportModel

 ; моя проба 3 - текст конкретного пункта
$kText = _UIA_GetControlTypeElement($oList, "UIA_TextControlTypeId", "", "AutomationId")
If @error Then ConsoleWrite("Текст не найден" & @CRLF)
   ConsoleWrite($kText & @CR)  ; так ничего нет
   _ArrayDisplay($kText)       ; так ничего нет

$aListText = _UIA_FindAllElements($kText, "ControlType", $UIA_TextControlTypeId)
If @error Then ConsoleWrite("Пункты текста не найдены" & @CRLF)
   _ArrayDisplay($aListText, "$aListText") ; только одна пустая строка

; текст ДТП5
$oText = _UIA_GetControlTypeElement($oList, "UIA_TextControlTypeId", "ДТП5")
If @error Then ConsoleWrite("Текст не найден" & @CRLF)

; флажок текста ДТП5
$aPrevNext = _UIA_ElementGetPreviousNext($oText)
If @error Then
  ConsoleWrite("Предыдущий-следующий не найдены" & @CRLF)
Else
  $oCheck = $aPrevNext[0]
    _UIA_ElementDoDefaultAction($oCheck)
 EndIf

; моя проба 4
$oTexts = _UIA_FindAllElements($oWnd, "ControlType", $UIA_TextControlTypeId)
If @error Then ConsoleWrite("Список текстов не найден" & @CRLF)
;   _ArrayDisplay($oTexts, "$oTexts")

Local $sText[0]
For $i = 24 To $oTexts[0]

    $seeText = _UIA_ElementGetPropertyValue($oTexts[$i], $UIA_NamePropertyId)
    If $seeText <> "Журнали" Then
        _ArrayAdd($sText, $seeText)
     Else
        ExitLoop
   EndIf
 Next
 _ArrayDisplay($sText) ; так могу получить весь список, но это фактически вручную и зависит от конкретной ситуации, при изменении каких-либо текстов после нужного списка, придется заново все пересматривать.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Найдите в списке $oList все флажки и все тексты - получите два массива. Насколько я понимаю, количество элементов у них будет совпадать. Теперь в одном из массивов ищите нужное свойство и сопоставляйте с таким же индексом другого массива. Отметку флажка, вероятно, можно узнать по свойству "Toggle.ToggleState". Для переключения флажка пробуйте _UIA_ElementDoDefaultAction.
 

saraconor

Новичок
Сообщения
404
Репутация
3
Подскажите пожалуйста на примере банального блокнота, как прочесть то что находится в поле ввода? И как быть если в поле Name пустые кавычки?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <UIAutomate.au3>
ConsoleWrite(_UIA_ElementGetPropertyValue(_UIA_GetElementFromHandle(ControlGetHandle("[class:Notepad]", "", "Edit1")), "Value.Value") & @CRLF)
 

saraconor

Новичок
Сообщения
404
Репутация
3
Средствами UIAutomate... через програмку Inspect всмысле
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
через програмку Inspect
Это всего лишь информационная утилита. Изучайте:
 

rafzak

Новичок
Сообщения
27
Репутация
1
Здравствуйте, подскажите пожалуйста, есть ли какая нибудь более надёжная альтернатива в скрипте при открытии и копировании в буфер текста страницы в Chrome, без использования команд Send ("^a") и Send ("^c") ? Просто сохранить страницу в html не вариант.
Спасибо.
 
Последнее редактирование:

Ars42

Новичок
Сообщения
1
Репутация
0
del
 
Последнее редактирование:

lettterssino

Знающий
Сообщения
109
Репутация
10
Добрый день, подскажите что делать когда открываю UIAutomate.au3 для прочтения описания функций. То оно отображается некорректно
 

Вложения

  • Screenshot_3.png
    Screenshot_3.png
    86.8 КБ · Просмотры: 18
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Меню "File" - "Encoding". Выберите подходящую.
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Может кто подскажет, возможно сделать через данную библиотеку аналогично контрол клик или как нажать элемент, если он например будет скрыт в неактивном сеансе пользователя?
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "|LongDelayItem_NewItemButton", "AutomationId")
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Верх