Что нового

_IELoadWait или $Obj.readyState (не работает с отдельными элементами)

Сообщения
35
Репутация
-1
Добрый день извиняюсь за название темы если что не смог лучше придумать :smile:
Итак ближе к теме сейчас примерно обрисую
пример :
Код:
$oIE = _IECreate('https://www.yandex.ru/')
_IELoadWait($oIE)
 
; тут немного сократил индексы элементов сразу указал

$Form = _IEFormGetCollection($oIEj,0)
$Text =  _IEFormElementGetCollection($Form,2)    
$Buton  = _IEFormElementGetCollection($Form,3)

_IEFormElementSetValue($oText,'1 вариант')
_IEAction($Buton,"focus")
_IEAction($Buton,"Click")

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


Код:
$aIEFrame = WinList('[CLASS:IEFrame]')
;_ArrayDisplay($aIEFrame)
$oIE = _IEAttach($aIEFrame[1][1],'Embedded')


;старый документ
ConsoleWrite('(' & @ScriptLineNumber & ') : $oIE.document.title = ' & $oIE.document.title & @CRLF)
;(54) : $oIE.document.title = 1 вариант — Яндекс: нашлось 474 млн ответов

$Form = _IEFormGetCollection($oIE,0)
$Text =  _IEFormElementGetCollection($Form,1)
$Buton  = _IEFormElementGetCollection($Form,0)

_IEFormElementSetValue($Text,'2 вариант')
_IEAction($Buton,"focus")
_IEAction($Buton,"Click")




if _IELoadWait($oIE) = 1 Then
	ConsoleWrite('(' & @ScriptLineNumber & ') : Документ загружен 1'& @CRLF)
ElseIf _IELoadWait($oIE) = 0 Then
    ConsoleWrite('(' & @ScriptLineNumber & ') : Документ грузится ожидаем 1'& @CRLF)
	Sleep(10000)
EndIf
;(70) : Документ загружен 1

if StringCompare($oIE.document.readyState,'complete') = 0 Then
	ConsoleWrite('(' & @ScriptLineNumber & ') : Документ загружен 2'& @CRLF)
ElseIf StringCompare($oIE.document.readyState,'complete') <> 0 Then
	ConsoleWrite('(' & @ScriptLineNumber & ') : Документ грузится ожидаем 2'& @CRLF)
	Sleep(10000)
EndIf
;(78) : Документ загружен 2



; новый документ обнуляем объект
$oIE = 0
$oIE = _IEAttach($aIEFrame[1][1],'Embedded')

if _IELoadWait($oIE) = 1 Then
	ConsoleWrite('(' & @ScriptLineNumber & ') : Документ загружен 3'& @CRLF)
ElseIf _IELoadWait($oIE) = 0 Then
    ConsoleWrite('(' & @ScriptLineNumber & ') : Документ грузится ожидаем 3'& @CRLF)
	Sleep(10000)
EndIf
;(92) : Документ загружен 3


if StringCompare($oIE.document.readyState,'complete') = 0 Then
	ConsoleWrite('(' & @ScriptLineNumber & ') : Документ загружен 4'& @CRLF)
ElseIf StringCompare($oIE.document.readyState,'complete') <> 0 Then
	ConsoleWrite('(' & @ScriptLineNumber & ') : Документ грузится ожидаем 4'& @CRLF)
	Sleep(10000)
EndIf
;(99) : Документ загружен 4
ConsoleWrite('(' & @ScriptLineNumber & ') : $oIE.document.title = ' & $oIE.document.title & @CRLF)
;(105) : $oIE.document.title = 1 вариант — Яндекс: нашлось 474 млн ответов

; итог ожидания не было и Титул документа вернулся старый так как новый Титул не успел загрузится







Собственно как мы видим из примера 2 структура документа меняется ,
и надо подождать когда все элементы обновятся но _IELoadWait он же $oIE.document.readyState
плевать хотел на это дело и говорит что все норм и скрипт летит дальше что неизбежно приведет к ошибкам
Вопрос к знатокам есть вариант решить эту проблему ? есть другая функция которая притормозит скрипт пока все элементы не обновятся?
нужен вариант что бы именно браузер вернул ответ что все новые элементы загружены
Варианты открывай новую вкладку всегда не прокатят :smile:
Жду ответа местных гуру ;D
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Gen345 [?]
; тут все легко и просто проблема будет далее;итак есть вкладка яндекса надо новый поиск в ней замутить
Код:
$url = "https://yandex.ru/search/?lr=213&text=%D1%82%D0%B2%D0%BE%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%D1%8B%D0%B9%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81"
$oIE = _IECreate($url)

Может быть лучше сделать так? Или я что-то не понял...? :smile:
 
Автор
G
Сообщения
35
Репутация
-1
alex33 сказал(а):
Gen345 [?]
; тут все легко и просто проблема будет далее;итак есть вкладка яндекса надо новый поиск в ней замутить
Код:
$url = "https://yandex.ru/search/?lr=213&text=%D1%82%D0%B2%D0%BE%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%D1%8B%D0%B9%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81"
$oIE = _IECreate($url)

Может быть лучше сделать так? Или я что-то не понял...? :smile:

Чет я тоже не понял ты предлагаешь в поиск забить строку потом взять URL и его уже в скрип ставить ?
но если ты это имел ввиду то не вариант мне надо не только при смене поиска отслеживать элементы но и при переключении страниц
там тоже начинка документа меняется URL меняется сразу а элементы грузятся еще и надо чтобы скрипт подождал пока они не загрузятся .

Но я нашел какой элемент за это на яндексе отвечает если кого интересует Тег BODY или объект HTMLBody
когда страницу переключаешь пока грузятся элементы Атрибут aria-busy=True
когда все элементы обновятся Атрибут aria-busy=false вот так можно на яндексе притормозить скрипт
но я пока не тестил нормально вроде этот атрибут иногда куда то исчезает то есть его нету в документе походу он ставится тогда когда именно клики делаешь
кароче можно пока с ним поработать но надеюсь подскажут лучше решение чтоб от браузера получать ответ а не из документа его брать

и еще мне не надо открывать всегда новую вкладку мне надо уже с существующей работать открыть вкладку и сделать одно действие на ней это фигня
а вот работать с одним документом(вкладкой ) который походу действий меняется это уже сложней и в этом у меня проблема _IELoadWait не отслеживает элементы а только полную перезагрузку документа а на яндексе когда переключаешь страницу там по сути меняется полностью страница и скрипт должен ждать пока изменения не закончатся
 
Верх