Что нового

[Сеть, интернет] Ожидание полной загрузки фрейма в IE

beaver

Новичок
Сообщения
58
Репутация
2
Всем привет.
Совсем недавно впервые столкнулся с автоматизацией элементов в фреймах. Люди на форуме добрые ;D и быстро подсказали новичку (читай мне) как с этими элементами иметь дело. Теперь я во всеоружии и спасибо им за это. Но осталась для меня одна еще не разрешимая задачка.
Для ожидания полной загрузки страницы в IE использую стандартную функцию
Код:
_IELoadWait ($oIE)
. Она Прекрасно работает, но вот когда дело обстоит с ожиданием загрузки фрейма она не помогает. Варианта, как я понимаю, тут два - или я ее не правильно использую или есть какая то другая функция для этой же цели.
Если кто знает, подскажите как написать функцию ожидания загрузки фрейма? Может быть правильно будет указать для
Код:
_IELoadWait($Frame)
форму фрейма?
 
Автор
B

beaver

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

axlwor

Скриптер
Сообщения
657
Репутация
147
_IELoadWait проверяет readystate. Пока оно не станет "complete" или 4. Мне хватало этого во фрейме, когда я что то делал в нем
что то похожее на
Код:
$oIE = _IEAttach()
$oFrame = _IEFrameGetObjByName ($oIE, "name")
$oSubmit = _IEGetObjByName ($oFrame, "submitExample")
_IEAction ($oSubmit, "click")
_IELoadWait($oFrame)

Но действие может затронуть и другие фреймы, поэтому может потребоваться
Код:
_IELoadWait($oFrame1)
_IELoadWait($oFrame2)
_IELoadWait($oIE)
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
О! до меня дошло где я "накосячил" :-[
Дело было не в том, что
Код:
_IELoadWait ($oForm)
для фреймов не так работает как мне надо, а в том, что когда я пытался получить форму на фрейме - самой формы еще не существовало. Проблему решил при помощи цикла ожидания формы с таймаутом в 30 сек. Кривоватенько, но работает:
Код:
Func IE_GetFormObj_InFrame($sFormId)
	Do
		Local $begin = TimerInit()
		Local $oFrames = _IEFrameGetCollection ($oIE)
		Local $iNumFrames = @extended
		For $i = 0 to ($iNumFrames - 1)
			$oFrame = _IEFrameGetCollection ($oIE, $i)
			If _IEPropertyGet( $oFrame, "popupFrame") == 0 Then
				ExitLoop
			EndIf
		Next	
		$oForm = _IEGetObjById ($oFrame, $sFormId)	
	Until ($oForm <> 0) Or (TimerDiff($begin)>$iTimeOut)
	If @error = 7 Then
		Log_Write(0, "Форма '" & $sFormId & "' в фрейме не найдена", "Function: IE_EditBox_SetValue_InFrame")
	EndIf
	Return $oForm
EndFunc
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
If $oTemp.innerText == 'Зарегистрироваться' Then
        _IEAction ($oTemp, "click")
        _IELoadWait($oIE) ;<---- вот это забыл после клика добавить
    EndIf

можно и дальше
Код:
while 1
$oFrames = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended
For $i = 0 to ($iNumFrames - 1)
    $oFrame = _IEFrameGetCollection ($oIE, $i)
    If _IEPropertyGet( $oFrame, "popupFrame") = 0 Then
        ExitLoop 2
    EndIf
Next
sleep(100)
wend

это все отсюда
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
Мне кажется, что условие
Код:
_IEPropertyGet( $oFrame, "popupFrame") = 0
говорит о том, что функция вернула ошибку. Почему в этом случае надо выходить из двух циклов? Можно подробнее описать словами?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
:laugh:прочту еще разок
Код:
#include <ie.au3>

Global $oIE

$oIE = _IECreate ("сам_знаешь_куда", 0, 1, 1, 0)
$oTemps = _IETagNameGetCollection ($oIE, "a")
For $oTemp In $oTemps
    If $oTemp.innerText == 'Зарегистрироваться' Then
        _IEAction ($oTemp, "click")
		_IELoadWait($oIE)
    EndIf
Next

$oFrames = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended
For $i = 0 to ($iNumFrames - 1)
    $oFrame = _IEFrameGetCollection ($oIE, $i)
 	_IELoadWait($oFrame)
	$oForm = _IEGetObjById ( $oFrame, "formRegister")
	If @error = 0 Then
		_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "lastName"), "Фамилия")
		_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "firstName"), "Имя")
		_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "middleName"), "Отчество")
		_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "birthDate_d"), "28")
		
		;Месяц в цифрах
		_IEFormElementOptionSelect (_IEFormElementGetObjByName ($oForm, "birthDate_m"), "5", 1, "byValue")
		;или в буквах
		;_IEFormElementOptionSelect (_IEFormElementGetObjByName ($oForm, "birthDate_m"), "Май", 1, "byText")
		
		_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "birthDate_y"), "1990")
		_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "cellPhone"), "+75555555555")
		_IEAction(_IEFormElementGetObjByName($oForm, "cellPhone"), "focus")
		_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "email"), "[email protected]")
		_IEAction(_IEFormElementGetObjByName($oForm, "agreement"), "click")
		
		;~ _IEAction(_IEFormElementGetObjByName($oForm, "submit"), "click")		
		Exit
	EndIf
Next

я закоментил отправку формы, чтобы лишний раз не регистрироваться. И после каждого _IEAction лучше бы _IELoadWait ставить.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
beaver сказал(а):
Мне кажется, что условие
Код:
_IEPropertyGet( $oFrame, "popupFrame") = 0
говорит о том, что функция вернула ошибку. Почему в этом случае надо выходить из двух циклов? Можно подробнее описать словами?
В таком виде функция вернёт ошибку всегда, смотрим справку ;)
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
а я то думаю, что у меня ворнинги второй день валятся на эту функцию :rofl:
 
Верх