Что нового

Как отловить клик по скриптовой ссылке в IE ?

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Требуется отловить выполнение клика и его идентификация .
Здесь пример с двумя Вэб-страничками, имеющими подобные ссылки.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <GuiEdit.au3>

_IEErrorHandlerRegister()

$h_GUI=GUICreate("", 1000, 780)
GUICtrlCreateMenu("")
$id_RU=GUICtrlCreateMenuItem("http://autoit-script.ru/autoit3_docs/libfunctions/_arrayadd.htm", -1)
$id_EN=GUICtrlCreateMenuItem("https://www.autoitscript.com/autoit3/docs/libfunctions/_ArrayAdd.htm", -1)
$oIE = _IECreateEmbedded()    
GUICtrlCreateObj($oIE, 5, 5, 990, 730)
_IENavigate($oIE, "www.google.ca")
$Status= GUICtrlCreateInput('', 5, 740, 990, 20, $ES_READONLY)

GUISetState()

While 1
    $nMsg=GUIGetMsg()
    Switch  $nMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $id_RU, $id_EN
           _IENavigate($oIE, GUICtrlRead($nMsg, 1))
        Case $GUI_EVENT_PRIMARYDOWN 
            _GetExamleData($h_GUI)
   EndSwitch
WEnd

Func  _GetExamleData($hWnd)
    If ControlGetFocus($hWnd) <> 'Internet Explorer_Server1' Then Return
    $sClipData=ClipGet()
	If Not $sClipData Then Return
    ; ?????????????

EndFunc


Сами ссылки это вроде :
Код:
$oLink.href="javascript:ClipBoard(.*?);"  ; для русского сайта

и :
Код:
$oLink.href=$sURL &  '#')                     ; для англ. сайта

ExamleData это вроде :
Код:
$oLink.document.getElementById('copytext' &$i).innerText ; для англ. сайта


но как корректно отловить само нажатие и идентифицировать не разумею
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz,
Кажется, Viktor1703 делал когда-то UDF GUIHtml. Не могу найти эту тему на форуме. Нечто похожее у него реализовано. Если не найдете, как я, то вот она: GUIHtml
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles сказал(а):
gregaz,
Кажется, Viktor1703 делал когда-то UDF GUIHtml. Не могу найти эту тему на форуме. Нечто похожее у него реализовано. Если не найдете, как я, то вот она: GUIHtml

С трудом , но нашел тему через Гугль http://autoit-script.ru/index.php?topic=8198.0;nowap
Спасибо попробую разобраться
 

InnI

AutoIT Гуру
Сообщения
4,947
Репутация
1,443
gregaz
Вариант с использованием UIAutomate

Код:
Func  _GetExamleData($hWnd)
    If ControlGetFocus($hWnd) <> 'Internet Explorer_Server1' Then Return
    $sClipData=ClipGet()
    If Not $sClipData Then Return
    ; ?????????????
    Local $oElement = _UIA_GetElementFromPoint(MouseGetPos(0), MouseGetPos(1))
    ConsoleWrite(_UIA_ElementGetPropertyValue($oElement, "LegacyIAccessibleName") & @CRLF)
    ConsoleWrite(_UIA_ElementGetPropertyValue($oElement, "LegacyIAccessibleValue") & @CRLF)
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz,
Посмотрите еще 5-ый пример к функции
Код:
_IEHeadInsertEventScript()



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

gregaz,
Вроде, так работает.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <GuiEdit.au3>

_IEErrorHandlerRegister()

ClipPut('')
$h_GUI = GUICreate('', 1000, 780)
GUICtrlCreateMenu('')
$id_RU = GUICtrlCreateMenuItem('http://autoit-script.ru/autoit3_docs/libfunctions/_arrayadd.htm', -1)
$id_EN = GUICtrlCreateMenuItem('https://www.autoitscript.com/autoit3/docs/libfunctions/_ArrayAdd.htm', -1)
$oIE = _IECreateEmbedded()
GUICtrlCreateObj($oIE, 5, 5, 990, 730)
$oEventObject = ObjEvent($oIE, 'IEEvent_', 'DWebBrowserEvents')
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $id_RU, $id_EN
			_IENavigate($oIE, GUICtrlRead($nMsg, 1))
	EndSwitch
WEnd

Func _Evt_onClick()
	Local $s_Href, $s_Txt, $o_Link = @COM_EventObj

	$s_Href = $o_Link.href
	ConsoleWrite('Click to href: ' & $s_Href & @LF)
	$s_Txt = ClipGet()
	If $s_Txt Then
		ConsoleWrite('ClipGet:' & @LF)
		ConsoleWrite('===================================' & @LF)
		ConsoleWrite($s_Txt & @LF)
		ConsoleWrite('===================================' & @LF)
		ClipPut('')
	EndIf
EndFunc   ;==>_Evt_onClick

Func IEEvent_NavigateComplete($s_URL)
	Local $o_Links, $s_LinkId

	ConsoleWrite('IE has finished loading URL: ' & $s_URL & @LF)
	$o_Links = _IELinkGetCollection($oIE)
	For $o_Link In $o_Links
		$s_LinkId = _IEPropertyGet($o_Link, 'uniqueid')
		_IEHeadInsertEventScript($oIE, $s_LinkId, 'onclick', '')
		ObjEvent($o_Link, '_Evt_')
	Next
EndFunc   ;==>IEEvent_NavigateComplete
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
InnI сказал(а):
gregaz
Вариант с использованием UIAutomate
у меня не работает. Срабатывает _IEErrorHandlerRegister() . Возможно что-то с утилитой Inspect. Хотя у меня 8-ка.
Но UDF интересная, надо будет ознакомиться подробнее. Все же для этой тривиальной задачи это лишние телодвижения. Во всяком случае спасибо.

madmasles сказал(а):
Вроде, так работает

Да вроде то,что нужно. Только в чем необходимость использования ф-ии : _IEHeadInsertEventScript. Она ведь добавляет в страницу Ява-скрипт.?
Я попробовал так :
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <GuiEdit.au3>

_IEErrorHandlerRegister()

ClipPut('')
$h_GUI = GUICreate('', 1000, 780)
GUICtrlCreateMenu('')
$id_RU = GUICtrlCreateMenuItem('http://autoit-script.ru/autoit3_docs/libfunctions/_arrayadd.htm', -1)
$id_EN = GUICtrlCreateMenuItem('https://www.autoitscript.com/autoit3/docs/libfunctions/_ArrayAdd.htm', -1)
$oIE = _IECreateEmbedded()
GUICtrlCreateObj($oIE, 5, 5, 990, 730)
$Status= GUICtrlCreateInput('', 5, 740, 990, 20, $ES_READONLY)
$oEventObject = ObjEvent($oIE, 'IEEvent_', 'DWebBrowserEvents')

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $id_RU, $id_EN
            _IENavigate($oIE, GUICtrlRead($nMsg, 1))
    EndSwitch
WEnd

Func IEEvent_NavigateComplete($sURL)
	$oLinks = _IELinkGetCollection($oIE)
    For $oLink In $oLinks
		;  $s_LinkId = _IEPropertyGet($o_Link, 'uniqueid')
        ;_IEHeadInsertEventScript($oIE, $s_LinkId, 'onclick', '')
		If (StringInStr($oLink.href, '#') And StringInStr($oLink.href, $sURL)) Or StringInStr($oLink.href, "javascript:clipboard();")  Then   
			ObjEvent($oLink, '_Evt_')
		EndIf
	Next
EndFunc

Func _Evt_onClick()
    Local $olink  = @COM_EventObj
    GUICtrlSetData($Status, $oLink.href)
    $sClipBoard=ClipGet()
    If $sClipBoard Then
        ToolTip( ClipGet())
		ClipPut('')
    EndIf
EndFunc

Ограничил используемые ссылки и убрал добавление Явы.
Возникла другая проблема. При использовании нижней ссылки в русском варианте Выдается содержимое буфера, имевшееся до нажатия ссылки.
Видимо там на сервере не срабатывает Ява-скрипт, т.е. ссылка нерабочая. А выдается предыдущее содержимое буфера. Где-то надо предварительно очищать буфер, но где-пока не нашел



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

Наверное надо обнулять при наведении курсора на ссылку
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz [?]
При использовании нижней ссылки в русском варианте
У меня на этой странице ни в одном браузере не копируется код. Похоже, там на сервере или в коде страницы ошибка.

в чем необходимость использования ф-ии : _IEHeadInsertEventScript
Я особо не разбирался, просто скопировал код из справки. :smile:
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
может быть так :
Код:
Func IEEvent_StatusTextChange($Text)
  ; If ClipGet () Then ClipPut('')
EndFunc


Некорректное решение не позволяет использование буфера для других задач
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
В результате получилось так. Насколько это корректно?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <GuiEdit.au3>

_IEErrorHandlerRegister()

$h_GUI = GUICreate('', 1000, 780)
GUICtrlCreateMenu('')
$id_RU = GUICtrlCreateMenuItem('http://autoit-script.ru/autoit3_docs/libfunctions/_arrayadd.htm', -1)
$id_EN = GUICtrlCreateMenuItem('https://www.autoitscript.com/autoit3/docs/libfunctions/_ArrayAdd.htm', -1)
$oIE = _IECreateEmbedded()
GUICtrlCreateObj($oIE, 5, 5, 990, 730)
$Status= GUICtrlCreateInput('', 5, 740, 990, 20, $ES_READONLY)
$oEventObject = ObjEvent($oIE, 'IEEvent_', 'DWebBrowserEvents')

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $id_RU, $id_EN
            _IENavigate($oIE, GUICtrlRead($nMsg, 1))
    EndSwitch
WEnd

Func IEEvent_NavigateComplete($sURL)
    $oLinks = _IELinkGetCollection($oIE)
    For $oLink In $oLinks
        If (StringInStr($oLink.href, '#') And StringInStr($oLink.href, $sURL)) Or StringInStr($oLink.href, "javascript:clipboard();")  Then   
		   ObjEvent($oLink, '_Evt_')
	   EndIf
    Next
EndFunc

Func _Evt_onClick()
   Local $olink  = @COM_EventObj
    GUICtrlSetData($Status, $oLink.href)
    $sClipBoard=ClipGet()
    If $sClipBoard Then
        ToolTip( ClipGet())
        ClipPut('')
    EndIf
EndFunc

;Func IEEvent_StatusTextChange($Text)  Это некорректно
  ; If ClipGet () Then ClipPut('')
;EndFunc


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

madmasles сказал(а):
gregaz [?]
Наверное надо обнулять при наведении курсора на ссылку
А если обнулять в функции IEEvent_NavigateComplete?

Нет в функции IEEvent_NavigateComplete не обнуляется

!!!!! Вопрос предварительной очистки буфера остается открытым, т.к. мое решение некорректно (очищает буфер при любом проведении курсора по IE, не позволяя использовать буфер для других задач)


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

Решил проблему выводом неисправной ссылки из действия. Неработа ссылки объясняется чувствительностью ява-скрипта к регистру символов (javascript:clipboard(); и javascript:ClipBoard();) .Кстати это различие имеется только в функциях UDF. В нативных функциях различия нет и обе ссылки работают.

Последний рабочий вариант :

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <GuiEdit.au3>

_IEErrorHandlerRegister()

$h_GUI = GUICreate('', 1000, 780)
GUICtrlCreateMenu('')
$id_RU = GUICtrlCreateMenuItem('http://autoit-script.ru/autoit3_docs/libfunctions/_arrayadd.htm', -1)
$id_EN = GUICtrlCreateMenuItem('https://www.autoitscript.com/autoit3/docs/libfunctions/_ArrayAdd.htm', -1)
$oIE = _IECreateEmbedded()
GUICtrlCreateObj($oIE, 5, 5, 990, 730)
$Status= GUICtrlCreateInput('', 5, 740, 990, 20, $ES_READONLY)
$oEventObject = ObjEvent($oIE, 'IEEvent_', 'DWebBrowserEvents')
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $id_RU, $id_EN
            _IENavigate($oIE, GUICtrlRead($nMsg, 1))
	EndSwitch
WEnd

Func IEEvent_NavigateComplete($sURL)
	Local $oLinks = _IELinkGetCollection($oIE)
    For $oLink In $oLinks
		If StringRegExp($oLink.href, '(javascript:ClipBoard\(\);|' &$sURL & '#)')  Then  	
			ObjEvent($oLink, '_Evt_')
		EndIf
	Next
EndFunc

Func _Evt_onClick()
	Local $olink, $sClipBoard
	$olink  = @COM_EventObj
	GUICtrlSetData($Status, $oLink.href)
    $sClipBoard=ClipGet()
    If $sClipBoard Then
		ToolTip( ClipGet())
        ClipPut('')
    EndIf
EndFunc

А очищать буфера из-за нерабочей ссылки наверное некорректно.
Всем, принявшим участие, спасибо
 
Верх