Что нового

[Ошибки] Ошибка при работе с библиотекой IE

nicotino

Новичок
Сообщения
30
Репутация
0
C:\Program Files\AutoIt3\Include\IE.au3 (585) : ==> The requested action with this object has failed.:
WEnd
WEnd^ ERROR

кто нибудь сталкивался с такой проблемой?
вроде как вылетает из-за обновления страницы
 

Asshaker

Знающий
Сообщения
150
Репутация
17
Таблетки нету, вылет 100% изза обновления страницы во время обработки страницы.
Сам борюсь с помощью:
Код:
Func _myLoadWait() 
While Not (String($oIE.document.readyState) = "complete")
;~ 	ToolTip('Wait Load',150,150)
	$r=Random(1,4,1)
        Sleep($r*100)
WEnd
EndFunc

Но все равно пару раз в день вылетает с ошибкой.
 
Автор
N

nicotino

Новичок
Сообщения
30
Репутация
0
Он зараза не стыкуется как то с
Код:
_IEFormGetCollection
и обновлением... вроде и у остальных коллекций такая же проблема
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Asshaker [?]
585 строка библиотеки IE это как раз _IELoadWait
Именно. Потому я и спросил. Ваш пример и
Код:
_IELoadWait
одно и то же.

nicotino
Скорее всего, у вас в коде, допущены логические ошибки. Поймите, UDF IE.au3 работает с программой Internet Explorer, а это значить, что вы должны учитывать особенности её работы, плюс особенности работы DOM (Document Object Model)
 
Автор
N

nicotino

Новичок
Сообщения
30
Репутация
0
Ошибки, конечно, я не исключаю, так как за пару дней асом в программировании не станешь. Просто хотел узнать не сталкивался ли кто с тако ошибкой и как ее решить.
Приходится страдать садомазо... проверять наличие скрипта при помощи же autoit
 

Asshaker

Знающий
Сообщения
150
Репутация
17
nicotino [?]
Приходится страдать садомазо... проверять наличие скрипта при помощи же autoit
Так и выкручиваюсь, ловлю окошко ошибки и перезапускаюсь.
2 Garret
Да одно и то же. Но методом "научного тыка" я определил, что при использовании:
Код:
$o_object.document.readyState = 4
 $f_Abort

Ошибка выскакивает чаще.
З.Ы. Надо как то попытаться предугадать автообновление.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
nicotino [?]
так как за пару дней асом в программировании не станешь
Вот и я о том же! Сколько себя помню, телепатия всегда мне трудно давалась.
Может, выложите уже код, чтобы можно было предметно разговаривать. :smile:
 
Автор
N

nicotino

Новичок
Сообщения
30
Репутация
0
Код конечно великоват и много там хлама :smile:
Код:
#include <IE.au3>

$sUrl = 'http://gohe.ru/arena.php'
$iMin = 0
$iMax = 6
Global $loc

$oIE = _IECreate($sUrl)

HotKeySet ("{F2}","_Exit")
HotKeySet ("{F1}","Doit")
HotKeySet ("{F3}","CheckBattle")

While 1
   Sleep(500)
   _myLoadWait() 
   GetLocation_()
   Switch $loc
Case "Арена"
   _myLoadWait() 
	  Arena_()
   Case "Сражение"
	  _myLoadWait() 
	  Battle_()
   Case "Персонаж"
	  _myLoadWait() 
	  _IENavigate($oIE,$sUrl)
   Case "Боги против Героев"
	  _myLoadWait() 
	  _IENavigate($oIE,$sUrl)
	  Case "Подключение"
	  _myLoadWait()
   Case Else
	  _myLoadWait() 
	  _IENavigate($oIE,$sUrl)
   EndSwitch
   WEnd
   

 
Func _Exit()
   Exit
EndFunc

Func GetLocation_()
   Sleep(100)
   _IELoadWait($oIE)
   $oIE = _IEAttach("[CLASS:IEFrame]",'Instance')
   Local $oInputs = _IETagNameGetCollection($oIE, "title")
   If @error<=0 Then
For $oInput In $oInputs
  $loc=$oInput.innerText
  Return $loc
 Next
 Else
	_IENavigate($oIE,$sUrl)
	EndIf
 EndFunc
 
Func Battle_()
   _IELoadWait($oIE)
	  Local $oForms = _IEFormGetCollection($oIE)
	  If @error<=0 Then
		 For $oForm In $oForms
		 $oUdar = _IEFormElementGetObjByName($oForm, 'udar')
        _IEFormElementOptionSelect($oUdar, '1')
		$oBlock = _IEFormElementGetObjByName($oForm, 'block')
        _IEFormElementOptionSelect($oBlock, '2')
        _IEFormSubmit($oForm)
		_IEAction($oIE, "refresh")
		_myLoadWait() 
		ExitLoop
		Next
	 EndIf
	 
	 Local $sHTML=_IEBodyReadText($oIE)
	  If @error<=0 Then
		 Local $case
		 Switch StringInStr($sHTML,$case)
	  Case $case="Ожидаем ход противника!"
			_IELinkClickByText($oIE,"На главную")
			Sleep(100)
		 Case $case="Вы победили в бою"
			_IELinkClickByText($oIE,"На главную")
			Sleep(100)
		 Case $case="Вы проиграли сражение!"
			_IELinkClickByText($oIE,"На главную")
			Sleep(100)
		 Case Else
			_IEAction($oIE, 'refresh')
			EndSwitch
			EndIf
	  
	  
	 #cs
	 Local $oInputs = _IETagNameGetCollection($oIE, "div")
	  If @error<=0 Then
		 Local $case
		 For $oInput In $oInputs
			Switch StringInStr($oInput.innerText,$case)
		 Case $case="Ожидаем ход противника!"
			_IELinkClickByText($oIE,"На главную")
			Sleep(100)
			ExitLoop
		 Case $case="Вы победили в бою"
			IELinkClickByText($oIE,"На главную")
			Sleep(100)
			ExitLoop
		 Case $case="Вы проиграли сражение!"
			IELinkClickByText($oIE,"На главную")
			Sleep(100)
			ExitLoop
		 Case Else
			_IEAction($oIE, 'refresh')
			ExitLoop
			EndSwitch
		 Next
	  EndIf
	 #ce 
EndFunc
 
 Func Arena_()
	_myLoadWait() 
	Sleep(100)
	_IELoadWait($oIE)
	;==> создаем бой
	Local $oLinks = _IELinkGetCollection($oIE)
	If @error<=0 Then
	   Local $click="Создать бой"
		 For $oLink In $oLinks
	  If $oLink.innerText==$click Then
		 _IELoadWait($oIE)
		 _IELinkClickByText($oIE, $click)
		 ExitLoop
		 EndIf
	  Next
   EndIf
   ;==>
   Sleep(200)
	  _myLoadWait() 
   ;==> заполняем форму
	  $oForms = _IEFormGetCollection($oIE)
	  If @error<=0 Then
For $oForm In $oForms
    If $oForm.action == '/arena.php?mod=inv' Then
        $oMin = _IEFormElementGetObjByName($oForm, 'min')
        $oMax = _IEFormElementGetObjByName($oForm, 'max')
        $oSelect = _IEFormElementGetObjByName($oForm, 'start')
        _IEFormElementOptionSelect($oSelect, '3')
		Sleep(200)
        _IEFormElementSetValue($oMin, $iMin)
		Sleep(200)
        _IEFormElementSetValue($oMax, $iMax)
		Sleep(200)
		_myLoadWait() 
        _IEFormSubmit($oForm)
        ExitLoop
    EndIf
 Next
 EndIf
	  ;==>
	  Sleep(200)
	  _myLoadWait() 
	  ;==> ждем противника
	  Local $sHTML=_IEBodyReadText($oIE)
	  Sleep(200)
	  _myLoadWait() 
	  If @error<=0 Then
		 Local $case
		 Switch StringInStr($sHTML,$case)
	  Case $case="Бой успешно создан!"
		 Sleep(200)
	  _myLoadWait() 
			_IELinkClickByText($oIE,"Обновить")
			Sleep(100)
		 Case $case="Ожидание противника"
			Sleep(200)
	  _myLoadWait() 
			IELinkClickByText($oIE,"Обновить")
			Sleep(1000)
		 Case $case="Вы проиграли сражение!"
			Sleep(200)
	  _myLoadWait() 
			IELinkClickByText($oIE,"На главную")
			Sleep(100)
		 Case Else
			_IEAction($oIE, 'refresh')
			EndSwitch
	  EndIf
	  ;==>
   EndFunc
   
   Func _myLoadWait() 
While Not (String($oIE.document.readyState) = "complete")
;~  ToolTip('Wait Load',150,150)
    $r=Random(1,4,1)
        Sleep($r*100)
WEnd
EndFunc

добавил последнюю функцию от Asshaker но я что то не заметил разницы
 

Asshaker

Знающий
Сообщения
150
Репутация
17
Попробуй так:
Код:
Global $oIE = _IEAttach("Боги против Героев")
While 1
	Switch GetLocation_()
		Case 1
		Case 2
		Case 3
		Case 4
		Case Else
	EndSwitch
WEnd

Func GetLocation_()
	_myLoadWait()
	$oInputs = _IETagNameGetCollection($oIE, "title")	
	If Then
		Return 1
	EndIf
	If Then
		Return 2
	EndIf
	If Then
		Return 3
	EndIf
	If Then
		Return 4
	EndIf
	If Then
		Return 5
	EndIf
EndFunc



OffTopic:

Уууу в этой игре можно не плохо развернуться :D :IL_AutoIt_1:
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Тоже столкнулся с аналогичной проблемой http://autoit-script.ru/index.php/topic,9650.0.html
Решил с помощью регистрации Adlib-функции. Суть заключается в том, что зарегестрированная функция очень часто проверяет состояние страницы посредством условия
Код:
$oIE.readyState<>4

и если произошло обновление, то занова запускать стандартный
Код:
_IELoadWait($oIE)


Вот некоторые функции моих разработок. Определение обновления идентифецируется глобальной переменной $fIERefresh
Ошибки перестали появляться.

Код:
Func _AdlibReg()
	AdlibRegister('_IECheck', 1)
EndFunc

Func _AdlibUnreg()
	AdlibUnRegister('_IECheck')
EndFunc

Func _IECheck()
	If IsObj($oIE) Then
		If $oIE.readyState<>4 Then
			$fIERefresh=True
			_LogR() ; запись страницы в лог
			_AdlibUnreg()
;~ 			MsgBox(0, '', $oIE.readyState)
		EndIf
	EndIf
EndFunc
 
Автор
N

nicotino

Новичок
Сообщения
30
Репутация
0
прошелся по коду, нашел пару ошибок :-[
жаль ИЕ библиотеку не подсвечивает
Благодарю всех кто откликнулся :smile: буду тестировать
 
Автор
N

nicotino

Новичок
Сообщения
30
Репутация
0
Примечания

Вначале выполнения функции @error равен 0. Если вызвана SetError() перед функцией, то @error равен 0 после завершения функции. Это означает, что для того, чтобы @error установить после выполнения функции, вы должны явно установить значение. Это также означает, что вам, возможно, потребуется продублировать значение @error в переменную, если вы проверяете его в цикле While-WEnd.

может вся причина в этом?
 

valldar

Новичок
Сообщения
32
Репутация
2
У меня аналогичная ошибка при использовании функции _IEFormElementsetValue
Не сумел разобраться в чем дело, пришлось поступить следующим образом:
Код:
;....
$option = _IEGetObjByName ($oie, "some_object")
$optioncount=_IETagNameGetCollection($option,'option')
$optionnum=@extended

for $i=0 to $optionnum-1
   $option = _IEGetObjByName ($oie, "some_object") ;<----- если не добавить это в цикл, то не работает

;-----------------далее я просто извлек необходимые параметры из IE.au3
   ;_IEFormElementsetValue ($option, $i)
   $option.value=$i
   $option.fireEvent("OnChange")
_ieloadwait($oie)
Next
;.....

в таком варианте ошибки не выдает

PS: _IELoadWait тоже любит ошибку выдавать, особенно на строке 585. Как с этим поступить я пока не знаю
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
$oOptions = _IEGetObjByName($oIE, "some_object")

Если возвращает 1 объект то можно выполнять сразу присваивание
Код:
If IsObj($oOptions) Then
	$oOptions.Value = ""
	$oOptions.fireEvent("OnChange")
Else
	ConsoleWrite("Не найдено" & @LF)
EndIf


;А если возвращает коллекцию объектов, то для перечисления используйте
Код:
If IsObj($oOptions) Then
	For $oOption In $oOptions
		$oOption.value = ""
		$oOption.fireEvent("OnChange")
	Next
Else
	ConsoleWrite("Не найдено" & @LF)
EndIf
 
Верх