WebBrowser之获取跳转页面的Document接口源码
来源:互联网 发布:js获取input text 编辑:程序博客网 时间:2024/05/21 15:02
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:http://www.cctry.com/thread-254314-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
打开这个网址:
https://www.baidu.com/s?wd=400电话,如下图:
简单解释一下:就是获取百度搜索框的接口,之后向里面输入关键字:“新网页”,之后再获取【百度一下】按钮的接口,调用这句话 pBtnElement->click(); 进行点击事件的触发,说白了,就是在当前页面中搜索 “新网页” 这个关键字。
之后,调用 Sleep(5000); 等待一会新页面加载完成,再次调用 m_web.get_Document(); 获取当前网页的 document 文档接口,然后调用 GetAllLinks(spDoc2); 函数分析出当前页面的所有搜索结果的URL链接,显示在软件下面的列表中,如下图:
但是,问题来了,大家仔细看上面的图,列表中显示的URL链接都是上一个网址搜索 “400电话” 关键字的结果,不是之后搜索的关键字 “新网页” 的网址链接,这是怎么回事儿呢?跟我们要的结果不一致啊。。。
我还特意调用了 Sleep(5000),等待了 5 秒钟 呢,怎么结果还是不对?
于是乎。。。东奔西走,谷歌搜索了一大堆,还是没找到结果,到微软官方MSDN也没发现什么猫腻,到底是怎么回事儿呢,正准备要放弃的时候,忽然灵感来了,想一想,WebBrowser 走的是当前的主界面的 UI 线程,所以,他访问网页的过程也是在这个主界面的线程中来执行的,那么我们 Sleep(5000); 就没有意义了,不仅会卡住主界面线程,也同时会卡住 WebBrowser。当程序调用完 GetAllLinks(spDoc2); 这条语句之后可能新页面还没加载完,所以获取子链接的结果肯定是上一个页面的。
于是按照这一思想,我把【获取测试】按钮响应函数中的以下几句话注释掉:
即,不让他 Sleep 了,也不让他在当前的这个按钮的响应函数中去获取新页面中所有的子链接,直接触发【百度一下】按钮点击事件之后就完事儿了。
接着,我再界面上再添加一个按钮,命名为【再测试下】,在这个按钮的响应函数中添加如下代码:
即,在这个【再测试下】按钮的响应函数中进行获取新页面中的所有子链接,看看能否成功!结果呢?哈哈,当然是成功啦,如下图:
看到了吧,这回列表中显示的已经是新页面的网页子链接了。。。
好了,文章就写到这吧,希望其他遇到相同问题的网友看到这篇文章,少走弯路!
// 备注:本篇文章来自 vc驿站:http://www.cctry.com/thread-254314-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
问题由来是这样的,今天一个会员问我一个问题,说从咱们VC驿站下载了一个源码,程序的功能主要是在对话框上面放置了一个WebBrowser控件,程序启动的时候默认调用这句代码:
https://www.baidu.com/s?wd=400电话,如下图:
点击【获取测试】按钮之后,执行如下函数:
简单解释一下:就是获取百度搜索框的接口,之后向里面输入关键字:“新网页”,之后再获取【百度一下】按钮的接口,调用这句话 pBtnElement->click(); 进行点击事件的触发,说白了,就是在当前页面中搜索 “新网页” 这个关键字。
之后,调用 Sleep(5000); 等待一会新页面加载完成,再次调用 m_web.get_Document(); 获取当前网页的 document 文档接口,然后调用 GetAllLinks(spDoc2); 函数分析出当前页面的所有搜索结果的URL链接,显示在软件下面的列表中,如下图:
但是,问题来了,大家仔细看上面的图,列表中显示的URL链接都是上一个网址搜索 “400电话” 关键字的结果,不是之后搜索的关键字 “新网页” 的网址链接,这是怎么回事儿呢?跟我们要的结果不一致啊。。。
我还特意调用了 Sleep(5000),等待了 5 秒钟 呢,怎么结果还是不对?
于是乎。。。东奔西走,谷歌搜索了一大堆,还是没找到结果,到微软官方MSDN也没发现什么猫腻,到底是怎么回事儿呢,正准备要放弃的时候,忽然灵感来了,想一想,WebBrowser 走的是当前的主界面的 UI 线程,所以,他访问网页的过程也是在这个主界面的线程中来执行的,那么我们 Sleep(5000); 就没有意义了,不仅会卡住主界面线程,也同时会卡住 WebBrowser。当程序调用完 GetAllLinks(spDoc2); 这条语句之后可能新页面还没加载完,所以获取子链接的结果肯定是上一个页面的。
于是按照这一思想,我把【获取测试】按钮响应函数中的以下几句话注释掉:
即,不让他 Sleep 了,也不让他在当前的这个按钮的响应函数中去获取新页面中所有的子链接,直接触发【百度一下】按钮点击事件之后就完事儿了。
接着,我再界面上再添加一个按钮,命名为【再测试下】,在这个按钮的响应函数中添加如下代码:
即,在这个【再测试下】按钮的响应函数中进行获取新页面中的所有子链接,看看能否成功!结果呢?哈哈,当然是成功啦,如下图:
看到了吧,这回列表中显示的已经是新页面的网页子链接了。。。
好了,文章就写到这吧,希望其他遇到相同问题的网友看到这篇文章,少走弯路!
相关工程源码,请到原帖下载:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:http://www.cctry.com/thread-254314-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
0 0
- WebBrowser之获取跳转页面的Document接口源码
- 页面document.all.WebBrowser的应用
- 在webForm中WebRequest/WebClient/WebBrowser获取远程页面源码的三种方式(downmoon)
- 获取webbrowser控件 网页的源码
- 获取webbrowser控件网页的源码
- Wp7 中 webbrowser 页面跳转
- 去除webbrowser页面跳转时发出的声音
- C#获取webbrowser源码
- 《易道客》源码剖析之四:页面多次跳转的记忆
- 获取页面window/document的值
- document获取页面控件的标签对象
- document获取父页面的对象
- WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
- WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
- Window Phone 7 中WebBrowser获取当前页面的cookie
- 获取iframe中的内容、查找获取指定元素(关于用c++调用WEBBROWSER控件,使用相关接口操作web页面元素的一些方法)
- 获取webbrowser控件 网页的源码(收藏)
- 获取webbrowser控件 网页的源码(收藏)
- 第十四周项目4 - 处理C++源代码的程序(排查main())
- 好题 HDU 2846 Repository (字典树)
- 有序向量Vector
- LevelDB场景分析2--Open
- BitSet类
- WebBrowser之获取跳转页面的Document接口源码
- 苹果应用商店审核指南
- 哈希表分离链接发解决冲突
- 新锐房地产销售管理系统(部分流程)技术解释(五) 销售管理_客户登记
- Java笔记01 编程基础与java入门
- LevelDB场景分析3--Put,Get,Delete
- 20150606内存使用
- POJ3450:Corporate Identity(后缀数组)
- MAC pro 安装和使用『brew』