Что нового

[Сеть, интернет] Ошибка в 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,322
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
Репутация
626
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
Репутация
967
Mr. Anderson
Зачем вам загружать полностью HTML код страницы?
Если вам нужно "слушать" динамические данные, на странице, то используйте _IEPropertyGet() и AdlibRegister()

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

Mr. Anderson

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

madmasles

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

Garrett

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

Mr. Anderson

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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
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,322
Mr. Anderson [?]
В IE во время кликов щелчки звуком сопровождаются, его можно выключить?
Можно, наверное, на время работы скрипта переименовать или переместить файл @WindowsDir & '\Media\Начать обзор.wav', а в конце вернуть обратно Это у меня на XP, на 7, вроде, другой и, кажется мне, права админа нужны.
 
Верх