最近写了个软件叫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没有完善的地方,咱们自己想办法呗。。。

转载于:https://www.cnblogs.com/hackpig/archive/2010/02/15/1668398.html

C# WebBrowser准确判断网页最终装载完毕相关推荐

  1. mfc webbrowser判断网页加载完成

    mfc 的webbrowser是大家使用非常多的一种查看操作网页的一种控件,在使用中,判断网页什么时候加载完成就显得非常重要了.下面介绍我采用的一种方法,这种方法可以判断网页内部即使有frame网页也 ...

  2. php判断网页编码,python判断网页编码的方法

    在web开发的时候我们经常会遇到网页抓取和分析,各种语言都可以完成这个功能.我喜欢用python实现,因为python提供了很多成熟的模块,可以很方便的实现网页抓取. 但是在抓取过程中会遇到编码的问题 ...

  3. webbrowser抓取php网页源码,获取webbrowser控件 网页的源码(收藏)

    获取webbrowser控件 网页的源码(收藏) 翻译|其它|编辑:郝浩|2005-04-28 09:45:00.000|阅读 3152 次 概述: 我在网上找到使用rft控件保存webbrowse文 ...

  4. 如何使用selenium webdriver来判断一个网页加载完毕

    想实现一个加载网页计时的功能,如何用selenium webdriver实现判断一个网页加载完毕? ================================================== ...

  5. php正文重复度,百度如何判断网页文章的重复度?两个页面相似度确认方法介绍...

    在这个科技高度发达的时代,百度已经成为人们能获取消息的主要途径.但如今的百度,到处充斥着一些重复的内容,对用户的访问造成很大的困扰.因此,百度需要对网页重复进行判断,对重复的网页,只选取一些高质量的我 ...

  6. JS判断网页广告是否被浏览器拦截过滤的代码

    这篇文章主要介绍了JS判断网页广告是否被浏览器拦截过滤的代码,需要的朋友可以参考下 本来现在投广告赚钱也不像前几年好做,现在还大部分浏览器都拦截了广告,很多浏览器还是默认拦截广告,做站长不是一般辛苦啊 ...

  7. php文章重复度检测,百度如何判断网页文章的重复度?两个页面相似度确认方法介绍...

    在这个科技高度发达的时代,百度已经成为人们能获取消息的主要途径.但如今的百度,到处充斥着一些重复的内容,对用户的访问造成很大的困扰.因此,百度需要对网页重复进行判断,对重复的网页,只选取一些高质量的我 ...

  8. JS判断页面加载完毕

    //JS判断页面加载完毕,再隐藏加载效果层,一个简单的JS加载效果.document.onreadystatechange = function () {if (document.readyState ...

  9. 根据 UserAgent 判断网页是在浏览器、或在微信、或在APP中

    1条回复 根据 UserAgent 是否存在 Android,或 iPhone 可以判断网页是运行在 苹果手机 或 微信手机中.具体是安卓的在 微信中.还是在浏览器中.还是在APP中,在iPhone的 ...

  10. python读取文件类型_python准确判断文件类型

    判断文件类型在开发中非常常见的需求,怎样才能准确的判断文件类型呢?首先大家想到的是文件的后缀,但是非常遗憾的是这种方法是非常不靠谱的,因为文件的后缀是可以随意更改的,而大家都知道后缀在linux系统下 ...

最新文章

  1. 最全芯片产业报告出炉,计算、存储、模拟IC一文扫尽
  2. Python 包管理之 poetry
  3. ubuntu安装postgreSQL 9.3
  4. 数据挖掘 -- 分类的模型评估度量
  5. ArchLinux On Win10
  6. interpreter_command_state pattern
  7. Qt 使用阿里图标库
  8. 李沐-动手学深度学习
  9. SSM项目之短信验证码登录
  10. 服务器浏览器怎么打不开网页,电脑能上qq打不开网页怎么回事?
  11. 一个足球队员的不屈抗争·《晚唱·贾平凹》
  12. 测试手机软件打开速度的app,一加6千分之一秒 百款APP打开速度对比
  13. 微信小程序用户登录信息过期处理
  14. 免费好用的录屏软件OBS-Studio
  15. 五子棋棋谱16*16c语言,五子棋开局棋谱大全
  16. 一个微信小程序的案例
  17. Anaconda Navigator卡logo打不开闪退问题处理方案-更换阿里云镜像源
  18. 创建一个简单的workflow工作流(WF4)
  19. BERT模型为什么这么强?
  20. 关于医学和计算机的论文,医学院校计算机教学论文

热门文章

  1. mac使用的文章合集 alfred利器
  2. 你用过Mybatis的动态SQL后,就知道写SQL有多爽了!
  3. 蚂蚁金服:开源增强版 SpringBoot 的研发框架!
  4. Redis+Nginx+设计模式+Spring全家桶+Dubbo+阿里P8技术精选文档
  5. 去阿里面试被问:如果是MySQL引起的CPU消耗过大,你会如何优化?
  6. 首席架构师眼中的架构应该是怎样的?
  7. 新年礼物 | 今天可以免费领取3980的Hadoop视频教程!
  8. 小程序发布,你方了么?
  9. angularjs ng-include
  10. hdoj1116【欧拉回路】