您的位置:首页 > 其它

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

2013-01-07 12:42 567 查看
WebBrowser控件判断完全加载使用DocumentCompleted是有问题的,所以有人提出可以使用判断DocumentCompleted的次数和Navigated次数完全相等的方法判断是否完全加载

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

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

测试原理:

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

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

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

测试代码:

usingSystem;


usingSystem.Collections.Generic;


usingSystem.ComponentModel;


usingSystem.Data;


usingSystem.Drawing;


usingSystem.Linq;


usingSystem.Text;


usingSystem.Threading;


usingSystem.Windows.Forms;




usingSystem.Configuration;


usingSystem.Web;


usingSystem.Net;


usingSystem.Net.Sockets;


usingSystem.IO;


usingSystem.Text.RegularExpressions;




usingSystem.Web.Security;


usingSystem.Web.UI;


usingSystem.Web.UI.HtmlControls;


usingSystem.Web.UI.WebControls;




usingmshtml;




usingSHDocVw;




namespaceTestCrass


{


publicpartialclassForm5:Form


{


System.Timers.Timertime=newSystem.Timers.Timer();




intqunue=0;//当前轮次


intced=0;//DocumentCompleted次数


intned=0;//Navigated次数


intning=0;//Navigating次数


publicForm5()


{


InitializeComponent();


time.Interval=10;


time.Enabled=true;


time.Elapsed+=newSystem.Timers.ElapsedEventHandler((ss,ee)=>{button1_Click(ss,ee);});




}




privatevoidbutton1_Click(objectsender,EventArgse)


{




Invoke((ThreadStart)delegate()


{


//此刻ced比ned大,说明DocumentCompleted事件触发次数大于Navigated,所以Navigated可能后发生


if(ned<ced)


{


label5.Text="第"+qunue.ToString()+"次有问题"+ned.ToString()+".."+ced.ToString();


}




});




}








privatevoidForm5_Load(objectsender,EventArgse)


{


webBrowser1.Navigate("http://item.taobao.com/item.htm?id=21926784253");


}




privatevoidwebBrowser1_DocumentCompleted(objectsender,WebBrowserDocumentCompletedEventArgse)


{


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);






}




privatevoidwebBrowser1_Navigated(objectsender,WebBrowserNavigatedEventArgse)


{


ned++;


label3.Text="ned"+ned.ToString();


}




privatevoidwebBrowser1_Navigating(objectsender,WebBrowserNavigatingEventArgse)


{


ning++;


qunue++;


label1.Text="qunue"+qunue.ToString();


label2.Text="ning"+ning.ToString();


}




privatevoidbutton2_Click(objectsender,EventArgse)


{


webBrowser1.Navigate(textBox1.Text);




}




privatevoidbutton3_Click(objectsender,EventArgse)


{


ced=0;


ned=0;


ning=0;


qunue=0;


label1.Text="";


label2.Text="";


label3.Text="";


label4.Text="";


}


}


}


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





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

测试





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

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

通过多方查找

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

正在测试中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: