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
测试
结果是Navigated次数才33次,还少1次,所以据此说明,之前的他人说法是不对的
据此方法来判断是否加载完也是不对的,
通过多方查找
有一种方法可以完全判断是否加载完成:
正在测试中