Что нового

[Сеть, интернет] IE. возникает ошибка при обращении к innerText

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Собственно код
Код:
$oIE_1 = _IECreate ("http://")
; 	$oInputs_1 = _IETagNameGetCollection ($oIE_1, "TR")   ; пробовал и здесь поставить

GUISetState ()       ; will display an empty dialog box

; Run the GUI until the dialog is closed
While 1

	$oInputs_1 = _IETagNameGetCollection ($oIE_1, "TR")

	For $oInput In $oInputs_1
		If StringInStr($oInput.innerText, "XXX") = 0 Then ...
	Next

    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend


Так вот оно работает до какого-то момента, а потом вдруг бац
[box]: ==> The requested action with this object has failed.:
If StringInStr($oInput.innerText, "XXX") = 0 Then
If StringInStr($oInput.innerText^ ERROR[/box]

По логике вещей это может быть связано только с тем что сайт автообновляется - больше никаких событий не происходит, иначе как объяснить что сначала работает, а потом ошибка вываливается.
Но всё равно не пойму, если $oInputs_1 не пустое и оно в цикл For заходит, то почему такая ошибка возникает? И как её обойти?
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Проблема по-прежнему проявляется.
Я уже так пробовал
Код:
_IELoadWait ($oIE)
$oInputs = _IETagNameGetCollection ($oIE, "TR")
If @Extended > 0 Then
	For $oInput In $oInputs
		$telo = $oInput.innerText
		; здесь идут ещё мои действия
	Next
EndIf

Всё равно (не сразу, а через несколько часов работы) вылазит
Код:
: ==> The requested action with this object has failed.:
$telo = $oInput.innerText
$telo = $oInput.innerText^ ERROR

Я вообще не могу представить ситуацию, когда проходит проверка на успешность сбора коллекции, скрипт входит в цикл For, и уже потом ругается на innerText.
Подскажите, пожалуйста, как отловить такую ситуацию, чтобы знать что к innerText нельзя обращаться ?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
C2H5OH [?]
По логике вещей это может быть связано только с тем что сайт автообновляется
Документ обновляется полностью или только отдельные элементы?
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Сайт обновляется полностью. Раз в минут 5-10 (если надо точно, то я узнаю). Но скрипт спокойно переносит обновление много раз, а потом отваливается. Не могу сказать что точно в момент обновления.
Но мне просто непонятно. Если _IETagNameGetCollection завершилась с ошибкой, то почему скрипт заходит в цикл? У меня же фактически двойная проверка на наличие ошибки.
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
If @Extended > 0

Код:
For $oInput In $oInputs

Не катит?


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

Я понял.
Завтра с проверкой @Error протестирую.
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Добавление проверки @Error после _IETagNameGetCollection не помогло
Код:
_IELoadWait ($oIE_2)
$oInputs = _IETagNameGetCollection ($oIE_2, "TR")
If (@Extended > 1) And (@Error == 0) Then
	For $oInput In $oInputs
		$telo = $oInput.innerText
		; здесь идут ещё мои действия
	Next
EndIf


Всё равно получаю
Код:
==> The requested action with this object has failed.:
$telo = $oInput.innerText
$telo = $oInput.innerText^ ERROR
->09:39:42 AutoIT3.exe ended.rc:1

То есть, как я понимаю, коллекция $oInputs успешно собрана и она непустая. Ошибка появляется именно при обращении к innerText одного из элементов коллекции.



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

В поиске нашел вот такую наводку http://autoit-script.ru/index.php/topic,2577.msg18637.html#msg18637
Поставил
Код:
$oInputs = _IETagNameGetCollection ($oIE_2, "TR")
For $oInput In $oInputs
	$telo = _IEPropertyGet($oInput,"innerText")
	If @Error <> 0 Then ContinueLoop
	; здесь опять мои действия
Next


Результат
Код:
C:\Program Files\AutoIt3\Include\IE.au3 (2840) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, $oTemp.innerText)
Return SetError($_IEStatus_Success, 0, $oTemp.innerText^ ERROR
->10:39:52 AutoIT3.exe ended.rc:1

Как я понял ошибка проявляется где-то в коде IE.au3


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

В библиотеке IE.au3 по этому адресу
Код:
Case $s_property = "innertext"
			If __IEIsObjType($o_object, "documentcontainer") Or __IEIsObjType($o_object, "document") Then
				$oTemp = $o_object.document.body
			Else
				$oTemp = $o_object
			EndIf
			Return SetError($_IEStatus_Success, 0, $oTemp.innerText)
 

darkwhite

Знающий
Сообщения
129
Репутация
5
дело в том что при обновлении документа тэги <body> и </body> прописываются сразу даже если документ как таковой еще не прогрузился
потому и вылетает ошибка innerText по крайней мере у меня такое было когда пытался подхватывать )
погляди вот тут может наталкнет на какую то мысль
http://autoit-script.ru/index.php/topic,7559.0.html
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Но у меня стоит
Код:
_IELoadWait ($oIE_2)
$oInputs = _IETagNameGetCollection ($oIE_2, "TR")
For $oInput In $oInputs
    $telo = $oInput.innerText
    ; здесь идут ещё мои действия
Next

Я так понимаю что _IELoadWait решает описанную тобой проблему, когда идёт попытка обращения к innerText пока документ ещё не прогрузился полностью.

У меня другая мысль возникла.
Вот я создал объект
Код:
$oIE_2 = _IECreate ("...")

А потом хочу туда отправить ESC по ControlSend.
Как мне из объекта $oIE_2 получить его "title" и controlID ?
 

darkwhite

Знающий
Сообщения
129
Репутация
5
Но у меня стоит
Код:
_IELoadWait ($oIE_2)
$oInputs = _IETagNameGetCollection ($oIE_2, "TR")
For $oInput In $oInputs
    $telo = $oInput.innerText
    ; здесь идут ещё мои действия
Next
Ты не проверяешь при этом ошибки? например таймоут соеденения ?
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Та я уже вот так сделал
Код:
If _IELoadWait ($oIE) Then
	$oInputs = _IETagNameGetCollection ($oIE, "TR")
	If @Error == 0 Then
		For $oInput In $oInputs
			$telo = _IEPropertyGet($oInput,"innerText")
			If @Error <> 0 Then ContinueLoop
			; здесь идут ещё мои действия
		Next
	EndIf
EndIf


Всё равно немного поработало и
Код:
IE.au3 (2840) : ==> The requested action with this object has failed.:
Return SetError($_IEStatus_Success, 0, $oTemp.innerText)
Return SetError($_IEStatus_Success, 0, $oTemp.innerText^ ERROR
->13:09:34 AutoIT3.exe ended.rc:1
(напоминаю что 2840 - это строка в стандартной библиотеке)

Ладно, буду дальше рыть... :scratch:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH,
А если так?
Код:
;...
For $oInput In $oInputs
	If Not IsObj($oInput) Or Not IsObj($oInputs) Then ExitLoop
	$telo = _IEPropertyGet($oInput,"innerText")
;...
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Собственно итоги.
К сожалению все проверки на отсутствие ошибок и на свойства объекта проходят, но скрипт после этого останавливается именно при попытке обращения к innerText.
В качестве гепотезы, я считаю что происходит это тогда, когда без контроля со стороны скрипта изменяется размер полей объекта. Как Вы помните, я говорил что сайт автообновляется. К тому же ошибка вылетает не сразу, а через какое-то продолжительное время (продолжительное - это несколько десятков-сотен обновлений).
Проблема решена путём добавления refresh перед началом формирования коллекции (проверки оставил. на всякий случай... ;D).
Код:
_IEAction($oIE_1,"refresh")
If _IELoadWait ($oIE_1) Then
	$oInputs = _IETagNameGetCollection ($oIE_1, "TR")
	For $oInput In $oInputs
		If Not IsObj($oInput) Then ExitLoop
		$telo = $oInput.innerText
		; здесь идут ещё мои действия
	Next
EndIf


Скрипт стабильно проработал уже 4 часа. В том числе пережил изменение длинны строк в теле страницы, связанное с изменением отображаемой на сайте информации.

Спасибо всем за участие в разборе полётов! ;D
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Наблюдается такая же ошибка, но с параметром 'outerhtml'
Может-ли это быть связано с тем, что во время прохода цикла For $oInput in $oInputs происходит автообновление страницы?

Я думаю, что при вызове таких функций _IETagnameGetCollection($oIE, 'tag'), _IETableGetCollection($oIE) и прочих, они возвращают массивы объектов в виде ярлыков на содержимое страницы. Не знаю как это точно назвать, может динамические объекты.
Или это не так и я пошёл совсем не в том направлении?
 
Верх