==

最近写了个软件叫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# WebBrowser准确判断网页最终装载完毕的更多相关文章

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

    摘自:http://blog.csdn.net/cometnet/article/details/5261192 一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,W ...

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

    一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕.但当加载的网页包含fra ...

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

    <script type="text/javascript" language="JavaScript"> //: 判断网页是否加载完成 docum ...

  4. C#使用WebBrowser对指定网页截图

    使用webbrowser获取html,然后输出的位图即可. WebBrowser wb = new WebBrowser(); // 创建一个WebBrowser wb.ScrollBarsEnabl ...

  5. JS判断网页是否在微信中打开/

    JS判断网页是否在微信中打开,代码如下: <script type="text/javascript"> function is_weixn(){ var ua = n ...

  6. jQuery判断网页中的id是否有重复的

    From:http://blog.csdn.net/china_skag/article/details/6915323判断网页中的ID是否有重复的:指定ID判断 $(function(){ $(&q ...

  7. Ifvisible.js – 判断网页中的用户是闲置还是活动状态

    ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...

  8. 关于Chrome(谷歌浏览器)对docume,准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top

    对于document.compatMode,很多朋友可能都根我一样很少接触,知道他的存在却不清楚他的用途.今天在ext中看到 document.compatMode的使用,感觉这个对于我们开发兼容性的 ...

  9. webBrowser中操作网页元素全攻略

    原文 webBrowser中操作网页元素全攻略 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBr ...

随机推荐

  1. PHP面向对象基础知识总结

    1.类的变量成员叫做“属性”,或者叫“字段”.“特征”,在本文档统一称为“属性”.2.属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之 ...

  2. Linux课本第一二章

    一.第一章:Linux内核简介 1.操作系统和内核:操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分,包括内核.设备驱动程序.启动引导程序.命令行shall等. 内核就是操作系统的核心, ...

  3. Maven实站读后感

    这本书是一本非常经典的Maven教程,通俗易懂,同时介绍的东西十分实用,在工作上都能用到. 以前在公司里面需要要问同时的有关的Maven的问题,都可以自己解决了. 除了最基本的,以后自己可能要用到的: ...

  4. 虚拟机备份转移后,网络启动异常,提示“SIOCSIFADDR: No such device”的解决方案

    虚拟机管理软件:Oracle VirturalBox Manager 4.0.8 虚拟机:Ubuntu Server 10.10 i386 The problem lies in the fact t ...

  5. mongodb 的安装历程

    mongo 安装历程 mongo的安装方法有千万种,只有一种让我觉得还不错,说说安装过程中的一点心德. 方法一:源码安装,千万别用这种方法,尼马我用虚拟机编译了一下午,竟然没有编译完,强制关机,第二天 ...

  6. shell脚本积累

    统计当前目录下文件夹的大小 for d in $(ls) do du -sh ./$d done 获取之前日期date  +"%Y%m%d" -d  "-n days&q ...

  7. 【块状树】BZOJ 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 826  Solved:  ...

  8. [设计模式] 18 备忘录模式Memento Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...

  9. 关于make: *** No rule to make target `clean'. Stop.的解决

    在重新编译makefile工程文件时需要用到 #make clean 命令, 但是最近工程使用make clean的时候总是提示: make: *** No rule to make target ` ...

  10. jsp的常用指令有哪些(编译指令/动作指令整理)

    jsp的常用指令有哪些(编译指令/动作指令整理) JSP动作指令 JSP - JSP中的脚本.指令.动作和注释