Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
InnI [?]
можно прочитать только весь текст целиком в свойствах Name или Value.Value
Этого я и боялся.
Мне просто интересно, как это делают другие приложения, типа babylon, что они используют для получения выделенного текста, неужели б.обмена? :scratch:
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
CreatoR
типа babylon, что они используют для получения выделенного текста
Судя по наличию функции InvokeOcrProc в captlib.dll, а также утилиты BabylonChromeOcrExt.exe и папки [email protected], в большинстве случаев работа идёт через OCR. Причём не с выделенным текстом ведётся работа, а инверсное выделение рисуется поверх обрабатываемого текста. Но это всё мои предположения.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Пока приходится выкручиваться так:

Код:
#include <ClipBoard.au3>
#include <SendMessage.au3>
#include <MouseOnEvent.au3>

Global $aMPos = MouseGetPos()
Global $bSelected = False

HotKeySet('{ESC}', '_Exit')
_SetMouseEvents(True)

While 1
	If $bSelected Then
		$bSelected = False
		_SetMouseEvents(False)
		
		$aOld_Clip = _ClipBoard_Remember()
		ClipPut('')
		
		Send('^{INS}')
		$iTimer = TimerInit()
		
		Do
			$sSelText = ClipGet()
			
			If $sSelText <> '' Then
				ExitLoop
			EndIf
			
			Sleep(10)
		Until TimerDiff($iTimer) > 250
		
		_ClipBoard_Restore($aOld_Clip)
		
		If $sSelText Then
			ToolTip($sSelText, Default, Default, 'Selected', 1)
			AdlibRegister('_ClearToolTip', 3000)
		EndIf
		
		_SetMouseEvents(True)
	EndIf
	
	Sleep(10)
WEnd

Func _Exit()
	Exit
EndFunc

Func _ClearToolTip()
	AdlibUnRegister('_ClearToolTip')
	ToolTip('')
EndFunc

Func _SetMouseEvents($bSet)
	_MouseSetOnEvent_RI($MOUSE_PRIMARYDOWN_EVENT, ($bSet ? '_MousePrimaryDown_Event' : ''))
	_MouseSetOnEvent_RI($MOUSE_PRIMARYUP_EVENT, ($bSet ? '_MousePrimaryUp_Event' : ''))
	_MouseSetOnEvent_RI($MOUSE_PRIMARYDBLCLK_EVENT, ($bSet ? '_MousePrimaryUp_Event' : ''))
EndFunc

Func _MousePrimaryDown_Event()
	$aMPos = MouseGetPos()
EndFunc

Func _MousePrimaryUp_Event($iEvent)
	Local $aMPos_Tmp = MouseGetPos()
	
	If $iEvent = $MOUSE_PRIMARYDBLCLK_EVENT Or ($iEvent <> $MOUSE_PRIMARYDBLCLK_EVENT And ($aMPos_Tmp[0] <> $aMPos[0] Or $aMPos_Tmp[1] <> $aMPos[1])) Then
		$bSelected = True
	EndIf
EndFunc

Func _ClipBoard_Remember()
	Local $iFormat, $hWnd = GUICreate('')
	
	If Not _ClipBoard_Open($hWnd) Then
		Return SetError(1)
	EndIf
	
	Local $aRet[1][2]
	
	Do
		$iFormat = _ClipBoard_EnumFormats($iFormat)
		
		If $iFormat <> 0 Then
			$aRet[0][0] += 1
			ReDim $aRet[$aRet[0][0] + 1][2]
			$aRet[$aRet[0][0]][1] = $iFormat
		EndIf
	Until $iFormat = 0
	
	_ClipBoard_Close()
	GUIDelete($hWnd)
	
	For $i = 1 To $aRet[0][0]
		$aRet[$i][0] = _ClipBoard_GetData($aRet[$i][1])
	Next
	
	Return $aRet
EndFunc

Func _ClipBoard_Restore(ByRef $aClip)
	If UBound($aClip, 0) <> 2 Then
		Return SetError(1)
	EndIf
	
	For $i = 1 To $aClip[0][0]
		_ClipBoard_SetData($aClip[$i][0], $aClip[$i][1])
	Next
	
	$aClip = 0
	
	Return 1
EndFunc


MouseOnEvent.au3
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
OffTopic:
CreatoR
Я думаю Sleep() в цикле не помешает - для разгрузки процессора.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
OffTopic:
InnI [?]
у вас загрузка процессора уменьшилась?
Намёк понял :smile:.
Я не везде проставил паузу, но не в этом суть, это просто пример, я же пользуюсь этим в цикле где ещё есть и обработка GUIGetMsg, а там как известно пауза не нужна.
 

dmitryrnd

Новичок
Сообщения
3
Репутация
0
Подскажите, существует ли расширенная документация с описанием списка передаваемых параметров и возвращаемых значений для каждой из функций?
 

dmitryrnd

Новичок
Сообщения
3
Репутация
0
ra4o сказал(а):
Здесь autoit-script.ru/autoit3_docs/functions/ достаточно расширенная документация ?
В данной документации нет описания функций UIAutomate, поэтому и возник такой вопрос.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
В данной документации нет описания функций UIAutomate
простите, не понял сразу , что речь идёт о функциях именно этой библиотеки.В той ссылке только описание "стандартных" библиотек, а "UIAutomate.au3" не является "стандартной" библиотекой AutoIt .
Автор этой UDF - InnI , смотрите описание функций в самой библиотеке, там всё описано на русском языке .
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
dmitryrnd
существует ли расширенная документация
В виде отдельного файла - нет. Описание параметров, возвращаемых значений, а также некоторые примечания даны в самом au3-файле перед каждой функцией.
 

vaf

Новичок
Сообщения
190
Репутация
2
На странице имеется несколько UIA_EditControlTypeId, как выбрать нужный по его имени и заполнить его ?

Буду очень благодарен за небольшой пример заполнения страницы http://buy.110km.ru/cars/add/
не обязательно всех, но некоторых
UIA_CheckBoxControlTypeId
UIA_EditControlTypeId

Пробовал как в примере
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Выберите марку")
_UIA_ElementMouseClick($oElement)
Send("ВАЗ")

не работает, в чем ошибка ?
Код:
; Демонстрация автоматизации Chrome версии 40

#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

; Данные регистрации
Global $sLogin = "User"
Global $sPassword = "12345"

; Если Chrome не запущен - Запуск Chrome с параметром --force-renderer-accessibility
; При отсутствии этого параметра доступ к элементам страницы будет запрещён
If ProcessExists ("chrome.exe") = 0 Then Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
$hWnd = WinWait(" - Google Chrome", "", 60) ; Ждем 60 секунд
If Not $hWnd Then Exit

$oParent = _UIA_GetElementFromHandle($hWnd) ; Создание новую вкладку с использованием дескриптора окна

; Поиск кнопки с именем "Новая вкладка" и клик по ней
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Новая вкладка")
_UIA_ElementMouseClick($oElement)

; Поиск строки адреса и клик по ней
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адресная строка и строка поиска")
_UIA_ElementMouseClick($oElement)

; Переход по URL дать объявление
Send("buy.110km.ru/cars/add/{enter}")

; Ожидание загрузки страницы по наличию элемента "Основная информация"
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Основная информация")

; Поиск элемента для ввода "Выберите марку"
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Выберите марку")
_UIA_ElementMouseClick($oElement)
Send("ВАЗ")


HEPL - помогите !!!
 
Автор
I

InnI

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

и заполнить его
Если элемент поддерживает прямую установку текста, то _UIA_ElementTextSetValue(), иначе Send().

пример заполнения страницы
Для каждого браузера свои особенности реализации.

Во-первых, вы ожидаете загрузки элемента "Основная информация" и переходите к работе с другим элементом, который может быть ещё не загружен (как в вашем случае). Другими словами, обнаружение элемента, находящегося вверху страницы, ещё не означает загрузку всей страницы.
Во-вторых, элемент "Выберите марку" в Chrome имеет тип "Text" (а вот в FireFox, правильно, Edit). Поэтому замените тип элемента и ваш пример будет работать
Код:
; Поиск элемента для ввода "Выберите марку"
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Выберите марку")
_UIA_ElementMouseClick($oElement)
Send("ВАЗ")

В-третьих, когда вы захотите кликнуть в элемент, находящийся за пределами видимости (например, "Тип двигателя"), то в Chrome у вас ничего не получится, т.к. он не возвращает координаты для элементов за пределами текущей видимости. Даже если этот элемент прокрутить в видимую зону.
OffTopic:
И не нужно так кричать. Для помощи нужно время. А я всё-таки на работе ;)
 

vaf

Новичок
Сообщения
190
Репутация
2
А можно активировать элемент по BoundingRectangle ?, т.к. некоторые элементы отличаются только этим, все остальное одинаково
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
vaf
активировать элемент по BoundingRectangle
Код:
_UIA_ElementGetBoundingRectangle()
возвращает массив координат элемента "левый верхний угол - правый нижний угол" относительно экрана. Делайте с ними, что хотите.

отличаются только этим
А ещё элементы отличаются последовательностью создания (как instance в AutoIt).
Находите все, например Edit, и кликаете в нужный по порядку, используя его индекс в массиве
Код:
_UIA_FindAllElements()
Порядковый номер определяется опытным путём.
 

vaf

Новичок
Сообщения
190
Репутация
2
_ArrayDisplay(_UIA_FindAllElements($oParent), "") выявил 1544 элемента. было бы здорово если бы утилита Inspect подсвечивала все элементы и проставляла бы в квадратике их номера в массиве.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
vaf
выявил 1544 элемента
Потому что вы нашли ВСЕ элементы. Если бы вы указали конкретное "свойство-значение", их было бы значительно меньше.

если бы утилита Inspect
Данная утилита разработана в Microsoft. Я к ней отношения не имею. К тому же в интерфейсе UIAutomation нет понятия порядкового номера. Кому нужно считает сам по индексу массива.
 

JRay

Новичок
Сообщения
4
Репутация
0
Друзья, помогите разобраться, не могу понять что не так. Пишу что-то типа живого поиска. Смысл в том что есть список слов для поиска. Во время листания сайта скрипт должен находить в зоне видимости ссылку содержащую поисковое слово и "подсвечивать" её прямоугольником или подводить туда мышку.
Все реализовано и работает, но есть проблема:
Не всегда скрипт видит объект (в данном случае ссылку) когда она есть на экране. "Видимость" объекта определял по координатам, но когда фактически ссылка в зоне видимости есть скрипт отдает координаты 0,0,0,0. А свойство этого объекта isOffScreen=true.
Но если перейти по этой ссылке и вернуться назад то скрипт безошибочно определяет её координаты и свойство isOffScreen адекватно показывает наличие или отсутствие объекта на экране.
При том когда координаты объекта получить не удается, функция _UIA_ElementDoDefaultAction отрабатывает с этим объектом без проблем.
Такое происходит только в Хроме, в ФФ все работает без проблем, но в силу определенных обстоятельств я могу использовать только хром.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
JRay
Такое происходит только в Хроме
Именно в этом и проблема. Хром не обновляет свойства элементов при прокрутке - только при обновлении страницы.
 
Верх