Событие WebBrowser DocumentCompleted, выпущенное более одного раза

Я ReadyState этот материал, и все, похоже, согласны с тем, что решение заключается в проверке ReadyState веб-браузера, пока не будет установлено значение Complete.

Но на самом деле событие иногда запускается, когда ReadyState установлен в Complete несколько раз.

Я не думаю, что есть решение с этим crappy .NET WebBrowser, но может быть и одно, если я использую базовый компонент DOM.

Проблема только в том, что я не знаю, как получить доступ к компоненту DOM за веб-браузером, который запускает событие DocumentCompleted.

DocumentCompleted будет запускаться для каждого кадра на веб-странице. Трудный способ – отсчет кадров, показывает вам, как получить доступ к DOM:

 private int mFrameCount; private void startNavigate(string url) { mFrameCount = 0; webBrowser1.Navigate(url); } private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { mFrameCount += 1; bool done = true; if (webBrowser1.Document != null) { HtmlWindow win = webBrowser1.Document.Window; if (win.Frames.Count > mFrameCount && win.Frames.Count > 0) done = false; } if (done) { Console.WriteLine("Now it is really done"); } } 

Простым способом является проверка URL-адреса, который завершил загрузку:

 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.Equals(webBrowser1.Url)) { Console.WriteLine("Now it is really done"); } } 

Это, вероятно, произойдет, если страница использует Javascript или для перенаправления на другую страницу.

Если это так, нет хорошего способа обхода.

Я не могу найти ничего, что даст 100% уверенности. Упомянутый пример (e.Url.Equals (webBrowser1.Url)) может работать для простого WebBrowser.Navigate (url), однако в моем случае я нажимаю узлы в коде, чтобы открывать новые кадры в существующих фреймах. В основном количество раз «Навигация» и «Документированный» огонь будет одинаковым, но снова НЕ всегда. «isBusy = false» и «ReadyState = Complete» всегда будет иметь место, когда он будет завершен (по крайней мере до сих пор), но он также несколько раз имеет это состояние, когда он все еще загружается. Подсчет кадров также кажется бесполезным для меня, в одном случае DocumentCompleted запускается 23 раза, однако все кадры и суб (-под-sub и т. Д.) Кадры составляют 14.

Единственное, что, кажется, работает, – это ждать короткого периода (1 или 2 секунды?), Чтобы увидеть, что произойдет (любые события уволены, любые изменения состояния).

Хм, я нашел другое решение для меня. Часто нам не интересно загружать всю страницу, часто мы хотим, чтобы некоторые элементы существовали. Поэтому после каждого DocumentCompleted и когда «isBusy = false» и «ReadyState = Complete» мы можем искать DOM, если этот элемент существует.

  • ItemsControl с горизонтальной ориентацией
  • Тихие сбои в C #, казалось бы, необработанные исключения, которые не приводят к сбою программы
  • Отобразить массив цветов в C
  • Как проверить, содержит ли строка символ в C #?
  • Не уникальные значения enums
  • Можно ли вызвать функцию C из C # .Net
  • C # отправка писем со встроенными изображениями с использованием SmtpClient
  • Создание презентаций PowerPoint программно
  • Как вы загружаете файл в библиотеку документов в sharepoint?
  • Зачем следует избегать функции system () в C и C ++?
  • Могу ли я преобразовать значение строки C # в экранированный строковый литерал
  • Interesting Posts

    Попытка запуска нескольких HTTP-запросов параллельно, но ограничена Windows (реестром)

    Получить дополнительные данные из структуры MVC5. Поставщик идентификации OAuth / OWin с внешним поставщиком авторизации

    Частичный class в разных пространствах имен

    Выбрать несколько изображений из галереи Android

    Доступ / изменение переменной пути пользователя, а не пути к системе

    Как удалить строки между ListViews на Android?

    Как исправить: «HAX не работает, а эмулятор работает в режиме эмуляции»

    Что такое личные байты, виртуальные байты, рабочий набор?

    mySQL долгота и запрос широты для других строк в радиусе x мили

    Как глубоко наблюдать массив в angularjs?

    Когда приложение iOS переходит в фоновый режим, приостановлены ли длительные задачи?

    В чем смысл нореткин?

    Преобразование frameworks предварительного просмотра в bitmap

    Как создать кросс-платформенный диск с TrueCrypt

    Каков наиболее эффективный с точки зрения затрат (надежный) способ установить 200-метровую линию Ethernet?

    Давайте будем гением компьютера.