0 / 0 / 0
Регистрация: 22.11.2010
Сообщений: 51

Webbrowser Делать действие только после полной загрузки страницы

30.11.2011, 15:31. Показов 12735. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Мне не получается решить одну проблему. Я создаю автокликер, для этого использую WebBrowser. Все действия автокликера помещены в одну функцию. Для задержки вызова функции использую таймер.

Проблема заключается в том, что функция вызывается когда еще не загружена страница.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public Form1(){}
      private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
                {
                        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
                        {
                                tb_Url.Text = webBrowser1.Document.Url.ToString();
                                this.Text = webBrowser1.DocumentTitle;
                        }
                }
     private void btn_Klicker_Click(object sender, EventArgs e)
                {
                        Klicker();
                }
     private void timer1_Tick(object sender, EventArgs e)
                {
                        btn_Klicker.PerformClick();
                        timer1.Interval = random.Next(700, 1200);
                }
     private void Klicker() {}
     private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
                {
                        try
                        {
                                ts_PB1.Value = Convert.ToInt32(e.CurrentProgress);
                                ts_PB1.Maximum = Convert.ToInt32(e.MaximumProgress);
                        }
                        catch (Exception ex) { }
                }
 
     private void btn_T_start_Click(object sender, EventArgs e)
                {
                        timer1.Enabled = true;
                }
 
                private void btn_T_stop_Click(object sender, EventArgs e)
                {
                        timer1.Enabled = false;
                }
Вообщем проблема в том что, таймер вызывает функцию перед тем как страница загрузилась. Он Вызвал один раз функцию, функция кликнула, но если есть какая задержка, то таймер этого не фиксирует и вызывает функцию еще раз. Мне надо Чтобы перед вызовом, таймер фиксировал что страница не загрузилась, подождал, и тогда вызывал функцию.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2011, 15:31
Ответы с готовыми решениями:

Выполнить действие после загрузки страницы WebBrowser
У меня в форме есть webbrowser. Он переходит по определенной ссылке и нажимает там кнопку. После чего через 100 мс на странице появляется...

Отключить отображение страницы до полной ее загрузки в WebBrowser
Через веббраузер грузятся изображения, которые надо обновлять каждые 3 сек. После вызова Refresh страница очищается и грузится заново. Как...

Как сделать ожидание полной загрузки страницы в webbrowser?
Мне необходимо достать код страницы html из webbrowser в c#. С этим проблем не возникает. Если же страница после открытия еще догружает...

17
 Аватар для sau
2769 / 2069 / 386
Регистрация: 22.07.2011
Сообщений: 7,812
30.11.2011, 15:53
Ну так а почему бы не запускать таймер после загрузки страницы (по событию). ?
а в обработчиках типа btn_T_start_Click можно просто ставить признак того что таймер можно запускать.
З.Ы вообще я даже не уверен что тут таймер нужен, загрузился документ - кликнули, и так по циклу., но вам виднее.
0
0 / 0 / 0
Регистрация: 22.11.2010
Сообщений: 51
30.11.2011, 16:24  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
Ну так а почему бы не запускать таймер после загрузки страницы (по событию). ?
Вы имеете в виду, private void webBrowser1_DocumentCompleted ? Странно то что это событие не вызывается с самого начала, да и в ходе выполнения программы...
0
14 / 14 / 1
Регистрация: 23.06.2011
Сообщений: 34
01.12.2011, 00:35
я обычно вставляю функцию
C#
1
2
3
4
5
6
7
8
public void pause1()
        {
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
 
          }
        }
и такую, вместо таймера
C#
1
2
3
4
5
6
7
8
9
 public void pause(int vr)
        {
            double time = DateTime.Now.TimeOfDay.TotalMilliseconds;
            while ((DateTime.Now.TimeOfDay.TotalMilliseconds - time) < vr)
            {
                Application.DoEvents();
            }
 
        }
1
 Аватар для joker78rus
24 / 24 / 5
Регистрация: 04.10.2013
Сообщений: 46
05.08.2014, 15:42
C#
1
2
3
4
5
6
7
8
9
using System.Diagnostics;
 
private void Timer(int value)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            while (sw.ElapsedMilliseconds < value)
                Application.DoEvents();
        }
2
 Аватар для sau
2769 / 2069 / 386
Регистрация: 22.07.2011
Сообщений: 7,812
05.08.2014, 16:21
joker78rus
3 года прошло , нафига ? )
0
 Аватар для joker78rus
24 / 24 / 5
Регистрация: 04.10.2013
Сообщений: 46
05.08.2014, 19:45
sau, дык не только ты с такой проблемой столкнулся.... другим тоже полезно будет!
3
1 / 1 / 0
Регистрация: 19.09.2017
Сообщений: 17
21.10.2017, 10:08
sau, joker правду говорит
1
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 5
19.05.2018, 11:16
Вот сейчас как сталкер 2, оживляю тему =)

1) webBrowser1_DocumentCompleted вызывается на странице по несколько раз (после загрузки каждого фрейма), и после первого вызова код бежит дальше, не обращая внимания на дальнейшие загрузки и вызовы webBrowser1_DocumentCompleted в webBrowser, поэтому не выход. (А webBrowser1.ReadyState вообще где-то в параллельной вселенной инициируется видимо, его вообще опущу)
2) Джокеру большое спасибо, паузу его юзаю и в дело и не в дело, в различных её модификациях, но для решения ожидания загрузки подходит как топор для точки карандаша.
3) Поэтому решил, что нужен свой топор:
Смысл в том, чтобы проверять меняется ли количество элементов на странице, если не меняется, значит все загрузилось.
За возможную топорность кода даже не извиняюсь, я любитель-самоучка.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void wbPause()
        {
            Int64 neew = new long();
            Int64 olld = new long();
        L2:
            try
            {
                pause(1000); //даем секунду для начала загрузки страницы
                olld = 0;
            L1:
                pause();
                neew = 0;
//начинаем считать все HtmlElement'ы 
//тут если страница даже не начала грузиться, то возникнет System.NullReferenceException
                foreach (HtmlElement Pause in webBrowser1.Document.All)
                {
                    neew += 1;
                }
                if ((olld != neew)
                {
                    olld = neew;
                    goto L1;
                }
            }
//перехватываем нулевую страничку
            catch (System.NullReferenceException)
            {
                pause(60000);
                webBrowser1.Navigate("тут у нас URL, который не загрузился");
                goto L2;
            }
        }
Замечания?
0
 Аватар для sau
2769 / 2069 / 386
Регистрация: 22.07.2011
Сообщений: 7,812
19.05.2018, 11:27
Цитата Сообщение от TovDUDIKIN Посмотреть сообщение
Замечания?
только одно , у меня глаз задергался . удалите пожалуйста. (нет , не глаз , а этот кусок "кода")
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 5
19.05.2018, 11:55
Цитата Сообщение от sau Посмотреть сообщение
только одно , у меня глаз задергался . удалите пожалуйста. (нет , не глаз , а этот кусок "кода")
Не, пустой звон меня не интересует, конструктивные замечания требуются и приветствуются, независимо от эмоциональной окраски.
Мой "нубо-код" хоть как-то адаптируется под параметры рабочей станции и интернета конечного пользователя. А Вы в этой теме даже идеи в рабочем направлении не высказали, так что если конструктива нет - лучше глаз удаляйте =)
0
 Аватар для sau
2769 / 2069 / 386
Регистрация: 22.07.2011
Сообщений: 7,812
19.05.2018, 12:11
Цитата Сообщение от TovDUDIKIN Посмотреть сообщение
Смысл в том, чтобы проверять меняется ли количество элементов на странице, если не меняется, значит все загрузилось.
Так Ваш код поставленную задачу никак не решает - т.е тут куча логических ошибок и совершенно не те методы используются - тобишь рекомендация удалить его , самая что ни на есть конструктивная )
Да и постановка задачи странная , какая цель преследуется в конечном итоге ?

П.С webBrowser в целом устаревший компонент , есть более современные решения с большими возможностями.
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 5
19.05.2018, 12:29
Задача та же, что и в топике.
Решения с
Цитата Сообщение от import Посмотреть сообщение
webBrowser1_DocumentCompleted
или
Цитата Сообщение от import Посмотреть сообщение
webBrowser1.ReadyState != WebBrowserReadyState.Complete
не отрабатывают как нужно в конечном итоге, т.к. они не позволяют дождаться прогрузки всех элементов на странице.
К примеру webBrowser1_DocumentCompleted может инициироваться дважды, потому что страница грузит 2 фрейма.
но при этом второго инициирования webBrowser1_DocumentCompleted код формы, следующий после webBrowser1.Navigate не ждет, он начинает выполняться не смотря на то, что на страницу не загружен второй фрейм, т.е. отсутствует куча элементов. Мой "код" следит, меняется ли количество элементов на веб странице, и если оно перестало меняться, значит страница прогрузилась полностью.

П.С. в теме про webBrowser я описал возможное решение для webBrowser =) остальное - лирика. И да - возможно.
0
 Аватар для sau
2769 / 2069 / 386
Регистрация: 22.07.2011
Сообщений: 7,812
19.05.2018, 12:50
В топике совершенно другая проблема , там человек запускал асинхронный таймер который обращался к элементам документа еще до того , как тот был загружен. - т.е в целом подход неверный был.
А у Вас какая проблема ? - конечно , documentcompleted будет вызываться для каждого фрейма , потому как фрейм содержит свой элемент документа , и это нормально. А то , что Вы проверяете document.all - так это ни к селу ни к городу , оно к фреймам никакого отношения не имеет. , и это никак не значит что страница загрузилась полностью , более того , если на момент проверки кодом число элементов может совпадать , то через секунду эта ситуация может уже измениться - у вас нет синхронизации с работой браузера. - в общем , .... ноу комментс как говориться.

Если Вам нужна работа с каким то элементом во фрейме , так дождитесь его загрузки по событию и потом взаимодействуйте , к чему все эти непонятные велосипеды , которые еще и не работают к тому же.
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 5
19.05.2018, 13:18
да, после метки L1 время паузы стер случайно в pause().. надо pause(500) к примеру

П.С. вот сейчас конструктив =) но тем не менее, работает =)

Добавлено через 27 минут
пока что лучших вариантов по приостановке выполнения кода во время ожидания загрузки всех элементов веб страницы я не нашел на просторах англо- и рускоязычного интернета.
если Вы знаете как дождаться загрузки всех фреймов, то милости просим - решение на экран.
0
 Аватар для sau
2769 / 2069 / 386
Регистрация: 22.07.2011
Сообщений: 7,812
19.05.2018, 13:30
Получаете список фреймов на странице и отслеживаете событие загрузки , как только все события отработали по списку , так все. П.С Фреймы могут содержать другие фреймы - так что это все нужно проверять.
П.С П.С Но обычно такого извращения не требуется , т.к цели вполне конкретные , это не дождаться загрузки всего и вся , а дождаться загрузки вполне определенного элемента с которым нужно работать , и только.
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 5
19.05.2018, 13:41
Цитата Сообщение от hardor Посмотреть сообщение
я обычно вставляю функцию
C#
1
2
3
4
5
6
7
8
public void pause1()
        {
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
 
          }
        }
в общем hardor красавчик =)
если бы он еще пояснил, что его функцию просто после каждой загрузки страницы надо вставлять, а не в WbDocCompleted, например, было бы очень хорошо, не родилось бы мое чудовище =)

А Ваши рассуждения я и сам родил давно, с алгоритмами у меня все нормально, а вот с кодом не особо, вот и выкручиваюсь как могу =)
0
0 / 0 / 0
Регистрация: 29.10.2018
Сообщений: 1
04.12.2018, 12:10
Может будет полезно. Сделал ограничение цикла. Выход при превышении определенного интервала, если вдруг страница так и не загрузилась

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void Pause(int MaxSecondsWait)
        {
            DateTime time = DateTime.Now;
 
            while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
 
                if (DateTime.Now.Subtract(time).Seconds> MaxSecondsWait)
                {
                    break;
                } 
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.12.2018, 12:10
Помогаю со студенческими работами здесь

Ожидание полной загрузки страницы WebBrowser в статическом методе
Всем доброго времени суток! У меня есть класс, который использует компонент WebBrowser. У класса имеется статический метод, который...

Как выполнить действие после полной загрузки формы? События Load и Shown не подходят!
Добрый день, народ! Подскажите, пожалуйста! Как выполнить действие после ОКОНЧАТЕЛЬНОЙ И ПОЛНОЙ ЗАГРУЗКИ формы? Событие Load происходит...

Webbrowser Делать действие только после полной загрузки страницы
Здравствуйте! Мне не получается решить одну проблему. Я создаю автокликер, для этого использую WebBrowser. Все действия автокликера...

Ожидание полной загрузки страницы в WebBrowser
Доброго времени суток! Пишу, для своих нужд, прогу. Суть работы проги такова: заходим на нужную страницу, ждем полной загрузки страницы,...

Открыть 3 ссылки в webbrowser c ожиданием полной загрузки страницы
Нужно скачать видео с фейсбука через сайт www.getfvid.com, пример ссылки (https://www.facebook.com/heroesdelarte/videos/624498524644275/)...


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

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

Новые блоги и статьи
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
Конвейеры ETL с Apache Airflow и Python
AI_Generated 13.05.2025
ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .
Выполнение асинхронных задач в Python с asyncio
py-thonny 12.05.2025
Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . .
Работа с gRPC сервисами на C#
UnmanagedCoder 12.05.2025
gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru