Сложно сказать... Я проверяю на стационаре Win7 x86, Chrome 40.0.2214.91 m. Проблем с кнопкой не наблюдаю.Может от этого зависеть?
Send("iqoption.ru{enter}")
; ожидание загрузки
$UIA_DefaultWaitTime = 0
_UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "8 800 333 47 55")
;~ _UIA_WaitControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Открыть счет", Default, True)
;~ _UIA_WaitControlTypeElement($oParent, "UIA_DocumentControlTypeId", "Брокер бинарных опционов", Default, True)
; нажатие кнопки "Вход"
_UIA_ElementDoDefaulAction(_UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Войти", Default, True))
Chrome не поддерживает прямую установку текста в эти поля. Поэтому варианта два:по букве с клавиатуры вводят(медленно)
Opt("SendKeyDownDelay", 0)
Opt("SendKeyDelay", 0)
; регистрация
_UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Авторизация")
_UIA_ElementSetFocus(_UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "E-mail"))
;~ Send("[email protected]")
ClipPut("[email protected]")
Send("+{ins}")
_UIA_ElementSetFocus(_UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Пароль"))
;~ Send("password")
ClipPut("password")
Send("+{ins}")
_UIA_ElementDoDefaulAction(_UIA_GetControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", " Запомнить меня"))
_UIA_ElementDoDefaulAction(_UIA_WaitControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Войти"))
InnI сказал(а):Обновление до версии 1.1:
- добавлена функция _UIA_ElementGetPreviousNext() для поиска предыдущего и следующего элементов того же уровня
- добавлена возможность вывода ошибок в консоль: глобальный переключатель $UIA_ConsoleWriteError (включён по умолчанию)
- в CUIAutomation2.au3 добавлены директивы #Au3Stripper_Off и #Au3Stripper_On для идентификаторов свойств и типов
$oPreviosnext=_UIA_ElementGetPreviousNext($i) $Previos=_UIA_ElementGetPropertyValue($oPreviosnext[0],"Name")
MsgBox("","", $Previos)
Если $i - это элемент (объект), то всё правильно. В противном случае в консоле SciTE должна быть ошибка: _UIA_ElementGetPreviousNext : параметр не является объектом.что я не правильно делаю?
Предыдущий/следующий элемент для пункта меню "Вид" всплывающего меню рабочего стола Windows 7пример по функции _UIA_ElementGetPreviousNext()
#include "UIAutomate.au3"
WinMinimizeAll()
MouseClick("right", 0, 0, 1, 0)
$oParent = _UIA_GetElementFromHandle(WinWait("[class:#32768]"))
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", "Вид")
If Not IsObj($oElement) Then Exit
$oPreviousNext = _UIA_ElementGetPreviousNext($oElement)
If IsObj($oPreviousNext[0]) Then
ConsoleWrite(_UIA_ElementGetPropertyValue($oPreviousNext[0], "Name") & @CRLF)
Else
ConsoleWrite("= Предыдущий элемент отсутствует =" & @CRLF)
EndIf
If IsObj($oPreviousNext[1]) Then
ConsoleWrite(_UIA_ElementGetPropertyValue($oPreviousNext[1], "Name") & @CRLF)
Else
ConsoleWrite("= Следующий элемент отсутствует =" & @CRLF)
EndIf
WinMinimizeAllUndo()
#include "UIAutomate.au3"
WinMinimizeAll()
Opt("WinTitleMatchMode", 2)
Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
$hWnd = WinWait(" - Google Chrome", "", 5)
If Not $hWnd Then Exit
$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адресная строка и строка поиска")
_UIA_ElementMouseClick($oElement)
Send("iqoption.ru{enter}")
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Войти", Default, True, 0) ; ожидание загрузки
_UIA_ElementDoDefaulAction($oElement)
Sleep(2000)
$oElement1=_UIA_GetControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", " Запомнить меня")
If IsObj($oElement1) Then
MsgBox("","","нашли обьект-запомнить меня")
endif
$oPreviousNext = _UIA_ElementGetPreviousNext($oElement1)
If IsObj($oPreviousNext[0]) Then
ConsoleWrite(_UIA_ElementGetPropertyValue($oPreviousNext[0], "Name") & @CRLF)
Else
ConsoleWrite("= Предыдущий элемент отсутствует =" & @CRLF)
EndIf
If IsObj($oPreviousNext[1]) Then
ConsoleWrite(_UIA_ElementGetPropertyValue($oPreviousNext[1], "Name") & @CRLF)
Else
ConsoleWrite("= Следующий элемент отсутствует =" & @CRLF)
EndIf
WinMinimizeAllUndo()
Потому что их нет. В данной функции предыдущий/следующий - это элементы одного уровня вложенности. Например (см. вложение). Для поля "Пароль" предыдущим будет поле "E-mail", а следующим - пустой элемент. Этот пустой элемент является родительским по отношению к флажку "Запомнить меня", а следующим для него будет пустой элемент, который является родителем для кнопки "Войти". Но ни у флажка ни у кнопки нет предыдущего/следующего - они единственные в своём уровне вложенности.предыдущий и следующий обьекты не находит
Если Inspect ни в одном свойстве эти цифры не отображает, то считать их не получится.цифры которые нужно считать
Не обязательно искать элемент по имени. Можно искать почти по любому другому свойству, которые отображает Inspect. Например, поле для ввода пароля можно найти такне знаю name
_UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", True, "IsPassword")
Уверен, что размером и/или положением точно отличается. К тому же в имени может быть уникальный символ, например %, которого нет у других элементов. Можно ещё найти все элементы с одинаковым свойством-значением и по индексу полученного массива обратиться к нужному (если они всегда создаются в определённом порядке).кроме имени ничем не отличается
В сторону Internet Explorer. Либо самостоятельно разбирать POST и GET запросы. Примеров на форуме много.в какую сторону смотреть
Если это такое же окно, как и регистрация, то оно только выглядит, как всплывающее. На самом деле оно находится в общем дереве объектов страницы, но, вероятно, ниже. А так как поиск производится до первого совпадения, то вы получаете объект самой страницы, а не этого "окна".во всплывающем окне
#include "UIAutomate.au3"
Opt("WinTitleMatchMode", 2)
Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe www.iqoption.ru --force-renderer-accessibility")
$hWnd = WinWait(" - Google Chrome", "", 5)
If Not $hWnd Then Exit
$oParent = _UIA_GetElementFromHandle($hWnd)
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Войти", Default, True, 20)
_UIA_ElementDoDefaulAction($oElement)
_UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Авторизация")
$aAllElements = _UIA_FindAllElements($oParent)
For $i = 1 To $aAllElements[0]
If _UIA_ElementGetPropertyValue($aAllElements[$i], "Name") = " Запомнить меня" Then
ConsoleWrite(_UIA_ElementGetPropertyValue($aAllElements[$i - 2], "Name") & @CRLF)
ConsoleWrite(_UIA_ElementGetPropertyValue($aAllElements[$i + 2], "Name") & @CRLF)
ExitLoop
EndIf
Next
Не обязательно искать элемент по имени. Можно искать почти по любому другому свойству, которые отображает Inspect. Например, поле для ввода пароля можно найти так
Код: AutoIt [Выделить]
_UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", True, "IsPassword")
Попробуйте найти такое свойство, которое отличает нужный вам элемент от других.
Интерфейс такое предусматривает, но в UDF данный функционал не реализован. В качестве аналога сделана функция _UIA_FindElementsInArray(). Другими словами, сначала вы ищете элементы с использованием _UIA_FindAllElements(), которая предполагает одну пару свойство-значение. Затем фильтруете полученный массив через _UIA_FindElementsInArray(), которая тоже ищет одну пару свойство-значение, но уже с возможностью частичного совпадения значения. После этого, при необходимости, опять фильтруете уже частично отсеянный массив через _UIA_FindElementsInArray() и так до тех пор, пока не останутся только нужные элементы.сразу по нескольким свойствам
Func _UIA_PropertyCondition($PropertyId, $PropertyValue)
Local $pCondition
$objUIAutomation.CreatePropertyCondition($PropertyId, $PropertyValue, $pCondition)
If Not $pCondition Then Return SetError(1, @error, 0)
Return SetError(0, 0, $pCondition)
EndFunc
Func _UIA_AndCondition(ByRef $pCondition_1, ByRef $pCondition_2)
If Not ($pCondition_1 Or $pCondition_2) Then Return SetError(1, 0, 0)
Local $pCondition
$objUIAutomation.CreateAndCondition($pCondition_1, $pCondition_2, $pCondition)
If Not $pCondition Then Return SetError(2, @error, 0)
Return SetError(0, 0, $pCondition)
EndFunc ;==>_UIA_AndCondition
Func _UIA_FirstElement_ByCondition(ByRef $oUIElement, $pCondition)
If Not (IsObj($oUIElement) Or $pCondition) Then Return SetError(1, 0, 0)
Local $pUIElement
$oUIElement.FindFirst($TreeScope_Subtree, $pCondition, $pUIElement)
If Not $pUIElement Then Return SetError(2, @error, 0)
Local $oUIElementOut = ObjCreateInterface($pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
If Not IsObj($oUIElementOut) Then Return SetError(3, 0, 0)
Return SetError(0, 0, $oUIElementOut)
EndFunc ;==>_UIA_GetFirstElement_ByCondition
Local $p1 = _UIA_PropertyCondition($UIA_ControlTypePropertyId, $UIA_ButtonControlTypeId)
Local $p2 = _UIA_PropertyCondition($UIA_NamePropertyId, 'Закрыть')
Local $p = _UIA_AndCondition($p1, $p2)
Local $close_button = _UIA_FirstElement_ByCondition($oElement, $p)
Не было необходимости. _UIA_FindElementsInArray() прекрасно заменяет данный функционал. Возможно, проигрывает в скорости, зато проще в понимании.чего бы вам не реализовать
Реализовать не сложно. Сложно объяснить пользователю, что такое Condition и как им пользоваться. А если делать, то нужно и OR и NOT добавлять. К тому же данные должны быть строго типизированы, что непривычно для AutoIt. Нет поддержки частичного совпадения (а для имён очень часто это необходимо). И вот осознав всё это я сделал простенькую фильтрацию через _UIA_FindElementsInArray().это же не сложно
Не то, чтобы нет желания... Скорее нет понимания необходимости дублирования функционала. Тем более дублирования с усложнением для пользователя. Потом могут быть вопросы вроде "Если это можно сделать при помощи одной этой функции, зачем нужны вот эти три?"если будет желание