C# WebBrowser准确判断网页最终装载完毕

==

最近写了个软件叫WebAutoScript,目的用于,网页的自动操作处理,就是说,所有你在网页上面的操作,都可以录到一个脚本中,然后可以回放这个操作过程。。我是说任何过程。

程序是用C#写的,其中遇到了一个难题,对于网页,我是用C#内置的WebBrowser控件控制,但是这个控件有个问题,就是不能准确判断网页什么时候最终装载完毕,如果这个不能判断的话,我根本不可以判断什么时候执行下一个动作,因为网页还没有打开,不可能去点击还没有出现的按钮等。。。google了海内外,竟然没有人搞定过,除非不用这个控件,虽然有别的控件可以,如AxWebBrowser,但是用另外的控件,又会出现另外的问题,所以最后决定还是用内置的WebBrowser,但是怎么解决这个难题呢。。。

为什么这个控件不能准确判断网页什么时候装载完毕呢,那是因为现在的网页一般都有多个frame,一个frame相当于另一个网页,在不断装载,消息不断的触发,所以难以判断触发完成的是那个网页。。。

网上一般都是说根据Browser_DocumentCompleted,Browser_Navigated,Browser_Navigating这三个消息来判断的,用什么计数器啦,还有判断IsBusy,StatusText等。。以上或多或少对于一些网页是可行的,对于另一些网页却又有另外的意外,所以总的来说,不能通用准确。。。

总得来说,一个网页最终装载完毕,不管它里面多少个frame,最终完成只有一次,也是可以提供给程序可以执行下一步操作的消息。

怎么解决呢,其实,WebBrowser的工作机制大概是这样的,在url上打上www.163.com,这时候,WebBrowser会开始装载www.163.com这个网页,触发一个Browser_Navigating,ReadyState置为非Complete,IsBusy置为true,StatusText置为"请求的url内容",这个文档完毕后,触发一个Browser_DocumentCompleted,同时,ReadyState置为Complete,IsBusy置为false,StatusText置为"完成",如果通常都会有frame,如www.163.com/kk.jsp#fsd什么的,WebBrower就会触发Browser_Navigating,ReadyState置为非Complete,IsBusy置为true,StatusText置为"请求的url内容",再去装载那个frame,完毕后,触发一个Browser_DocumentCompleted,同时,ReadyState置为Complete,IsBusy置为false,StatusText置为"完成",剩下的frame,余次类推。

上面的过程有一个特点,从主文档到frame的过程,ReadyState置为Complete,IsBusy置为false,StatusText置为"完成",这个时间是很短的,Browser_DocumentCompleted触发一下就过去了,如果还有frame,很快就会把状态搞成非完成,所以根据这个特点。。。我们可以找一种方法来判断什么时候才是最终完成。。。

我的方法是:在WebBrowser开始装载www.163.com这个网页的时候,触发Browser_Navigating的时候,我打开一个timer,在那里监控,Interval为200ms,如果MainBrowser的ReadyState
== WebBrowserReadyState.Complete && IsBusy ==
false的话,证明现在有两种情况,WebBrowser已经最终装载完毕,或者是刚装载完结一个,很快就会装载另外一个frame,不管,先记录这时候的DocumentText,DocumentTitle,DocumentTitle,Url,等到下一个200ms,timer再判断现在的WebBrowser的ReadyState
== WebBrowserReadyState.Complete && IsBusy ==
false,如果不成立,则把记录的状态清掉,那些DocumentText,现在肯定还没有到最终完成状态啦,但是,如果成立的话,把现在的WebBrowser的状态和上一次timer记录的状态对比,如果不相等,那也只能说明还没有到达最终状态,如果相同,设置一个记数器,加1,就这样,如果这个计数器最终能够达到5次,就说明WebBrowser最终完成装载了。。。简单的说,就是加多一个timer来监控WebBrowser几个重要状态值,如果在5*200ms一秒内,其状态没有变化过,就证明,其已经最终装载完毕。。。

这种方式,百试百灵,没有遇到过误判的情况,呵呵,强吧,MS没有完善的地方,咱们自己想办法呗。。。

#◆c#◆

C# WebBrowser准确判断网页最终装载完毕,布布扣,bubuko.com

时间: 2024-10-12 10:30:18

C# WebBrowser准确判断网页最终装载完毕的相关文章

Webbrowser控件判断网页加载完毕的简单方法 (转)

摘自:http://blog.csdn.net/cometnet/article/details/5261192 一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕.但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕. 从微软的官方网站上了解到,并非每个frame都对应了一个DocumentCompleted事件,只有触发了Down

Webbrowser控件判断网页加载完毕的简单方法

一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕.但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕.从微软的官方网站上了解到,并非每个frame都对应了一个DocumentCompleted事件,只有触发了DownloadBegin事件的frame才会有相应的DocumentCompleted事件.另外,最外层的frame总是最

VB判断webbrowser网页加载完毕

'====VB判断webbrowser网页加载完毕 Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant) If (pDisp Is WebBrowser1.Object) Then Msgbox "网页下载完毕!" End If End Sub

js判断网页是否加载完毕 包括图片

<script type="text/javascript" language="JavaScript"> //: 判断网页是否加载完成 document.onreadystatechange = function () { if(document.readyState=="complete") { document.getElementById('divprogressbar').style.display='none'; } }

MFC WebBrowser判断网页加载完成

mfc 的webbrowser是大家使用非常多的一种查看操作网页的一种控件,在使用中,判断网页什么时候加载完成就显得非常重要了.下面介绍我采用的一种方法,这种方法可以判断网页内部即使有frame网页也是可以判断成功.在对话框里添加一个webbrowser控件,在对话框的初始化函数OnInitDialog()中加入web控件默认加载的网页. //禁用IE脚本错误 m_web.put_Silent(TRUE); //默认打开百度网页 m_web.Navigate(L"https://www.baid

学习——伪类+js实现css3 media queries跨界准确判断

本文转自:http://www.zhangxinxu.com/wordpress/?p=2387 media queries可以让设备在不同尺寸下应用不同的css样式.布局等.以适应手持设备.普屏显示器.宽屏显示器,以及未来冰箱上的联网显示器,汽车上的数码设备等.然后,仅仅通过css做布局可能无法应对所有的交互请求. 举个简单的例子,我们打开浏览器可能处于非最大化状态,此时,如果作为普屏处理,加载的图片可能就是128*128的小尺寸图片.但是,当我们最大化以获得更好阅读体验的时候,需要使用更大尺

webBrowser中操作网页元素全攻略

webBrowser中操作网页元素全攻略 2012-12-20 14:21 188人阅读 评论(0) 收藏 举报 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBrowser1.Document.GetElementById("控件ID").InnerText; 或webBrowser1.Document.GetElementById("控件ID").GetAttr

ios开发问题,经验证,textview的contentsize.height不能准确判断高度

IOS7环境中,设置UITextView.text并不能立即更新contentSize,再用textView.contentSize.height无法获取当前内容的高度.采用以下方法可以解决这个问题. 1 2 3 4 5 6 7 8 9 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {                  CGRect textFrame=[[self.textView layoutManager]u

JS判断页面加载完毕

//JS判断页面加载完毕,再隐藏加载效果层,一个简单的JS加载效果. document.onreadystatechange = function () { if (document.readyState == "complete") { var page = DF.URLHash.get("page"); if (typeof (page) != "undefined" && page != "page1.html&q