Что нового

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

Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
тестирую код отдельно - то работает то нет
Кнопка иногда меняет текст с "4 830 Мне понравилось" на "Видео понравилось вам и ещё 4 830 пользователям". Поэтому оставьте только слово "понравилось"
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "понравилось", Default, True) ; элемент
Если не поможет - создавайте отдельную тему, выкладывайте код и вывод в консоль, когда код не работает.
 

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток, InnI

InnI сказал(а):
Кнопка иногда меняет текст
Пока еще не тестировал, только только ознакомился с Вашими наблюдениями. (Кстати - а как заметили скрытую причину? :smile:) Но - скорее всего так и есть. Попозже отпишусь о результатах...

Если позволите - есть еще 1 вопрос
Нет ли возможности произвести поиск гиперссылки, с кликом по найденной - в заданном квадрате?
Спасибо за помощь
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
произвести поиск гиперссылки, с кликом по найденной - в заданном квадрате
Гиперссылка имеет тип ControlType
Код:
$UIA_HyperlinkControlTypeId = 0xC355


Вариант 1.
Находите все ссылки, определяете их координаты, проверяете - попала ли ссылка в нужный вам "квадрат".

Вариант 2.
При помощи функции _UIA_GetElementFromPoint() определяете элемент в нужной точке и проверяете - ссылка это или нет.
 

dr.room

Новичок
Сообщения
283
Репутация
0
Ок - вижу, есть возможность.
Нельзя ли привести пример её реализации - в силу ограниченной подготовки,анализ кода: единственно надежный пока способ познания для новичка (т.е. мну :smile: )
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
Вот пример нахождения ссылки под курсором мыши: Ответ #7 (под спойлером). Вместо координат курсора подставьте координаты нужной вам точки.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
наличие определенного текста на странице
Код:
$Text = "определённый текст"
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", $Text, "Name", True)
If IsObj($oElement) Then ConsoleWrite("Текст найден" & @CRLF)
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Если кому интересно, то изменил поведение при некорректном значении версии элемента. Теперь, для удобства отладки, фиксируется ошибка, вместо создания элемента по умолчанию. Версию UDF не менял. Соответственно отредактировал сообщение об обновлении Ответ #157.
 

dmitryrnd

Новичок
Сообщения
3
Репутация
0
Добрый день!
Возник такой вопрос: возможно ли по каким-либо признакам элементов определить, что достигнуто "дно" страницы при скроллинге? Планировал определять это по местоположению индикатора прокрутки на полосе прокрутки браузера, но утилита Inspect не идентифицирует его отдельно от всей полосы прокрутки.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dmitryrnd
Для IE можно узнать процент прокрутки (от 0 до 100)
Код:
$oElement = _UIA_GetElementFromHandle(ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1"))
ConsoleWrite(_UIA_ElementGetPropertyValue($oElement, "Scroll.VerticalScrollPercent") & @CRLF)


Для Firefox нужно знать самый нижний элемент на странице и, когда он появляется в зоне видимости (IsOffscreen:false), значит достигнут конец страницы.

Для Chrome можно также, как и для Firefox, но Chrome не обновляет состояние элементов при прокрутке. Поэтому нужно после каждой прокрутки обновлять страницу, тогда и состояние элементов обновится.
 

vyatdima

Новичок
Сообщения
2
Репутация
0
Есть 3,4,5... "дочек" у родителя. С помощью функции _UIA_ElementGetFirstLastChild получаем первую и последнюю "дочку". Как получить объекты дочек между первой и последней? Другого способа, как получить кол-во элементов первой дочки, прибавить это значение и +1, получив индекс "второй" дочки и т.д. далее по циклу, перебрав всех "дочек" - никак? Нет функции, выдающей массив всех дочек "первого поколения"? Можно конечно Инспектом подсчитать нужный индекс и использовать его в массиве... Кто как поступает?
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
vyatdima
Как получить объекты дочек между первой и последней?
Можно в цикле перебирать дочерние от первого или от последнего
Код:
_UIA_ElementGetPreviousNext()

Если у дочерних нет собственных дочерних, то можно от родительского
Код:
_UIA_FindAllElements($oParent)

А при наличии "внуков", можно так
Код:
_UIA_FindAllElementsEx($oParent, Default, $TreeScope_Children)
В двух последних случаях получите массивы.
 

Tyrelio

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

Не могли бы вы привести пример поиска нескольких элементов на странице в хроме? Если конкретнее, на странице есть таблица с элементами BS2G и BS3G (на данном скрине всего 2 BS2G), мне надо найти координаты каждой BS2G и скопировать соотв. значение из столбца dn. Сейчас поиск организован через поиск строки в самом хроме (ctrl+F + BS2G), далее нахожу оранжевый цвет и далее выхожу на нужную позицию. Но поиск по цвету занимает очень много времени, да и код дюже большой выходит. Инспектором определяются так UIA_TextControlTypeId (0xC364) BS2G, т.е мне надо найти все элементы со значением BS2G и их координаты. Помогите пожалуйста, потому что у меня все это занимает кучу времени из-за поиска по цвету, а с поиском нескольких элементов ранее не сталкивался, даже не знаю к какой функции можно обратиться :(
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Tyrelio
на данном скрине
Куда смотреть-то?

через поиск строки в самом хроме
Если при загрузке страницы нужный вам элемент будет за пределами видимости, то его координаты будут нулевые.

найти все элементы со значением BS2G и их координаты
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

; Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
$hWnd = WinWait(" - Google Chrome", "", 3)
If Not $hWnd Then Exit

$oParent = _UIA_GetElementFromHandle(ControlGetHandle($hWnd, "", "Chrome_RenderWidgetHostHWND1"))
$aText = _UIA_FindAllElements($oParent, "ControlType", $UIA_TextControlTypeId)
If IsArray($aText) Then $aBS2G = _UIA_FindElementsInArray($aText, "Name", "BS2G")
Global $aCoords[$aBS2G[0]][4]
If IsArray($aBS2G) Then
  For $i = 1 To $aBS2G[0]
    $aRect = _UIA_ElementGetBoundingRectangle($aBS2G[$i])
    For $j = 0 To 3
      $aCoords[$i - 1][$j] = $aRect[$j]
    Next
  Next
EndIf

#include <Array.au3>
_ArrayDisplay($aCoords)
 

Tyrelio

Новичок
Сообщения
2
Репутация
0
Cпасибо большое, это именно то, что нужно :ok: :beer:
 

Sabat0n

Новичок
Сообщения
1
Репутация
0
Сабж. Пол-дня просидел, но так и не смог реализовать.
Имеем: две вкладки хрома. В одной открыт вк, в другой почта.
Если в вк появилось сообщение (цифра 1), то далее нужно переключиться на вторую вкладку с почтой и перевести курсор мышки в заданную точку( на кнопку отправить).
И все это в цикличном режиме (раз в 30 секунд).
 

astanid

Новичок
Сообщения
38
Репутация
0
Не могу разобраться как используя эти библиотеки заполнить форму в хроме :(
https://www.supremenewyork.com/checkout
Как перенести курсор в поле ввода имени ? (дальше можно табом перемещаться)
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "order_billing_name")
_UIA_ElementMouseClick($oElement)

full name и т.д. Очевидно я плохо понимаю логику работы библиотеки :(
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
astanid
По вашей ссылке вместо "\checkout" я попадаю на страницу "\shop", на которой нет полей ввода.
Убедитесь, что Chrome запущен с параметром "--force-renderer-accessibility".
Какую ошибку выводит UIAutomate в консоли SciTE?
Возможно, будут ещё вопросы, поэтому лучше создайте отдельную тему с информацией, которую отображает Inspect по полю Edit.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Обновление до версии 1.6:
- устранены утечки памяти по причине некорректной работы с условиями
- для функции _UIA_ElementMouseClick() дополнительно отслеживаются ошибки функции MouseClick и выхода координат за пределы элемента; курсор теперь остаётся в точке клика
- для функции _UIA_GetElementFromPoint() добавлены умолчания: координаты курсора мыши
- функция _UIA_GetFocusedElement() переименована в _UIA_GetElementFromFocus()
 

astanid

Новичок
Сообщения
38
Репутация
0
Как узнать выделен или нет чекбокс ?
Код:
$q="A detailed work history"

$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", $q)
;_UIA_ElementMouseClick($oElement)

Если на элемент кликнуть - он отмечается (подсвечивается). Как это определить ? код элемента

Код:
 <label class="oOptLbl">
                                    <input type="checkbox" name="answers[a]" class="optInput" id="answers_a" />                                    <pre class="np">Complete your projects on time and as promised</pre>
                                </label>
                            </div>
 
Верх