ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7397|回复: 9

解决判断WebBrowser是否页面下载完成,如何判断对象相同?地址判断法和计数器法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-1-13 02:08 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 liucqa 于 2012-1-13 03:02 编辑

http://support.microsoft.com/kb/180366/是这么说的:

Internet 浏览器的 web 浏览器控件将触发 DocumentComplete 事件完成后下载 Web 页。您可以在此事件的应用程序中创

建事件处理程序函数。本文介绍在确定是否需要执行该步骤在 web 浏览器控件已完成下载 Web 页。
更多信息
web 浏览器控件将触发 DocumentComplete 事件时其 ReadyState 属性更改为 READYSTATE_COMPLETE。这表明 web 浏览器

控件已完成下载 Web 页。下面是一些关于此活动的要点:

    在没有框架的网页的情况下 DocumentComplete 触发一次完成所有内容之后。
    在多个的框架的情况下 DocumentComplete 获取激发多次。 不是每个框架时触发此事件,但每个框架,将触发

DownloadBegin 事件触发相应 DocumentComplete 事件。
    DocumentComplete 事件有一个 IDispatch * 参数,它是的框架 (shdocvw) 为其触发 DocumentComplete 的

IDispatch。
    顶层的框架将触发最后 DocumentComplete。可以检查是否进行页下载,您需要检查 IDispatch * 参数是否是相同的

web 浏览器控件 IDispatch。

    对于 Visual Basic 此处是执行此检查的代码:

    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object,URL As Variant)
       If (pDisp Is WebBrowser1.Object) Then
          Msgbox "Web document is finished downloading"
       End If
    End Sub


问题:我发现红色字体似乎在VBA下面不管用。谁知道VBA下如何判断两个对象相同?

临时方法用的是这个if  pDisp.LocationURL = WebBrowser1.Object.LocationURL  then          地址判断法

12360load.rar (17.11 KB, 下载次数: 54)

另外还有一个问题,在12306上,因为日期控件不安全,会导致ie给提示,而观察DocumentComplete事件可以发现,即使在pDisp 等于 WebBrowser1.Object之后,网页加载依然没有结束,ie继续加载了2个页面,这个是用上述方法无法判断的,因此有人提议用计数器解决。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-13 02:41 | 显示全部楼层
本帖最后由 liucqa 于 2012-1-13 10:08 编辑

计数器法

Private Sub CommandButton1_Click()
    countFrame = 1      '假设3个框架,那么DocumentComplete就要执行4次,因此计数初始为1(整个页面算一个)
    Sheet2.WebBrowser1.Navigate2 "https://dynamic.12306.cn/otsweb/"
End Sub

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
countFrame = countFrame + 1
MsgBox "BeforeNavigate2加1 countFrame=" & countFrame
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
If pDisp.LocationURL = WebBrowser1.Object.LocationURL Then MsgBox "网址判断加载结束"
If pDisp Is WebBrowser1.Object Then MsgBox "finished loading bject"
countFrame = countFrame - 1
MsgBox "DocumentComplete减1 countFrame=" & countFrame
If countFrame = 0 Then MsgBox "计数器判断加载结束"
End Sub

用计数器试了一下,发现还是比较准的,计算出了由于安全问题导致的第二次加载页面。测试发现不能用DownloadBegin 事件,只能用BeforeNavigate2事件计数



注意第一次启动因计数器未初始化,会导致计算错误。不用管它。点击按钮才是正确的。注意提示证书问题时,请选择“是”

上述程序对12306有效,对别的网址,可能需要调整计数器的初始值


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-13 03:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2012-1-13 03:12 编辑

有人问了,页面有二次加载,计数器也没法判断后面的代码是等待还是继续执行呀?

有人建议是用计时器处理,如果计数器为0,再判读1秒钟之内是否有变化,若一直为0(或者<0),说明加载完成

所以我们需要两个全局变量来判断WebBrowser是否加载完成,一个是计数器,一个是计时器判断结果的标志

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-13 10:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2012-1-13 10:03 编辑

12306load计数器3.rar (28.26 KB, 下载次数: 73)

这个程序实现了基本准确的加载多框架页面是否完成的判断
判断标准:标志位ReadyState是否READYSTATE_COMPLETE,busy是否Flase,pDisp.LocationURL = WebBrowser1.Object.LocationURL,计数器是否为0,在4个计时器循环期间内,上述标准是否均达成。

运行此程序请启用activeX。
第一次打开Excel请在启用activeX之后,等待页面加载完成再点击按钮

TA的精华主题

TA的得分主题

发表于 2012-1-13 10:33 | 显示全部楼层
看了1楼你的附件。
关于WEBBROWSER,你的理解可能有点偏差。
在XLS里,你引用了一个INTERNET控件,但不是WEBBROWSER控件——你看看工程引用列表就知道了,它的名字就不对——所以COMPLETE事件没有成功引发,那个对象也是一个很象WEBBROWSER的控件对象,结果PDISP对象和WEBBROWSR不同,事实上它在COMPLETE时触发了事件,但中断跟踪到这一句时(在比较的那句打个断点),你可以这样测两个对象
debug.print PDISP.document.body.innerhtml
debug.print webbrowser1.document.body.innerhtml  '也可以用outerhtml
还有就是DEBUG.PRINT另一个参数URL
你可以看到,断点成功拦下了,说明事件触发了,但两个参数PDISP、URL根本就是空的或不正确,而WEBBROWSER1却是正确的。


换成下面这个附件的对比(我是用的2003版本,不知道2007上有什么表现),分别在FORM窗体上和SHEET文档拦截,你可以看看它们的不同
其中窗体里只要PDISP和WEBROWSER1相同,在SHEET里就要WEBBROWSER1.OBJECT(这是因为多了一个OLEOBJECT),不过都差不多,我这里插入的就是WEBBROWSER控件

WEBload.rar

13.89 KB, 下载次数: 52

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-13 11:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2012-1-13 11:08 编辑
hiyou 发表于 2012-1-13 10:33
看了1楼你的附件。
关于WEBBROWSER,你的理解可能有点偏差。
在XLS里,你引用了一个INTERNET控件,但不是 ...

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
If pDisp = Sheet3.WebBrowser1.Object Then
  MsgBox "ok"
End If
End Sub

判断对象不能用=号。

我看了一下引用的对比,我们是一样的。
我没有测试在窗体的比较结果,但是在sheet上,把你的=号换成IS ,一样也是不能判断相等。
你说的PDISP、URL为,是因为加载没有结束,等最后一个页面加载完毕,pdisp就有数据了

也许在窗体上这个Is的判断是好用的,以后我准备换成窗体

点评

直接抓去框架内的文本来作为是否是否完成的临界点。虽然HIYOU说我这个办法耗资源,但是貌似这些计数法什么的,也是耗资源的。而且INNERTEXT这个方法在实战用还是很奏效的,实际上最大的等待还是网速,不差这个0.几秒  发表于 2012-1-17 10:39

TA的精华主题

TA的得分主题

发表于 2012-1-13 11:58 | 显示全部楼层
本帖最后由 hiyou 于 2012-1-13 12:02 编辑
liucqa 发表于 2012-1-13 11:05
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
If pDisp = Sheet3 ...


是我写错了,而且自已把后续代码都解错了——OLEOBJECT那句。
不过你可把代码改成窗体FORMS一样试试看,它可以成功触发
你说的也有道理,后来的读完了,PDISP IS WEBBROWSER1 TRUE
打断点再测就OK了,在我这边调试有两次触发,第一次是BLANK(因为我的默认是ABOUT:BLANK),然后第二次才是目标地址
AND,我是照着你的代码和M$的说明(笑),输进去PDISP=W.OBJECT(再笑,那个等号是我的错,不过OBJECT是照你的....)

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
If pDisp Is WebBrowser1 Then
  MsgBox "ok"
End If
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-13 14:41 | 显示全部楼层
hiyou 发表于 2012-1-13 11:58
是我写错了,而且自已把后续代码都解错了——OLEOBJECT那句。
不过你可把代码改成窗体FORMS一样试试看 ...

http://club.excelhome.net/thread-815805-1-1.html

有空看看这个Post之后什么问题

TA的精华主题

TA的得分主题

发表于 2014-2-28 11:19 | 显示全部楼层
4楼计数器法对打开网页后发生重定向新网页时会进入死循环,如何解决?请liucqa大侠抽空解答一下。
是否将 If countFrame = 0 And WebBrowser1.ReadyState = READYSTATE_COMPLETE And WebBrowser1.Busy = False Then tZeroTimes = tZeroTimes + 1 该句中的countframe=0 去掉即可?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-28 13:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jyhxr 发表于 2014-2-28 11:19
4楼计数器法对打开网页后发生重定向新网页时会进入死循环,如何解决?请liucqa大侠抽空解答一下。
是否将  ...

你自己调试代码吧,我不搞WB了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 03:12 , Processed in 0.059722 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表