为什么.NET WebBrowser DocumentCompleted会为microsoft.com激发太多次?

时间:2012-03-16 03:25:16

标签: c# webbrowser-control

我试图使用.NET WebBrowser控件并遇到一个常见问题 - 如何判断页面何时完全加载?我看了看这里,然后我看了谷歌,发现了很多例子和问题,所以我试了一下。我试图导航的第一个地方是http://www.microsoft.com。它没有那么好。

我的代码如下。我尝试了两种不同的方法 - 一种使用Url比较,另一种使用计数帧。两者都没有像我预期的那样工作......我在Text值中得到了“Form1 - Done - Done - Done - Done”,这意味着页面以某种方式完成了几次。

是否有更好,更可靠的方法可用于复杂的网页?

这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WebBrowserCompleted
{
    public partial class Form1 : Form
    {
        Uri navTarget = new Uri(@"http://www.microsoft.com");

        public Form1()
        {
            InitializeComponent();
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //webBrowser1.Navigate(navTarget);
            startNavigate(@"http://www.microsoft.com");
        }

        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");
                this.Text = this.Text + " - Done";
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题......我在DocumentCompleted事件的开头抛出了这段代码,以减少攻击。

它大大减少了问题,但对于100%的网站来说仍然不一定完美。

代码:

If Me.wbDebugMain.ReadyState <> WebBrowserReadyState.Complete Then
    Exit Sub
End If