С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
dred_d
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 7
1

WebBrowser не отдает страничку после Navigate (цепочка переходов)

05.03.2014, 12:36. Просмотров 1596. Ответов 12
Метки нет (Все метки)

Задача по парсингу сайта.
Часть переходов - это подгрузка через Ajax данных на ту же страничку по ссылке, а часть переходов обычные уникальные ссылки.
На каком-то из этапов после выполнения WebBrowser.Navigate (Url) WebBrowser просто ничего не отображает: белая страничка и все. Посмотрел где обрывается: в Navigating (событие перед началом навигации) еще заходит, а вот в уже в Navigated (после навигации) уже не попадает (естественно, в DocumentCompleted в этом случае так же не попадает).
Виснуть может на любом из этапов цепочки переходов: первую страничку перехода отображает всегда, а вот начиная со второй, может произойти описанное выше, причем каждый раз это может быть вторая, третья или еще какая-то страничка при переходе. Попробовал проанализировать и увидел, что при парсинге аналогичного сайта, который обрабатывается как часики, в DocumentCompleted попадает обработка ссылки “about: blank”, а вот с этим проблемным сайтом в DocumentCompleted “about: blank” ни разу не было, может в этом проблема?...
Вообщем буду признателен за советы.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2014, 12:36
Ответы с готовыми решениями:

WebBrowser.Navigate: Как без сообщения прочитать документ?
Извиняюсь, если повторюсь, но не нашла ответа на свой вопрос, или плохо искала)...

WebBrowser полностью игнорирует вызовы Navigate(),GoHome(),Stop() и т.д
Прошу вашей помощи. На форме висит webBrowser. Загружаю через него любой сайт -...

Распарсить страничку в webBrowser
Доброго времени всем! Вопрос, есть форма на которой есть webBrowser и левее...

Оценить, выгодна ли сделка, если известно что в результате переходов лодырь отдает все свои деньги
У моста через речку встретились лодырь и чёрт. Лодырь пожаловался на свою...

Переделать из HttpWebRequest в WebBrowser.Navigate
Добрый день, подскажите как переделать эту функцию для запроса через...

12
Водяной Змей
Заблокирован
05.03.2014, 16:13 2
Что за сайт?

И попробуйте, например, WebKitBrowser (Chrome) или Gecko (FF) вместо WebBrowser.
0
dred_d
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 7
05.03.2014, 17:59  [ТС] 3
спасибо за оперативный ответ:
1. По WebKitBrowser (Chrome) или Gecko (FF): стараюсь без крайней необходимости не использовать сторонних компонент, кроме того, предварительный анализ показал, что здесь могу возникнуть проблемы с передачей аргументов в Java-функцию, а у меня в проекте такое есть и не очень хочется переделывать под альтернативные компоненты.
2. Относительно сайтов: проект – это автокликер обновления объявлений на нескольких сайтах. На одном из сайтов собственники, я так понял, разругались между собой и появился клон оригинального сайта, который фактически зеркало оригинала.
Так по оригинальному сайту у меня все великолепно срабатывает, начиная от автовхода и до обновления объявлений без сбоев, а на копии начинаются спотыкания описанные выше.
Оригинальный сайт: http://klumba.ua/
Копия оригинала: http://klumba-ua.com/

Добавлено через 46 минут
кажется, проблема в том, что WebBrowser перейдя не первую ссылку дальше пытается переходить по следующим ссылкам не дождавшись загрузки предыдущих документов и из-за этого его в каком-то событии и клинит. DocumentCompleted очень простой:

C#
1
2
3
4
5
6
7
8
9
private void webBrowserMain_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
      {
         // избегаем многократного срабатывания этого события
         if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;
 
         if (!(e.Url.ToString().StartsWith("http://") || e.Url.ToString().StartsWith("https://"))) return;  // для Ajax
 
         nPage();
      }
где nPage(); - метод, который содержит переход на следующую страницу.
Получается, что nPage(); срабатывает когда предыдущая ссылка еще не полностью загружена, хотя по приведенному коду такого не должно происходить…
0
quakeer
26 / 26 / 27
Регистрация: 25.07.2013
Сообщений: 138
05.03.2014, 18:04 4
Привет.
Когда высвечивается белая страница - попробуйте кликнуть в программе по webbrowser правой кнопкой мыши и выбрать "просмотр html кода", что-нибудь покажет?
0
dred_d
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 7
05.03.2014, 18:11  [ТС] 5
попробовал только что: оказывается на этой белой страничке встроенное меню движка браузера не доступно (ничего не происходит по клику правой кнопкой мыши), хотя если не первой страничке клацнуть, то там еще доступно стандартное всплывающее меню IE.
0
quakeer
26 / 26 / 27
Регистрация: 25.07.2013
Сообщений: 138
05.03.2014, 18:15 6
А если поставить:
C#
1
webBrowser1.IsWebBrowserContextMenuEnabled = true;
Добавлено через 3 минуты
Цитата Сообщение от dred_d Посмотреть сообщение
кажется, проблема в том, что WebBrowser перейдя не первую ссылку дальше пытается переходить по следующим ссылкам не дождавшись загрузки предыдущих документов и из-за этого его в каком-то событии и клинит.
Наврядли это так, потому что событие DocumentCompleted происходит только после окончания загрузки страницы, так что когда выполнение кода происходит в событии в это время документ уже считается загруженным, правда может быть другой вариант, если вы используете потоки.
0
dred_d
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 7
05.03.2014, 18:26  [ТС] 7
сделал
C#
1
webBrowser1.IsWebBrowserContextMenuEnabled = true;
не помогло (нет всплывающего меню), к тому же эта опция включена у меня в самом визуальном компоненте webBrowser.
Такое ощущение, что процесс отваливается, но при этом ошибка поглощается.
DocumentCompleted – не совсем простое: если есть фреймы, то это событие для одной ссылки может отрабатывать несколько раз, но от этого сделал защиту:
C#
1
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;
но она не работает, если данные динамически подгружаются JAVA-скриптом, поэтому появилась строчка:
C#
1
if (!(e.Url.ToString().StartsWith("http://") || e.Url.ToString().StartsWith("https://"))) return;  // для Ajax
Здесь сам факт интересует: что делает webBrowser и где он спотыкается, элементарные же вещи: циклический переход по ссылкам.
0
quakeer
26 / 26 / 27
Регистрация: 25.07.2013
Сообщений: 138
06.03.2014, 11:10 8
А у вас какая версия студии? Просто я сколько не пробовал задавать адреса через Navigate у меня так и не получилось увидеть пустую страницу, как только не пробовал. (VisualStudio2013)
0
dred_d
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 7
06.03.2014, 11:35  [ТС] 9
1) у меня VisualStudio 2010.
2) прикрепил эмуляцию моей ошибки. После нескольких запусков скомпилированного *.exe-ника у меня начинает появляться белое окно WebBrowser без какой-либо информации, то есть он виснет. Можете у себя попробовать?
0
Вложения
Тип файла: rar AdTest.rar (17.4 Кб, 9 просмотров)
dred_d
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 7
06.03.2014, 14:20  [ТС] 10
интересное наблюдение: если перед проблемным сайтом автоматически в этом WebBrowser обрабатываются иные сайты, то зачастую ошибка не возникает. Можете что-то с Cookie в текущей сессии заставляет стопориться WebBrowser…
0
quakeer
26 / 26 / 27
Регистрация: 25.07.2013
Сообщений: 138
06.03.2014, 14:57 11
Вот что у вас в браузере, когда белая страница:
Javascript
1
<script defer onreadystatechange='google.loader.domReady()' src=//:></script>
Добавлено через 32 секунды
Может на что натолкнет

Добавлено через 6 минут
То есть по идее вы запрещаете выполнять скрипт, в результате чего ничего не происходит.
0
quakeer
26 / 26 / 27
Регистрация: 25.07.2013
Сообщений: 138
06.03.2014, 16:38 12
Лучший ответ Сообщение было отмечено dred_d как решение

Решение

Решил использовать таймер - у меня загрузились все ссылки до последней Попробуйте у себя, должно работать, только поиграйтесь с задержкой таймера для правильного выполнения.
1
Вложения
Тип файла: rar ADTest_timer.rar (53.6 Кб, 16 просмотров)
dred_d
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 7
06.03.2014, 17:54  [ТС] 13
1. Да я читал о “временной петле” решения проблемы отслеживания подгрузки данных через AJAX. Часто еще совершенствуют такой подход тем, что в событии таймера Tick проверяют дополнительно наличие на странице некого элемента, но способ не универсальный и требует фактически программирование каждой из загружаемых страниц.
2. По
C#
1
<script defer onreadystatechange='google.loader.domReady()' src=//:></script>
мне сложно пока определить как эту информацию использовать для решения проблемы, но чисто интуитивно добавление в
C#
1
2
3
4
private void webBrowserMain_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
   webBrowserMain.Stop();
}
снизило на порядок частоту возникновения проблемы.

Вывод сделал такой: суть проблемы – это отсутствие на текущий момент в webBrowserMain_DocumentCompleted универсального кода проверки загрузилась ли страничка полностью или нет (через AJAX). За такой вердикт говорит то, что применение “временной петли” значительно уменьшает частоту возникновения проблемы.
Поэтому на текущий момент дописал в проект решение с “временной петлей”, которое Вы посоветовали + оставил в Navigating webBrowserMain.Stop();
Если же кто-то поделится универсальным кодом для DocumentCompleted проверки полной загрузки страницы (наверное, через AJAX), то будет здорово.
0
06.03.2014, 17:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 17:54

WebBrowser: не работает метод Navigate
Поместил на форму компонент WebBrowser. Метод webbrowser1.Navigate('1.html');...

WPF приложение вообще поддерживает WebBrowser.Navigate
Вообщем! Сделал простенькую прогу по запуску игрульки одной (ланчер карочи) и...

WPF WebBrowser.Navigate() дождаться загрузки страницы
В своей программе использую контрол WebBrowser. В цыкле загружаю страницы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru