c#如何判断webbrowser已经加载完毕
最近有个小程序需要采集网页源代码,但有的网页中JS脚本又会生成额外的代码,比如http://www.cnblogs.com/lidabo/p/4169396.html
红框部分便是另外加载的代码。
此处可以看到web前端是有 "操作系统" 几个字的,但查看网页源代码之后却搜不到这几个字
C#有个webbrowser控件可以等网页加载完之后获取浏览器上所有的网页源代码(也包括额外被JS加载进来的代码)
【第一次】试验
WebBrowser webBrowser1 = new WebBrowser();
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://www.cnblogs.com/lidabo/p/4169396.html");
//加载完毕后触发事件webBrowser1_DocumentCompleted
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}
private void webBrowser1_DocumentCompleted(object sender, EventArgs e)//这个就是当网页载入完毕后要进行的操作
{
//将webBrowser显示的代码传入richTextBox以便调试
richTextBox1.Text = webBrowser1.DocumentText;
}
结果:webbrowser加载完这个页面之后,richTextBox1.Text获取的代码里面找不到 "操作系统" 几个字 , 获取的代码有1063行
网页在加载的过程中,webBrowser1_DocumentCompleted可能会触发一次以上,且相同网页可能触发次数不尽相同
有的网页会多次触发webBrowser1_DocumentCompleted,腾讯网http://www.qq.com触发了4次
【第二次】试验
public int i;//设置全局变量i
private void webBrowser1_DocumentCompleted(object sender, EventArgs e)
{
i++;//以便观察这个事件被触发了多少次
richTextBox1.Text = webBrowser1.DocumentText;
}
结果:最后 i 的值为 1,richTextBox1.Text获取的代码里面依然找不到 "操作系统" 几个字 , 获取的代码有1063行
按理来说不应该只触发一次、
【第三次】试验
private void webBrowser1_DocumentCompleted(object sender, EventArgs e)
{
MessageBox.Show("111");//这个得迅速点掉确定才看到触发了多少次messagebox
richTextBox1.Text = webBrowser1.DocumentText;
}
结果:迅速点掉messagebox的“确定”后又出现了一次messagebox,即一共两次触发了webBrowser1_DocumentCompleted事件
实验触发二次webBrowser1_DocumentCompleted事件,里面可以找到"操作系统"几个字,代码共有2095行,这次应该全部获取完毕了
加入没有迅速点掉messagebox,可能这个等待过程中,网页可能被webbrowser真的完全加载完毕从而不再触发webBrowser1_DocumentCompleted事件
为什么
【第二次】实验只触发一次webBrowser1_DocumentCompleted事件,而且获取的代码还不完全
【第三次】实验加入了messagebox(然后迅速点掉)能触发一次以上的webBrowser1_DocumentCompleted事件,获取代码完全
【第三次】实验加入了messagebox(没有迅速点掉)只能触发一次webBrowser1_DocumentCompleted事件,获取代码完全
我没弄明白
***********************************************************************************************************
那么换个思路。在第一次进入webBrowser1_DocumentCompleted事件之时开启一个timer时钟,间隔5秒,5秒之后获取一次webbrowser的代码
只触发一次时钟时间,由于时钟是另外的线程,要调用webbrowser需要用到委托
//实例化timer
System.Timers.Timer t = new System.Timers.Timer();
//定义委托变量
public happy updateTxt_ok;
public delegate void happy();
public Form1()
{
InitializeComponent();
//设定timer
t.Interval = 5000; //定时,单位ms
t.Enabled = true; //回调函数允许执行
t.AutoReset = false; //回调函数循环执行
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); //到达时间的时候执行事件;
t.Stop();
}
private void Form1_Load(object sender, EventArgs e)
{
updateTxt_ok = new happy(UpdateTxtMethod);
}
//委托执行函数
public void UpdateTxtMethod()
{
//此处不用DocumentText是因为它获取中文可能产生乱码
Encoding encoding = Encoding.GetEncoding(webBrowser1.Document.Encoding);
StreamReader stream = new StreamReader(webBrowser1.DocumentStream, encoding);
string aa = stream.ReadToEnd();
richTextBox1.Text = aa;
stream.Close();
}
//timer事件
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
this.BeginInvoke(updateTxt_ok);//委托执行updateTxt_ok
}
//按下按钮
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate(richTextBox1.Text);
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}
private void webBrowser1_DocumentCompleted(object sender, EventArgs e)//这个就是当网页载入完毕后要进行的操作
{
t.start();//开启时钟
}
结果:获取完整源代码,共有2095行
但不能保证其他网页也是延迟5秒就能加载完,有的服务器很卡,需要调整时间
c#如何判断webbrowser已经加载完毕的更多相关文章
- Js判断CSS文件加载完毕的实例教程
要判断这个 CSS 文件是否加载完毕,各个浏览器的做法差异比较大,这次要说IE浏览器做的不错,我们可以直接通过onload方法来处理CSS加载完成以后的处理: 代码如下 复制代码 // 代码节选至se ...
- 【转】JS判断SWF,JPG加载完毕、兼容(Activex,plugIn)所有浏览器
JS判断SWF,JPG加载完毕.兼容(Activex,plugIn)所有浏览器 这里主要说下监听SWF的加载. 网上流传已久的监听方法,只能在IE(Activex插件下)下实现.在使用plugin的浏 ...
- axios(封装使用、拦截特定请求、判断所有请求加载完毕)
博客地址:https://ainyi.com/71 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 Node.js 中使用 vue2.0之后,就不再对 vue-resource 更新 ...
- js 判断iframe是否加载完毕
js 判断iframe是否加载完毕 CreationTime--2018年9月13日15点30分 Author:Marydon 1.javascript实现 window.onload = fun ...
- jQuery load() 判断 iframe 是否加载完毕
判断 iframe 是否加载完毕 方法.jQuery load() var frm = document.getElementById('myiframe'); $(frm).load(functi ...
- js判断网页是否加载完毕 包括图片
<script type="text/javascript" language="JavaScript"> //: 判断网页是否加载完成 docum ...
- JavaScript在A页面判断B页面加载完毕(iframe load)
今天遇到一个需求,在A页面上判断B页面是否加载完毕(B页面是第三方页面),加载完毕时隐藏loading动画... 而平时我们一般做的事是在B页面上判断B页面是否加载完毕,进行操作. if(docume ...
- 用js判断页面是否加载完毕
用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == "complete"判断是否加载完成 docum ...
- javaScript & jquery完美判断图片是否加载完毕
好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序. 今天就不谈瀑布流,来谈一下关于load的问题. ----------------------------------------- ...
随机推荐
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- PHP之购物车的代码
该文章记录了购物车的实现代码,仅供参考 book_sc_fns.php <?php include_once('output_fns.php'); include_once('book_fns. ...
- angular 源码分析 1 - angularInit()
angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...
- 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...
- ASP.NET Core 中文文档 第四章 MVC(3.7 )局部视图(partial)
原文:Partial Views 作者:Steve Smith 翻译:张海龙(jiechen).刘怡(AlexLEWIS) 校对:许登洋(Seay).何镇汐.魏美娟(初见) ASP.NET Core ...
- Java实现Excel中的NORMSDIST函数和NORMSINV函数
由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...
- 云计算下PAAS的解析一
云计算下PAAS的解析一 PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ...
- 关于DDD的学习资料汇总
DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...
- SAP CRM 性能小技巧
导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...
- 编译器开发系列--Ocelot语言2.变量引用的消解
"变量引用的消解"是指确定具体指向哪个变量.例如变量"i"可能是全局变量i,也可能是静态变量i,还可能是局部变量i.通过这个过程来消除这样的不确定性,确定所引用 ...