Что нового

[Сеть, интернет] Что находит _IEFrameGetCollection ?

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Вот такой нехитрый скрипт
Код:
#include <IE.au3>
$oIE = _IECreate("http://autoit-script.ru/",1)
$oFrames = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended
If @error Then
	ConsoleWrite("Нет фреймов на этой странице"&@CR)
	Exit
Else
	ConsoleWrite($iNumFrames & " фреймов на этой странице"&@CR)
EndIf
For $i = 0 to ($iNumFrames - 1)
    $oFrame = _IEFrameGetCollection ($oIE, $i)
    ConsoleWrite("Фрейм "&$i&@CR)
    MsgBox(0, "Frame Info", _IEPropertyGet ($oFrame, "outerHTML"))
Next


Что же находит _IEFrameGetCollection ?
Почему все попытки обратиться к этому найденному приводят к ошибке?
Самое главное: как всё же определить - есть фреймы на странице или нет?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
На странице 2 фрейма, вы же их нашли через $iNumFrames = @extended.
Другое дело, что эти 2 фрейма подгружают в себя скриптами рекламу гугла, которая загружается в свои собственные фреймы, доступ к которым, вы так просто не получите, т.к. они будут принадлежать уже другому домену отличному от autoit-script.ru. И любое стандартное обращение будет вызывать ошибку Отказано в доступе.
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Но если я что-то ищу на странице и
Код:
$sText = _IEBodyReadText ($oIE)
$pos=StringInStr($sText,$substring)

результатов не дал.
То я начинаю искать по фреймам.
Как тогда избежать ошибки, если я не знаю что там в _IEFrameGetCollection и
любое стандартное обращение будет вызывать ошибку Отказано в доступе.
?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Когда вы начинаете искать по фреймам, то через библиотеку IE.au3 вы только сможете работать с фреймами принадлежащими только тому же домену, что и объект oIE. Если же вы через рекурсию захотите вести поиск во всех фреймах, то получите ошибку Отказано в доступе. Если нужно искать текст вообще везде, даже в чужих фреймах, то вам нужно сперва получить к ним доступ, но в IE.au3 нет такого функционала.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH,
Можно примерно так попробовать.
Код:
#include <IE.au3>
#include <Array.au3>
;без проверок на ошибки.

_IEErrorHandlerRegister()

$sUrl = 'http://autoit-script.ru/'

$oIE = _IECreate($sUrl)

$oFrames = _IETagNameGetCollection($oIE, 'iframe')
Dim $aFrames[@extended + 1][2]
For $oFrame In $oFrames
	$oObj = $oFrame.contentWindow.document
	$oFrames_1 = _IETagNameGetCollection($oObj, 'iframe')
	For $oFrame_1 In $oFrames_1
		$aFrames[0][0] += 1
		$aFrames[$aFrames[0][0]][0] = $oFrame_1.src
		$aFrames[$aFrames[0][0]][1] = $oFrame_1.id
	Next
Next
ReDim $aFrames[$aFrames[0][0] + 1][2]
If Not $aFrames[0][0] Then Exit -3
_ArrayDisplay($aFrames)
For $i = 1 To $aFrames[0][0]
	_IENavigate($oIE, $aFrames[$i][0])
	ConsoleWrite($i & @TAB & 'ID: ' & $aFrames[$i][1] & @TAB & 'SRC: ' & $aFrames[$i][0] & @LF)
	ConsoleWrite('================================' & @LF)
	ConsoleWrite(_IEBodyReadHTML($oIE) & @LF);например
	ConsoleWrite('================================' & @LF)
	Sleep(2000)
	_IEAction($oIE, 'back')
	_IELoadWait($oIE)
Next
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
inververs, madmasles,
Спасибо!
Не могу сказать что мне по душе такое решение, но вопросов по данной теме у меня больше нет.
:smile:


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

Хотя...
Код:
--> COM Error Encountered in test.au3
----> $IEComErrorScriptline = 14
----> $IEComErrorNumberHex = 80020009
----> $IEComErrorNumber = -2147352567
----> $IEComErrorWinDescription = Отказано в доступе.
----> $IEComErrorDescription = Отказано в доступе.

14-ая строка - это у нас вот это
Код:
$oObj = $oFrame.contentWindow.document


Загадочные фреймы на 'http://autoit-script.ru/'
Так что придётся везде проверки на ошибки ставить.
 
Верх