Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > WebBrowser отследить окончание загрузки


Автор: Экскалупатор 30.10.2011, 11:29
всем примет. столкнулся с такой проблемой:
делаю парсер для сайта, но данные на сайт грузятся через ajax, т.е. их нету в изначальном DOM, и они подгружаются скриптом после определенных действий. проблема в том что у меня не получилось получить от webBrowser-а вразумительный ответ о том что он что то загружает. если бы дело касалось просто страницы то тут все просто:
Код

while (browser.IsBusy || browser.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }



но этот код никак не реагирует на ajax. т.е. браузер не считает что он что то делает в это время. единственный найденный мной способ это вынести всю работу с браузером в отдельный поток и тупо усыплять основной поток приложения(форму) на время предполагаемой загрузки содержимого(время высчитывается чисто опытным путем), но это совсем не кошерно.

 как узнать что браузер загружает ajax(или выполняет какой либо иной скрипт) и дождаться окончания этого процесса?

Автор: Экскалупатор 31.10.2011, 16:50
неужели никто не сталкивался с этой проблемой? какие есть решения кроме того что я привел выше?

Автор: Lols 31.10.2011, 16:57
Я так понимаю, что скрипт не грузится вообще? Тогда зачем смотреть, когда наступит окончание процесса?

Автор: Экскалупатор 31.10.2011, 19:41
Цитата(Lols @  31.10.2011,  15:57 Найти цитируемый пост)
Я так понимаю, что скрипт не грузится вообще?

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

в том то и прикол, что скрипт грузится отлично. и отрабатывает, нужно отследить когда он(javascript) закончит загрузку ajax содержимого с сервера.

Автор: Voyager 31.10.2011, 20:31
Решал недавно такую проблему, в итоге сделал тупо в лоб - после DocumentCompleted запускаю backgroundWorker, в котором таймаут на несколько секунд, после чего скрипт уже успевал догрузить документ и можно было работать с текстом. Частный случай, мою задачу решил, дальше я не копал.

Автор: Экскалупатор 31.10.2011, 21:56
Voyager, да, я в первом посте описал такое решение(только у меня вся работа в отдельном потоке была), но оно мне не нравится, как то слишком коряво. мне кажется должно быть более "элегантное" решение.

Автор: diadiavova 3.11.2011, 20:08
Цитата(Экскалупатор @  31.10.2011,  17:50 Найти цитируемый пост)
неужели никто не сталкивался с этой проблемой? 

По поводу полной загрузки документа и ее отслеживания это вообще не единственная проблема. Например не так просто отследить документ, имеющий фреймовую структуру, поскольку событие DocumentCompleted будет вызывать не только документ, загруженный из основного окна, но и все документы, загруженные во фреймы. И еще кто там знает, с чем можно столкнуться в реальных документах.
Что касается конкретно твоей проблемы, то ожидать, что для этого существует какое-то событие, я думаю не стоит, поскольку вряд ли оно существует. Но если тебе известно имя переменной, в которой в которую загружен объект XmlHttpRequest, выполняющий запросы, окончания которых ты ждешь, то можно попробовать вытащить ссылку на него, и через определенные интервалы проверять состояние. Это не намного лучше того, что делаешь ты, но у тебя просто назначен интервал безо всяких проверок, и если сервер тормознет или по каким-то другим причинам за отведенное тобой время операция не завершится - будут проблемы. А так вроде как должно все быть нормально. 
Но не знаю, это просто идея, сам ее воплощать я не пробовал smile 

Автор: Экскалупатор 3.11.2011, 20:16
спасибо за совет, идея вполне здравая. надо как то опробовать будет.

Автор: diadiavova 3.11.2011, 23:09
Экскалупатор, а кстати ты не пробовал проверять значение readyState документа? Я тут малость пошаманил и выяснил, что проблема многфреймовых документов таким образом вполне решается, то есть это свойство основного документа будет иметь значение complete, только когда все фреймы загружены. Может с аяксом так же?

Автор: Экскалупатор 3.11.2011, 23:18
ну, не совсем уверен, делал так как в первом посте описано, там проверяется readyState(правда браузера), но это не спасало.

Автор: diadiavova 3.11.2011, 23:23
Цитата(Экскалупатор @  4.11.2011,  00:18 Найти цитируемый пост)
ну, не совсем уверен, делал так как в первом посте описано, там проверяется readyState(правда браузера), но это не спасало. 

А ну я не знаю, конечно, одно и то же они возвращают или нет, но видимо одно. Так что с аяксом это не прокатит.

Добавлено через 2 минуты и 16 секунд
Да, проверил с фреймами, это свойство браузера возвращает то же самое, что и у документа, так что точно не то.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)