Что нового

Как связать TrayTip и не удачное событие с UIAutomate.au3

dr.room

Новичок
Версия AutoIt: 3.
3.3.14.2
Описание:
Всем доброго времени суток.
Предположим нужно кликнуть по кнопке. Но это не удалось по какой-то причине. Есть ли способ вывести в сообщение TrayTip
а) сообщение об ошибке клика
б) указать точно имя элемента, по которому клик не реализован
Примечания:
Исключительно для подстраховки, так как на практике не исключены ошибки или просто форс мажор...спасибо
 

InnI

AutoIT Гуру
Код:
_UIA_ElementMouseClick($oElement)
If @error Then TrayTip("", "Ошибка клика по элементу " & _UIA_ElementGetPropertyValue($oElement, "Name"), 0)
 
Автор
D

dr.room

Новичок
Спасибо
Не могу понять, почему окно сообщения смог вывести только после развернутого описания оператора if
Код:
If @error Then
	 If @error Then TrayTip("", "Ошибка клика по элементу " & _UIA_ElementGetPropertyValue($oElement, "Name"), 0)
EndIf

2
Код:
If @error Then
 MsgBox (64,"Внимание ","Обнаружена ошибка клика по элементу" & _UIA_ElementGetPropertyValue($oElement, "Name"), 0)
EndIf


Но и это не полностью решило мою проблему: в сообщениях выводится не "имя элемента" а "0" (скрины )
 

Вложения

InnI

AutoIT Гуру
dr.room
в сообщениях выводится не "имя элемента" а "0"
Чтобы узнать имя элемента - он должен существовать. Например, в функции _UIA_ElementMouseClick() вы можете узнать имя, если возникла ошибка "клик за пределы элемента" или ошибка в функции MouseClick (некорректную клавишу указали). А если вы изначально передаёте в функцию НЕ объект, то и имя его, естественно, не узнаете.
 
Автор
D

dr.room

Новичок
Большое спасибо. Кажется я понимаю, что в случае необходимости получения более информативного сообщения чем просто "0" мне нужно не выполнение клика проверять а именно наличие элемента, выбранного для клика. Не подскажете, как это можно реализовать. ?
 

InnI

AutoIT Гуру
Описание ошибок функции _UIA_ElementMouseClick()
Код:
_UIA_ElementMouseClick($oElement)
If @error Then _GetError($oElement, @error)

Func _GetError($Obj, $Err)
  Local $Str, $Name
  If $Err > 1 Then $Name = _UIA_ElementGetPropertyValue($Obj, "Name")
  Switch $Err
    Case 1
      $Str = "первый параметр не является объектом"
    Case 2
      $Str = "ошибка создания массива координат области элемента " & $Name
    Case 3
      $Str = "координаты клика выходят за пределы элемента " & $Name
    Case 4
      $Str = "ошибка выполнения функции MouseClick для элемента " & $Name
  EndSwitch
  TrayTip("Error", $Str, 0)
EndFunc
 
Автор
D

dr.room

Новичок
Е ! Всё получилось!! Большое спасибо
Если не сложно: есть ли возможность как-то "по-юзеровски" интерпретировать выводимые предупреждения. Например "первый параметр не является объектом", мне кажется, можно заменить на "Эй, приятель, похоже что или браузер крашанулся или просто инет пропал"

По поводу имени кнопки: может тогда применять заранее поиск нужного слова на странице, чтобы предупреждать что именно не удастся кликнуть.?
 

InnI

AutoIT Гуру
dr.room
мне кажется, можно заменить на
Ну и замените. В чём проблема?

применять заранее поиск нужного слова на странице, чтобы предупреждать что именно не удастся кликнуть
Естественно, чтобы кликнуть сначала элемент нужно найти. Каждая функция возвращает ошибки. Проверяйте на наличие ошибки функцию поиска и предупреждайте
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Открыть")
If @error Then
  TrayTip("Error", "Кнопка с именем 'Открыть' не найдена", 0)
Else
  _UIA_ElementMouseClick($oElement)
  If @error Then _GetError($oElement, @error)
EndIf
 
Автор
D

dr.room

Новичок
в знаниях....
Мне казалось, просто, есть способ автоматически как-то определить значение "Имя" в _UIA_GetControlTypeE и передать в его в сообщение. А стоп - так это же можно, по видимому, создать переменную и присвоить ей как значение, имя кнопки, а потом просто использовать переменную....
Спасибо
 
Автор
D

dr.room

Новичок
По моему так можно ?
на https://www.google.ru/
Код:
$hWnd = WinActivate(" - Google Chrome")
$oParent = _UIA_GetElementFromHandle($hWnd) 
$Text = "Войти"
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_HyperlinkControlTypeId", $Text) 
_UIA_ElementDoDefaultAction($oElement)
If @error Then MsgBox (262192,"Упс","Похоже, не получилось кликнуть по кнопке" & @CRLF &  $Text )

У меня только вопрос относительно самой переменной $Text Если она не глобальная, не локальная а самая обычная: значит скрипт применив её - "забудет" её название и параметры и я смогу применить это же название ($Text) и для другой кнопки (для удобства масштабирования) ?
 

InnI

AutoIT Гуру
dr.room
Таких переменных не бывает. Есть глобальные и локальные. Если вы не указываете область видимости, то AutoIt сам примет решение. В данном случае $Text будет глобальной (если это не фрагмент функции). А глобальные переменные не "забываются". Но вы можете изменить её значение в любом месте скрипта.
 
Автор
D

dr.room

Новичок
Цель - просто избежать конфликтов. Я попробовал - вроде как работает для 2-х кнопок подряд и пока ничего не произошло ...
Код:
$hWnd = WinActivate(" - Google Chrome")
$oParent = _UIA_GetElementFromHandle($hWnd) 
$Text = "Войти"
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_HyperlinkControlTypeId", $Text) 
_UIA_ElementDoDefaultAction($oElement)
If @error Then MsgBox (262192,"Упс","Похоже, не получилось кликнуть по кнопке" & @CRLF &  $Text )

Sleep(2000)
$hWnd = WinActivate(" - Google Chrome")
$oParent = _UIA_GetElementFromHandle($hWnd) 
$Text = "ДАЛЕЕ"
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", $Text) 
_UIA_ElementDoDefaultAction($oElement)
If @error Then MsgBox (262192,"Упс","Похоже, не получилось кликнуть по кнопке" & @CRLF &  $Text )
также я не буду (надеюсь не забыть этого) использовать уникальные имена переменных в других местах скрипта (для других задач). Но возможно этого мало...
Значит ли что мне обязательно придется брать клик под функцию, или в начале скрипта объявить ряд переменных именно как локальные ? Я надеюсь что не запутался окончательно... :stars:
 

inververs

AutoIT Гуру
dr.room
Вам нужно сделать свою функцию - адаптер, назовите ее _ChromeClickButtonByText($sButtonText)
Внутрь этой функции поместите весь код для клика:
Код:
Func _ChromeClickButtonByText($sButtonText)
	Local $hWnd = WinActivate(" - Google Chrome")
	Local $oParent = _UIA_GetElementFromHandle($hWnd) 
	Local $oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", $sButtonText) 
	_UIA_ElementDoDefaultAction($oElement)
	If @error Then MsgBox (262192,"Упс","Похоже, не получилось кликнуть по кнопке" & @CRLF &  $sButtonText )
	Return True
EndFunc

Вот так, вы избавились от глобальной переменной $TEXT, весь код который вы бы вынуждены дублировать поместили в функцию, и познакомились с локальными переменными.

Ну а как вызывать эту функцию, надеюсь вам подсказывать не нужно ;)
 
Автор
D

dr.room

Новичок
inververs
Спасибо - похоже что это может стать решением проблемы
Я еще не пробовал писать функцию - адаптер и поэтому, если позволите, всего несколько уточняющих вопросов :smile:
1. Перед каждым вызовом функции _ChromeClickButtonByText мне все равно ведь придется присвоить значение переменной $sButtonText (под имя кнопки). Какова её будет видимость ?
2. У кнопок бывает различный тип: как оптимально это учесть?
Код:
UIA_HyperlinkControlTypeId
UIA_ButtonControlTypeId
UIA_TextControlTypeId

Спасибо
 

inververs

AutoIT Гуру
dr.room
_ChromeClickButtonByText('Войти')
2. Другую функцию нужно которая не учитывает тип контрола.
 
A

Alofa

Гость
OffTopic:
dr.room сказал(а):
... Какова её будет видимость ?..
Код:
Global $sVariable = 'Значение №1' ; 1) Объявляем переменную $sVariable в глобальной области видимости и задаем значение

_ChromeClickButtonByText($sVariable) ; 2) Вызываем пользовательскую функцию и передаем ей параметр

MsgBox(4096 + 64, '3)', 'После того как вышли из функции' & @LF & 'переменная $sVariable = ' & $sVariable)

; Тело пользовательской функции:
Func _ChromeClickButtonByText($sVariable)
	; В данном случае $sVariable это не Глобально объявленная переменная в самом начале скрипта,
	; это лишь одноименная переменная в Локальной области видимости - переносчик переданного в
	; функцию параметра. (ИЗБЕГАЙТЕ ПОДОБНЫХ КАЗУСОВ)
	; При выходе из функции эта $sVariable перестанет существовать, а с глобальной sVariable ничего не случится.
	MsgBox(4096 + 64, '1)', $sVariable)
	$sVariable = 'Изменяем значение на №2' ; Именно "Изменяем". Попробуйте явно переОбъявить здесь одноименную переменную и поймаете ошибку
	MsgBox(4096 + 64, '2)', $sVariable)
EndFunc   ;==>_ChromeClickButtonByText
 

InnI

AutoIT Гуру
dr.room
У кнопок бывает различный тип
Код:
Func _ChromeClickButtonByName($sControlType, $sButtonName)
  _UIA_ElementDoDefaultAction(_UIA_GetControlTypeElement(_UIA_GetElementFromHandle(WinActivate(" - Google Chrome")), $sControlType, $sButtonName))
  If @error Then MsgBox(262192, "Упс", "Похоже, не получилось кликнуть по кнопке " & @CRLF & $sControlType & " : " & $sButtonName)
EndFunc
Первый параметр функции - тип "кнопки", второй - её имя.
Вызывать так
Код:
_ChromeClickButtonByName("UIA_HyperlinkControlTypeId", "Войти")
Sleep(2000)
_ChromeClickButtonByName("UIA_ButtonControlTypeId", "ДАЛЕЕ")
 
Автор
D

dr.room

Новичок
Спасибо огромное за идею и реализацию - inververs и InnI !
Теперь все :ok: (а казалось мне невероятным)
Код уменьшился в из-за устранения копи_пасте и читабельные во много раз
Если можно - еще вопрос об именах, используемых не полностью
Будет ли всё же правильно создать для них отдельную функцию (считая особым случаем) или как-то объединить в одну общую?
Код:
_ChromeClickButtonByName_mini("$sControlType", "$sButtonName")

  _UIA_ElementDoDefaultAction(_UIA_GetControlTypeElement(_UIA_GetElementFromHandle(WinActivate(" - Google Chrome")), $sControlType, $sButtonName, Default, True))


Alofa
Боюсь, я запутался в Вашем коде: напишите, пожалуйста, комментарий.
 

InnI

AutoIT Гуру
dr.room
Третий параметр - полное/частичное совпадение имени, четвёртый - вывод сообщения об ошибке
Код:
_ChromeClickButtonByName("UIA_HyperlinkControlTypeId", "Войти") ; частичное совпадение имени с диалогом ошибки
Sleep(2000)
_ChromeClickButtonByName("UIA_ButtonControlTypeId", "ДАЛЕЕ", True, False) ; частичное совпадение имени без диалога ошибки
Sleep(2000)
_ChromeClickButtonByName("UIA_ButtonControlTypeId", "Готово", False) ; полное совпадение имени с диалогом ошибки

Func _ChromeClickButtonByName($sControlType, $sButtonName, $fInStr = True, $fShowMsg = True)
  _UIA_ElementDoDefaultAction(_UIA_GetControlTypeElement(_UIA_GetElementFromHandle(WinActivate(" - Google Chrome")), $sControlType, $sButtonName, Default, $fInStr))
  If @error And $fShowMsg Then MsgBox(262192, "Упс", "Похоже, не получилось кликнуть по кнопке " & @CRLF & $sControlType & " : " & $sButtonName)
EndFunc
 
Автор
D

dr.room

Новичок
Похоже что это - идеально. Большое спасибо
 
Верх