Русское сообщество AutoIt

Общий раздел по AutoIt => Автоматизация IE и Web-интерфейса => Тема начата: mr.Gbabak от Январь 08, 2017, 11:39:59

Название: Клик по элементу, получить значение элемента в IE
Отправлено: mr.Gbabak от Январь 08, 2017, 11:39:59
Добрый день.
Итак, возник вопрос, а возможно ли кликнуть по элементу (ссылка, кнопка) в IE, и потом получить ее URL, name, value и.т.д?
Цель: сделать  простейший мультибокс .
Название: Re: Клик по элементу, получить значение элемента в IE
Отправлено: mr.Gbabak от Январь 08, 2017, 19:04:35
Появилась мысль транслировать Url на другие окна, вот таким способом:

Код: AutoIt [Выделить]
#include <IE.au3>
#include <Array.au3>
#include <File.au3>
#include <UIAutomate.au3>
#include <WinAPIProc.au3>


HotKeySet("{Tab}", "TPause")
HotKeySet("{esc}", "vyx")


Global $Paused, $tUrl, $sUrl





$iPID1 = Run("C:\Program Files\Internet Explorer\iexplore.exe -noframemerging -private") ; IE10/11 -noframemerging -private
ProcessWait($iPID1)
$hWnd1 = _WinAPI_EnumProcessWindows($iPID1)
WinWaitActive($hWnd1[1][0])
$oIE1 = _IEAttach($hWnd1[1][0], "hwnd")


$iPID2 = Run("C:\Program Files\Internet Explorer\iexplore.exe -noframemerging -private") ; IE10/11 -noframemerging -private
ProcessWait($iPID2)
$hWnd2 = _WinAPI_EnumProcessWindows($iPID2)
WinWaitActive($hWnd2[1][0])
$oIE2 = _IEAttach($hWnd2[1][0], "hwnd")

$iPID3 = Run("C:\Program Files\Internet Explorer\iexplore.exe -noframemerging -private") ; IE10/11 -noframemerging -private
ProcessWait($iPID3)

$hWnd3 = _WinAPI_EnumProcessWindows($iPID3)
WinWaitActive($hWnd3[1][0])
$oIE3 = _IEAttach($hWnd3[1][0], "hwnd")



While 1

    $sUrl = _IEPropertyGet($oIE1, "locationurl")
    Sleep(200)

    ConsoleWrite($sUrl & @CRLF)
    If $sUrl <> $tUrl Then

        _IENavigate($oIE2, $sUrl)
        _IENavigate($oIE3, $sUrl)

        $tUrl = $sUrl

    EndIf
WEnd





Func TPause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('Script is "Paused"', 0, 0)
    WEnd
    ToolTip("")
EndFunc   ;==>TPause

Func vyx()
    ToolTip("Good Buy", 0, 0)
    Sleep(1000)
    Exit

EndFunc   ;==>vyx
 


но, после третьего посещения каких-либо страниц, перестает считываться текущий URL.
Где я не прав?
Название: Re: Клик по элементу, получить значение элемента в IE
Отправлено: mr.Gbabak от Январь 10, 2017, 21:55:52
В общем, идея не понравилась, нашелся более простой способ и эффективный способ через через библиотеку UIAutomate, при обычной навигации работает стабильно

Код: AutoIt [Выделить]
$oParent = _UIA_GetElementFromHandle($hCtrl1)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адреса и поиск", 'name', true)
$URL = _UIA_ElementGetPropertyValue($oElement, "ValueValue")

   

но, изначально данный проект затачивался под мультибоксинг, поэтому необходимо изменять URL на "лету", делая замену сессии.
Код: AutoIt [Выделить]
While 1

        $oParent = _UIA_GetElementFromHandle($hCtrl1)
        $oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адреса и поиск", 'name', True)
        $url = _UIA_ElementGetPropertyValue($oElement, "ValueValue")

        If $url <> $tUrl Then

            $rURL1 = StringRegExpReplace($url, $vedushiy, $vedom1)

            $rURL2 = StringRegExpReplace($url, $vedushiy, $vedom2)
            ConsoleWrite($rURL1 & @CRLF)

            WinWaitActive($hWnd2[1][0])
            $oIE2 = _IEAttach($hWnd2[1][0], "hwnd")
            _IENavigate($oIE2, $rURL1, 0)
            If @error Then ConsoleWrite(@error & @CRLF)

            WinWaitActive($hWnd3[1][0])
            $oIE3 = _IEAttach($hWnd3[1][0], "hwnd")
            _IENavigate($oIE3, $rURL2, 0)

            $tUrl = $url

        EndIf
        Sleep(20)
    WEnd

в результате вылетает с ошибкой "C:\Program Files (x86)\AutoIt3\Include\IE.au3" (272) : ==> The requested action with this object has failed.:
$oObject.navigate($sUrl)
$oObject^ ERROR


полный код скрипта
(нажмите для показа/скрытия)

Название: Re: Клик по элементу, получить значение элемента в IE
Отправлено: InnI от Январь 10, 2017, 22:27:27
mr.Gbabak
Цитировать
более простой способ
Узнать текст строки адреса IE
Код: AutoIt [Выделить]
$sURL = ControlGetText("[class:IEFrame]", "", "Edit1")
ConsoleWrite($sURL & @CRLF)


Осуществить переход, используя строку адреса
Код: AutoIt [Выделить]
ControlSetText("[class:IEFrame]", "", "Edit1", "autoit-script.ru")
ControlSend("[class:IEFrame]", "", "Edit1", "{enter}")

Название: Re: Клик по элементу, получить значение элемента в IE
Отправлено: mr.Gbabak от Январь 11, 2017, 06:44:25
Как всегда есть еще более простое и элегантное решение.
Название: Re: Клик по элементу, получить значение элемента в IE
Отправлено: InnI от Январь 11, 2017, 13:26:16
mr.Gbabak
Если я правильно понял
(нажмите для показа/скрытия)