Событие WebBrowser DocumentCompleted запущено несколько раз

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

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

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

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

8
задан paqogomez 23 April 2015 в 19:03
поделиться

2 ответа

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");
    }
}
32
ответ дан 5 December 2019 в 05:18
поделиться

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

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

0
ответ дан 5 December 2019 в 05:18
поделиться