Что нового

[Сеть, интернет] Ошибка в UDF IE.au3 с функцией _IEDocReadHTML()

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Код:
C:\Program Files\AutoIt3\Include\ie.au3 (2021) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement.outerHTML)
Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement.outerHTML^ ERROR
Периодически выскакивает при работе программы. В каком месте определить не получается, ибо функций очень много.
Или хотя бы подскажите как отследить на какой строке кода это происходит =)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: [Сеть, интернет] Ошибка IE.au3. Как устранить?

Mr. Anderson [?]
C:\Program Files\AutoIt3\Include\ie.au3 (2021)
Эта ошибка вылазит в функции _IEDocReadHTML().
Посмотрите примеры к функциям _IEErrorHandlerRegister() и ObjEvent().
Может как-то так?
Код:
;...
If IsObj($oIE) Then
	$sHTML = _IEDocReadHTML($oIE)
Else
	;найти, наверное, объект или создать заново.
EndIf
;...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Сеть, интернет] Ошибка IE.au3. Как устранить?

Mr. Anderson
периодически - значит нерегулярно?
и темку бы переименовать, не первый день тут ;)
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
madmasles, спасибо за идею! Попробую!
Kaster, ага, нерегулярно, у меня функция примерно такая:
Код:
Do
	Sleep($time_pause)
	$iNumChecked += 1
	If StringInStr(ContentPage(), $txt_wait) Then
		SysMsg("Дождались появления на странице "&$txt_wait)
		$iWaitOk = 1
	Else
		SysMsg("Еще нет на странице "&$txt_wait)
		$iWaitOk = 0
	EndIf
Until $iWaitOk Or $iNumChecked > 300

Где ContentPage() вызывает _IEDocReadHTML... что бы не ждать полной загрузки страницы :smile: Вероятно в этом проблема...
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Ошибка находится в функции IE.au3:
Код:
H:\Program Files\AutoIt3\Include\ie.au3 (2021) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement.outerHTML)
Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement^ ERROR
Код:
Func _IEDocReadHTML(ByRef $o_object)
	If Not IsObj($o_object) Then
		__IEErrorNotify("Error", "_IEDocReadHTML", "$_IEStatus_InvalidDataType")
		Return SetError($_IEStatus_InvalidDataType, 1, 0)
	EndIf
	If Not __IEIsObjType($o_object, "browserdom") Then
		__IEErrorNotify("Error", "_IEDocReadHTML", "$_IEStatus_InvalidObjectType", "Expected document element")
		Return SetError($_IEStatus_InvalidObjectType, 1, 0)
	EndIf
	;
	Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement.outerHTML)
EndFunc


Может быть как-то переделать функцию на проверку возвращаемого значения? Но я что-то туплю, как это сделать, с объектами дел особо никогда не имел. Может быть мне может кто помочь?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Mr. Anderson
Зачем вам загружать полностью HTML код страницы?
Если вам нужно "слушать" динамические данные, на странице, то используйте _IEPropertyGet() и AdlibRegister()

P.S. В _IEDocReadHTML всё нормально, её незачем менять :smile:
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Да вот приходится. Тогда как же мне этой ошибки избегать она ведь явно внутри функции IE.au3?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Mr. Anderson
Если Вам ссылки известны, то можно попробовать получать HTML код с помощью InetRead() или _INetGetSource()
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Вот пример c AdlibRegister:
Код:
#include <IE.au3>
AdlibRegister('_Listener', 100)
OnAutoItExitRegister('_Exit')
$oIE = _IECreate('http://www.mr-garrett.narod.ru/timer.html')

While 1
	Sleep(250)
WEnd

Func _Listener()
	If IsObj(Eval('oIE')) Then
		
		$oForm = _IEFormGetObjByName($oIE, 'counter')
		$oTimer = _IEFormElementGetObjByName($oForm, "d2")
		$sCheck = _IEFormElementGetValue($oTimer)

		Switch Number($sCheck)
		Case 15.0
			ConsoleWrite("Осталось: " & $sCheck & " сек." & @CRLF)
			$sCheck = 0
		Case 10
			ConsoleWrite("Осталось: " & $sCheck & " сек." & @CRLF)
			$sCheck = 0
		Case 5.0
			ConsoleWrite("Осталось: " & $sCheck & " сек." & @CRLF)
			$sCheck = 0
		Case 0.0
			ConsoleWrite("Выход" & @CRLF)
			Exit
		EndSwitch
		
	EndIf
EndFunc

Func _Exit()
	AdlibUnRegister('_Listener')
EndFunc
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Garrett, что это такое? И какое оно отношение к теме имеет о_О?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Mr. Anderson сказал(а):
у меня функция примерно такая:
Код:
Do
	Sleep($time_pause)
	$iNumChecked += 1
	If StringInStr(ContentPage(), $txt_wait) Then
		SysMsg("Дождались появления на странице "&$txt_wait)
		$iWaitOk = 1
	Else
		SysMsg("Еще нет на странице "&$txt_wait)
		$iWaitOk = 0
	EndIf
Until $iWaitOk Or $iNumChecked > 300

Где ContentPage() вызывает _IEDocReadHTML... что бы не ждать полной загрузки страницы :smile: Вероятно в этом проблема...
Я так понимаю, у вас стоит задача проверки динамических данных на странице! Так?
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Garrett, вы гений! Как же жаль что я так поздно об этом узнал... 1346 строк и всё переделывать :wacko: жуть.
А таким образом всё содержимое страницы вернуть невозможно?

Нет, у меня задача считать необходимые данные и начать выполнение прежде чем продолжится загрузка лишнего мусора
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Mr. Anderson [?]
Нет, у меня задача считать необходимые данные и начать выполнение прежде чем продолжится загрузка лишнего мусора
Какие данные, если не секрет?
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Онлайн игра-сайт. То есть например произвел клик, посмотрел результат ну и так далее. Или например выбор противника, загружаю список в массив... Вот как-то так.
Просто если ждать полной загрузки страницы то это как-то долго получается, хотя на вид то, что нужно уже есть на странице, вот я и сделал эту функцию, что бы не ждать полной загрузки.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Mr. Anderson сказал(а):
Код:
C:\Program Files\AutoIt3\Include\ie.au3 (2021) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement.outerHTML)
Return SetError($_IEStatus_Success, 0, $o_object.document.documentElement.outerHTML^ ERROR
Боюсь, вам всё же придётся ждать, полной загрузи документа! Эти ошибки говорят что "запрошенное действие с этим объектом не удалось"
Попробуйте дополнительно после функции _IEDocReadHTML поставить дополнительно функцию _IELoadWait, или поставьте небольшую задержку, Sleep(250). С задержкой поэкспериментируйте.
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Sleep до или после? Ведь ошибка в _IEDocReadHTML, значит до нее надо паузу удержать
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
OffTopic:
В IE во время кликов щелчки звуком сопровождаются, его можно выключить?
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
По моиму нет. Только если отключить звуковую тему windows.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Mr. Anderson [?]
В IE во время кликов щелчки звуком сопровождаются, его можно выключить?
Можно, наверное, на время работы скрипта переименовать или переместить файл @WindowsDir & '\Media\Начать обзор.wav', а в конце вернуть обратно Это у меня на XP, на 7, вроде, другой и, кажется мне, права админа нужны.
 
Верх