WebBrowser控件判断完全加载中DocumentCompleted和Navigated的关系

WebBrowser控件判断完全加载使用DocumentCompleted是有问题的,所以有人提出可以使用判断DocumentCompleted的次数和Navigated次数完全相等的方法判断是否完全加载

并提出每次都会Navigated在DocumentCompleted之前执行,

此方案在本人测试后发现此两事件没有必然关系,并且也没先后次序

测试原理:

定义2个全局变量用于记录两事件次数,并使用一个计时器,即时判断当前两全局变量

如果最后两个值不相等,那么两事件不是同时必然发生,

如果出现同一时刻 DocumentCompleted的次数大于Navigated,那么前者就不一定是在Navigated之后执行了,不能确定两者的顺序关系

测试代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
 
using System.Configuration;
using System.Web;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text.RegularExpressions;
 
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
 
using mshtml;
 
using SHDocVw;
 
namespace TestCrass
{
    public partial class Form5 : Form
    {
        System.Timers.Timer time = new System.Timers.Timer();
 
        int qunue = 0;//当前轮次
        int ced = 0;//DocumentCompleted次数
        int ned = 0;//Navigated次数
        int ning = 0;//Navigating次数
        public Form5()
        {
            InitializeComponent();
            time.Interval = 10;
            time.Enabled = true;
            time.Elapsed += new System.Timers.ElapsedEventHandler((ss, ee) => { button1_Click(ss,ee); });
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
           
            Invoke((ThreadStart)delegate()
          {
           //此刻ced比ned大,说明DocumentCompleted事件触发次数大于Navigated,所以Navigated可能后发生
                if (ned < ced)
                {
                    label5.Text = "第"+qunue.ToString()+"次有问题"+ned.ToString()+".."+ced.ToString();
                }
                
            });
 
        }
 
 
 
        private void Form5_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://item.taobao.com/item.htm?id=21926784253");
        }
 
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            ced++;
            label4.Text = "ced" + ced.ToString();
            if (webBrowser1.DocumentText.Contains("无法显示该网页") || webBrowser1.DocumentText.Contains("已取消") || webBrowser1.DocumentText.Contains("可以尝试以下操作"))
            {
                webBrowser1.Refresh();
                return;
            }
            //time.Enabled = true;
            //button1_Click(null, null);
 
 
        }
 
        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            ned++;
            label3.Text = "ned" + ned.ToString();
        }
 
        private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
        {
            ning++;
            qunue++;
            label1.Text = "qunue" + qunue.ToString();
            label2.Text = "ning" + ning.ToString();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate(textBox1.Text);
 
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            ced = 0;
            ned = 0;
            ning = 0;
            qunue = 0;
            label1.Text = "";
            label2.Text = "";
            label3.Text = "";
            label4.Text = "";
        }
    }
}

测试淘宝,如之前的错误结论,可以通过测试,

捕获

找个复杂点的网站 www.163.com

测试

捕获2

结果是Navigated次数才33次,还少1次,所以据此说明,之前的他人说法是不对的

据此方法来判断是否加载完也是不对的,

通过多方查找

有一种方法可以完全判断是否加载完成:

正在测试中

原文地址:https://www.cnblogs.com/sung/p/2849059.html