Что нового

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

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток
Я теперь научился кликать по кнопке "Очистить историю", спасибо, - если данное окно уже открыто.
Код:
#include <GUIConstantsEx.au3>

Opt("WinTitleMatchMode", 2)

$hWnd = WinWait(" - Google Chrome", "", 3)
If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)

$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Очистить историю")
_UIA_ElementMouseClick($oElement)

И хотя это у меня получается, но если предварительно попробовать вызвать, необходимое окно настроек "Очистки истории" то код перестаёт работать :(

Код:
#include <GUIConstantsEx.au3>

Opt("WinTitleMatchMode", 2)

;~  пробую активировать окно Google Chrome 
WinActivate(" - Google Chrome")
;~ и открыть предварительно Окно настройки "Очистка истрии"
Send("+^{DEL}")
Sleep(1000)


$hWnd = WinWait(" - Google Chrome", "", 3)
If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)

$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Очистить историю")
_UIA_ElementMouseClick($oElement)

Хотя по отдельности каждый из участков кода - нормально работают
Код:
;~  пробую активировать окно Google Chrome 
WinActivate(" - Google Chrome")
;~ и открыть предварительно Окно настройки "Очистка истории"
Send("+^{DEL}")
Sleep(1000)


Что конфликтует и что этом случае предпринять, подскажите пожалуйста.



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

Ой сори - просто не закрыл скобку в названии библиотеки
Но появилась другая ошибка: в результате окно настроек истории открывается , а клика по кнопке "Очистить историю" нет :stars:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPISys.au3>

Opt("WinTitleMatchMode", 2)

;~  пробую активировать окно Google Chrome
WinActivate(" - Google Chrome")
;~ и открыть предварительно Окно настройки "Очистка истрии"
Send("+^{DEL}")
Sleep(5000)


$hWnd = WinWait(" - Google Chrome", "", 3)
If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)

$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Очистить историю")
_UIA_ElementMouseClick($oElement)



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

Поторопился, Вы чуть раньше разместили полный код, что позволяет избежать ошибки :shok:ops:
Вот как
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

$hWnd = WinActivate(" - Google Chrome")
;~ If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)

;~  пробую активировать окно Google Chrome
WinActivate(" - Google Chrome")
;~ и открыть предварительно Окно настройки "Очистка истрии"

Send("+^{DEL}")
Sleep(5000)

$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Очистить историю") ; элемент
$aRect = _UIA_ElementGetBoundingRectangle($oElement) ; экранные координаты элемента
If IsArray($aRect) Then
  $iX = ($aRect[2] - $aRect[0]) / 2 ; середина ширины элемента
  $iY = ($aRect[3] - $aRect[1]) / 2 ; середина высоты элемента
  MouseMove($aRect[0] + $iX, $aRect[1] + $iY, 0) ; смещение мыши в середину элемента с учётом левого верхнего угла элемента
;~   Send("{SHIFTDOWN}") ; нажатие Shift
  MouseClick("left") ; клик в текущие координаты курсора
;~   Send("{SHIFTUP}") ; отпускание Shift
EndIf
Sleep(1000)
MsgBox(0, "Сообщение","История очищена")

Пожалуй возникает только 1 вопрос, связанный с кликом по выпадающему списку: чтобы выбрать период очистки. inspect - не хочет корректно название отражать. Потому не понятно как кликнуть, как выбрать...
 

Вложения

  • Ошибка 2.png
    Ошибка 2.png
    115 КБ · Просмотры: 38
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
как кликнуть, как выбрать
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

$hWnd = WinActivate(" - Google Chrome")
;~ If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)

Send("+^{DEL}")

$oParent = _UIA_GetElementFromHandle($hWnd)
_UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Очистить историю")
$oListItem = _UIA_GetControlTypeElement($oParent, "UIA_ListItemControlTypeId", "за все время", "Value.Value")
_UIA_ElementDoDefaultAction($oListItem)
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Очистить историю")
_UIA_ElementDoDefaultAction($oButton)

Sleep(1000)
MsgBox(0, "Сообщение","История очищена")
 

dr.room

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

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
не пойму почему
Потому что любят в Google менять элементы на разных версиях. Для версий 47 и 48 - уберите параметр "Value.Value"
Код:
$oListItem = _UIA_GetControlTypeElement($oParent, "UIA_ListItemControlTypeId", "за все время")
 

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
любят в Google менять ...
За предупреждение спасибо - забэкаплю ка я свой GoogleChromePortable 48
А так - всё работает, всё ок.


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

Ps
Можно пару вопросов (как всегда :smile:) ? :
[list type=decimal]
[*]Что означает "Value.Value" ?
[*]За клик отвечает _UIA_ElementDoDefaultAction ?
[*]Почему не удается кликнуть с помощью _UIA_ElementGetBoundingRectangle ?
[/list]
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
Что означает "Value.Value"
Это свойство, значением которого в версии Chrome 43 была строка "за все время". В версиях 47 и 48 это значение стало у свойства "Name" (см. левую часть списка Inspect).

За клик отвечает _UIA_ElementDoDefaultAction ?
У каждого "нажимного" объекта (кнопка, ссылка, элемент списка, пункт меню) есть, так называемое, "действие по умолчанию" (Default Action). Именно это действие выполняет элемент, когда по нему кликают мышью. Функция _UIA_ElementDoDefaultAction() "заставляет" элемент выполнить это действие.

Почему не удается кликнуть с помощью _UIA_ElementGetBoundingRectangle ?
Потому что так сделали разработчики. Координаты вы можете получить только для ComboBox. А для пунктов выпавшего списка разработчики определение координат не предусмотрели. На странице разработки chromium так и указано "IAccessibleEx and UI Automation (very limited)" - очень ограниченно. Не думаю, что в Google будут дорабатывать автоматизацию, ведь им это не выгодно, т.к. автоматизация не предполагает просмотр рекламы.
 

dr.room

Новичок
Сообщения
283
Репутация
0
спасибо.
InnI сказал(а):
У каждого "нажимного" объекта (кнопка, ссылка, элемент списка, пункт меню) есть, так называемое, "действие по умолчанию" (Default Action)
В таком случае - команда _UIA_ElementDoDefaultAction есть урезанный по функционалу аналог команды _UIA_ElementGetBoundingRectangle

Вот пример ранее разобранной ссылки "YouTube"
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

$hWnd = WinActivate(" - Google Chrome")
;~ If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)


$oParent = _UIA_GetElementFromHandle($hWnd) ; родитель
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_TextControlTypeId", "YouTube") ; элемент

_UIA_ElementDoDefaultAction($oElement)
;$aRect = _UIA_ElementGetBoundingRectangle($oElement) ; экранные координаты элемента
;~ If IsArray($aRect) Then
;~   $iX = ($aRect[2] - $aRect[0]) / 2 ; середина ширины элемента
;~   $iY = ($aRect[3] - $aRect[1]) / 2 ; середина высоты элемента
;~   MouseMove($aRect[0] + $iX, $aRect[1] + $iY, 0) ; смещение мыши в середину элемента с учётом левого верхнего угла элемента
;~   Send("{SHIFTDOWN}") ; нажатие Shift
;~   MouseClick("left") ; клик в текущие координаты курсора
;~   Send("{SHIFTUP}") ; отпускание Shift
;~ EndIf
Вот только с зажатым Shift это не пройдёт, видимо :smile:

InnI сказал(а):
это значение стало у свойства "Name"
Плохо я, видимо, знаю Inspect :( - как не старался, не нашол
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
урезанный по функционалу аналог
Вы сравниваете тёплое с мягким и не понимаете разницы. Вам нужно изучить понятие "объект", а также научиться отличать его свойства от методов.

с зажатым Shift это не пройдёт
Вообще никак не пройдёт. У текста нет понятия "действие по умолчанию".

как не старался, не нашЁл
В ранее приложенном вами скриншоте зелёным выделено
Name: "за все время"
 

dr.room

Новичок
Сообщения
283
Репутация
0
... а кроме того я плохо знаю Inspect, можно пару вопросов?
[list type=decimal]
[*]Как на время отключить мониторинг объектов в программе а потом включить
[*]Как Вы определяете окно в коде - по "родителю" окна? т.е. в дереве вложений в левом окне Inspect?
Код:
$hWnd = WinWait(" - Google Chrome", "", 3)

[*]Где можно почитать детально о Inspect
[/list]
Заранее спасибо
 

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток, InnI
Хотелось немного уточнить об функции получения дескриптора окна _UIA_GetElementFromHandle
Правильно ли я понимаю что пока окно отдавшего дескриптор не будет закрыто, скрипт будет учитывать этот дескриптор. Причем - переходы внутри этого окна: не изменят ситуации
И чтобы исключить накладки, до тех пор нужно давать уникальные имена переменным, использующих разные дескрипторы, при условии что функция _UIA_GetElementFromHandle повторяется в скрипте.
Спасибо
Я ничего не напутал случайно ? :stars:
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
Я ничего не напутал случайно ?
Вы напутали всё и совсем не случайно. Сейчас попробую объяснить.

Вы пытаетесь сравнить зелёный цвет и громкий звук. В результате у вас получается зелёный звук и громкий цвет. И между этими, несовместимыми в принципе, понятиями вы ещё пытаетесь найти аналогии. Поймите, на этом форуме вам покажут, как поменять зелёный цвет на красный и сделать звук тише. Но объяснять базовые понятия цвета и звука никто не будет. Тем более в этой специализированной теме. Даже если я сейчас начну объяснять вам, как находить оттенки зелёного, вы меня просто не поймёте, т.к. пока ещё не знаете не только понятие зелёного, но и не можете отличить цвет от звука.
 

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
пока ещё не знаете
Это точно - потому и путаю, по той же причине - и спрашиваю обо всём :smile:
Может есть какая нить книжечка о дескрипторах (понятная, на Ваш взгляд, для новичка ), я понимаю что общие вопросы потребуют слишком обширных ответов ? :(



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

Не подскажете как можно с AutoIt - закрыть вкладки справа в Google Chrome, при помощи функции?
С условием, что исходная вкладка – любая.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
закрыть вкладки справа в Google Chrome
Кликаете по вкладке правой клавишей мыши, во всплывающем меню выбираете "Закрыть вкладки справа".

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

dr.room

Новичок
Сообщения
283
Репутация
0
InnI сказал(а):
Нет такой вкладки "любая".
Сори - возможно не правильно выразился.
Вот пример (моя первая функция :smile:)
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.14.2
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPISys.au3>
#include <UIAutomate.au3>

Opt("WinTitleMatchMode", 2)

MsgBox(32,"Запрос на продолжение","Начать ?  (для видимого эффекта - откройте пожалуйста несколько вкладок... ")

 Klikmouse()

Func Klikmouse() ; Закрывает вкладки справа - начиная от первой вкладки:
 WinActivate("- Google Chrome")

;~   правый клик: иначе не вызовешь контекстное меню - а с кликом нужны и координаты
;~   а очень хотелось бы чтобы вместо указания координат вкладки  - скрип распознавал  как-то её  по типу объекта
;~   это и давало бы возможность вызывать контекстное меню без координат, что означает имхо "клик по любой вкладке скриптом"
;~   видимо правильнее сказать "без привязки к координатам вкладки"
MouseClick("right", 95,10, 1)
;~   ждём всплывающее меню
WinWait("[ Class : Chrome_WidgetWin_2]")
;~  левый клик, снова по координатам  а не по кнопке....
MouseClick("left", 291,223, 1)


EndFunc
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dr.room
Закрытие вкладок справа от текущей (активной)
Код:
#include <UIAutomate.au3>

Opt("WinTitleMatchMode", 2)

$hWnd = WinActivate(" - Google Chrome")
If Not $hWnd Then Exit ConsoleWrite("!> Окно браузера не найдено" & @CRLF)

$oParent = _UIA_GetElementFromHandle($hWnd) ; окно браузера
$oTab = _UIA_GetControlTypeElement($oParent, "UIA_TabItemControlTypeId", True, "SelectionItem.IsSelected") ; активная вкладка
_UIA_ElementMouseClick($oTab, "right") ; клик ПКМ
$oItem = _UIA_WaitControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Закрыть вкладки справа") ; пункт меню
If _UIA_ElementGetPropertyValue($oItem, "IsEnabled") Then ; если пункт доступен
  _UIA_ElementMouseClick($oItem) ; клик ЛКМ
Else ; если справа нет вкладок (пункт заблокирован)
  Send("{ESC}") ; закрываем меню
EndIf
 

dr.room

Новичок
Сообщения
283
Репутация
0
Доброго времени суток.
На примере Google Chrome - на странице между её элементами переходить можно перемещаясь с помощью Shift+ Tab. Его особенностью есть то что последний выбранный элемент запоминается - и последующий переход начинается от последнего. А как с помощью AutoIt - попросить отчитывать старт следующего перехода не от последнего выбранного элемента а от самого первого ?
В обычной ситуации помогает только сброс фокуса, кликом мышки в не активной области страницы.
Если можно, любой простой пример, пожалуйста.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
[box title=Предупреждение]
dr.room
Каким боком ваш вопрос касается темы UIAutomate - автоматизация нестандартных элементов GUI :mad:
Если вы ещё раз будете мусорить в этой теме, отправлю вас отдохнуть на недельку.

InnI
Вы же не первый день на форуме.[/box]
 
Верх