Что нового

[Сеть, интернет] Работа с IE (клик по ссылкам и задумчивость браузера)

LScript

Новичок
Сообщения
3
Репутация
0
Здравствуйте, уважаемые форумчане!
При изучении возможностей AutoIT для работы с браузером IE (через IE.au3) возникла проблема с которой не смог разобраться самостоятельно.
Суть проблемы в том, что при выполнении кода приведенного ниже запускается браузер, он открывает сайт ya.ru, вводит в форму поиска фразу "скачать песню", выводится MsgBox с текстом "1", нажимается Submit на форме. Новая страница загружается, и потом начинается самое странное: в статусной строке браузера написано "Готово", но MsgBox с текстом "2" появляется только через несколько минут (точно не засекал, но в районе 5-10 минут). Далее выполнение скрипта идет так же быстро как и началось.
Играл с таймаутами и вообще убирал команды ожидания загрузки странцы, читал мануал и форумы, юзал гугл и яндекс, но описания подобной проблемы не нашел.
Заранее благодарю за помощь!

Код:
#include <IE.au3>
$oIE = _IECreate ("http://ya.ru")
_IELoadWait($oIE)
$oForm   = _IEFormGetCollection($oIE,0)
$oSearchInputText  = _IEFormElementGetObjByName($oForm,"text")
_IEFormElementSetValue($oSearchInputText,"скачать песню")
MsgBox(64, "Tutorial", "1")
_IEFormSubmit($oForm)
;_IELoadWait($oIE,100,3000) - тут играл с таймаутами, но ни к чему интересному не привело
MsgBox(64, "Tutorial", "2")
_IELinkClickByIndex($oIE, 25)
_IELoadWait($oIE)
_IEQuit($oIE)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ставим _IEFormSubmit второй параметр 0 и вперёд.

Код:
_IEFormSubmit($oForm,0)


Кстати _IECreate по умолчанию ждёт, пока страница загрузится и только потом передаёт управление дальше. Следовательно, после _IECreate ставить _IELoadWait, надобности нет.

Код:
#include <IE.au3>
$oIE = _IECreate ("http://ya.ru")
$oForm   = _IEFormGetCollection($oIE,0)
$oSearchInputText  = _IEFormElementGetObjByName($oForm,"text")
_IEFormElementSetValue($oSearchInputText,"скачать песню")
MsgBox(64, "Tutorial", "1")
_IEFormSubmit($oForm,0)
_IELoadWait($oIE)
MsgBox(64, "Tutorial", "2")
_IELinkClickByIndex($oIE, 25)
_IELoadWait($oIE)
_IEQuit($oIE)
 
Автор
L

LScript

Новичок
Сообщения
3
Репутация
0
Большое спасибо! Действительно заработало без торможения.

Только я так и не понял с чем было связано столь долгое зависание. В справке ведь написано:
Код:
Optional: specifies whether to wait for page to load before returning
0 = Return immediately, not waiting for page to load
1 = (Default) Wait for page load to complete before returning
Если ставим 0, значит сабмитим форму без ожидания полной загрузки страницы. Но ведь эксплорер показывает, что страница полностью загружена (чего тогда ждет AutoIT?). Да и по логике сабмитить форму на недогруженной странице не очень верно. Наверное я что-то недопонимаю :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
LScript
Только я так и не понял с чем было связано столь долгое зависание.

Как я понимаю, дело в том, что ya.ru не удачный пример для таких экспериментов, он перенаправляет вас на yandex.ru, следовательно, ссылка на объект родительского окна теряется.
В UDF же _IEFormSubmit ждёт ссылку на объект родительского окна:

Код:
; код из IE.au3
Local $o_window = $o_object.document.parentWindow
$o_object.submit
	If $f_wait Then
		_IELoadWait($o_window)
		Return SetError(@error, 0, -1)
	EndIf


И по ходу будет жать те самые 5 минут, которые ему положены по Timeout, после чего
_IELoadWait прервёт ожидание:

Код:
; код из IE.au3
Case Else ; this should work with any other DOM object
	$oTemp = $o_object.document.parentWindow
	While Not (String($oTemp.document.readyState) = "complete" Or $oTemp.document.readyState = 4 Or $f_Abort)
		If (TimerDiff($IELoadWaitTimer) > $i_timeout) Then
			$i_ErrorStatusCode = $_IEStatus_LoadWaitTimeout
			$f_Abort = True
		EndIf
		; Trap unrecoverable COM errors
		If @error = $_IEStatus_ComError And __IEComErrorUnrecoverable() Then
			$i_ErrorStatusCode = __IEComErrorUnrecoverable()
			$f_Abort = True
		EndIf
	Sleep(100)


Мы же сделали это сами, поставив второй параметр _IEFormSubmit равным 0.
Вот вам четыре примера как можно решить вашу задачу, не прибегая к второму параметру _IEFormSubmit:

Код:
#include <IE.au3>

; вариант I
$oIE = _IECreate ("http://yandex.ru")
$oForm   = _IEFormGetCollection($oIE,0)
$oSearchInputText  = _IEFormElementGetObjByName($oForm,"text")
_IEFormElementSetValue($oSearchInputText,"скачать песню")
	MsgBox(64, "Tutorial", "1")
_IEFormSubmit($oForm)
	MsgBox(64, "Tutorial", "2")
_IELinkClickByIndex($oIE, 25)
_IELoadWait($oIE)

; вариант II
$oIE = _IECreate ("http://yandex.ru")
$oForm = _IEGetObjById ($oIE, "form")
$oText = _IEFormElementGetObjByName ($oForm, "text")
_IEFormElementSetValue ($oText, "скачать песню")
	MsgBox(64, "Tutorial", "1")
_IEFormSubmit($oForm)
	MsgBox(64, "Tutorial", "2")
_IELinkClickByIndex($oIE, 25)
_IELoadWait($oIE)

; вариант III
$oIE = _IECreate ("http://google.ru")
$oForm   = _IEFormGetCollection($oIE,0)
$oSearchInputText  = _IEFormElementGetObjByName($oForm,"q")
_IEFormElementSetValue($oSearchInputText,"скачать песню")
	MsgBox(64, "Tutorial", "1")
_IEFormSubmit($oForm)
	MsgBox(64, "Tutorial", "2")
_IELinkClickByIndex($oIE, 25)
_IELoadWait($oIE)

; вариант IV
$oIE = _IECreate ("http://google.ru")
$oForm = _IEFormGetObjByName ($oIE, "f")
$oText = _IEFormElementGetObjByName ($oForm, "q")
_IEFormElementSetValue ($oText, "скачать песню")
	MsgBox(64, "Tutorial", "1")
_IEFormSubmit($oForm)
	MsgBox(64, "Tutorial", "2")
_IELinkClickByIndex($oIE, 25)
_IELoadWait($oIE)


P.S. Кстати если _IEFormSubmit вызвать со вторым параметром по умолчанию, то можно после не вызывать _IELoadWait, так как в ней уже есть вызов _IELoadWait.
 
Автор
L

LScript

Новичок
Сообщения
3
Репутация
0
Еще раз благодарю за исчерпывающий ответ!
 
Верх