偶然的机会需要使用TWebBrowser,在开发过程中涉及到一些比较不肤浅的东西,于是免不了搜资料,翻CSDN的帖子,终于把要做的东西作了出来,同时对于 TWebBrowser也有了初步的了解。同时看到很多CSDN上的不少朋友也在TWebBrowser上存在很多疑问,于是把自己这段时间所得的拿出来与大家分享。还是那句话,本人水平很洼,说的不对的话敬请指出,不要客气,否则不但我自己学错了东西,也让看这篇文章的人误入歧途。废话少说正文开始。

首先我们要认识到TWebBrowser其实是Delphi对Internet Explorer Browser的封装,也就是说它是一个ActiveX控件,看过TWebBrowser代码的朋友会发现这个空间的所有方法的实现部分都调用了 DefaultInterface的方法,而TWebBrowser的这个属性是一个IWebBrowser2接口类型的对象,这个接口就是IE的接口。我们在使用TWebBrowser代替IE浏览器的目的大部分是为了能够让程序处理页面,实现自动对WebApplication的请求,所以我们首先想得到的就是TWebBrowser所浏览的内容。TWebBrowser的Documnet属性正是这一内容,Document其实是一个 IHTMLDocument2,但是它被声明为IDispatch接口类型,我们需要把它转化为IHTMLDocument2类型然后是用我们需要的各种方法。在这里需要注意IHTMLDocument2是在MSHTML单元定义的,需要我们手动将这一单元加入到uses部分。具体代码如下:

var D : IHTMLDocument2;
begin
D := WebBrowser1.Document as IHTMLDocument2;
end;

接下来我们来看看一个网页中包含什么,也就是我们希望通过TWebBrowser来处理的内容有哪些。网页中的元素主要有普通文本内容,超级连接以及动态的元素(Form中的元素),当然还有其它元素,但是我们在一般的处理过程中一般会用到这些,因此我在这里以这些元素为例首先我要介绍的是Form 和包含在Form中的元素的使用。

在IHTMLDocument接口中有一个Forms的属性,这个属性是IHTMLElementCollection接口类型,其实这个 Forms属性是TWebBrowser显示的页面中的所有Form元素。也就是说一个页面中的所有Form都包含在Forms这个集合中。我们可以以使用IHTMLDocument.Forms.item(name: OleVariant; index: OleVariant)得到我们需要操作的Form,当然我们在这里得到的只是一个IDispatch接口,我们需要再把这个接口转换成 IHTMLFormElement来使用Form的方法和属性。示例如下(该例子为yahoo的免费信箱登陆界面http://mail.yahoo.com.cn):

var Form : IHTMLFormElement ;
D:IHTMLDocument2 ;

begin
with WebBrowser1 do begin
D := Document as IHTMLDocument2;
Form := D.Forms.item('login_form',0) as IHTMLFormElement;
(form.item('login',0) as IHTMLElement).setAttribute('value',edit1.Text,0);
(form.item('passwd',0) as IHTMLElement).setAttribute('value',edit2.Text,0);
//form.submit; // this line work too
(form.item('.save',0) as IHTMLElement).click;
end;
end;

从上面的例子我们可以看到我们可以通过两种方法提交一个Form,这两种方法在一般情况下没有什么区别,但是当页面中编写了一些js用来实现页面提交的控制时,前者会忽略掉这些js,所以后面的方法是我所推荐的。

在这个时候我遇到了一个问题,就是在我要处理的页面中有两个Form,而且这样两个Form都没有名字,也就是说Form := D.Forms.item('login_form',0) as IHTMLFormElement;这一句中item的第一个参数的我们无法从网页中得到,同时在设置这个参数时我发现了一个问题,就是说如果在页面中有两个Form元素的话,第一个Form元素可以通过item(varEmpty,0)得到,第二个Form元素可以通过item(verNull,0)得到,而item的第二个参数完全不起作用,这个问题可能是由于我对该函数的错误使用造成的,希望有人可以给出这一问题的解决方案(我在自己翻看帖子是找到了答案,的确是我对该函数的参数的错误使用造成的,第一个参数应该是我们要使用的对象的索引值。)。我的想法是DHTML在没有明确得到一个元素的名称时会自动生成一个唯一的元素名称分配给该元素,但是如何得到这个唯一的元素名称呢?这个只是我的一个设想,我们会看到,当我们处理链接的时候我们还要遇到这个问题。示例如下(这是我自己做的一个jsp程序):

var form : IHTMLFormElement ;
d:IHTMLDocument2 ;
begin
with WebBrowser1 do begin
d := document as IHTMLDocument2;
form := d.forms.item(varNull,01) as IHTMLFormElement;
(form.item('firstName',0) as IHTMLElement).setAttribute('value',edit1.Text,0);
(form.item('lastName',0) as IHTMLElement).setAttribute('value',edit1.Text,0);
form.submit;
end;
end;

以上是网页中Form的基本处理,接下来我介绍一下网页中对于链接的控制,我们一般是希望能够实现程序自动点击网页中的连接。在这里正如前面提到的,我只能得到前两个没有名称的连接。示例如下:

var Links : IHTMLElementCollection;
D:IHTMLDocument2 ;
Element : IHTMLElement;
begin
with WebBrowser1 do begin
D := Document as IHTMLDocument2;
Links := D.links;
Element := (Links.Item(varempty,0) as IHTMLElement);
ShowMessage(Element.getAttribute('href',0));
Element := (Links.Item(varNull,0) as IHTMLElement);
ShowMessage(Element.getAttribute('href',0));
end;
end;

我们可以通过调用以上代码中的Element.Click事件来模拟点击。不行了,写不下去了,还有一个常见的问题就是怎么使自己写的Browser在打开一个新窗口时在制定窗口打开。这个要在TWebBrowser的NewWindows2中改变 ppDisp来实现。

转载于:https://www.cnblogs.com/dwbboy/archive/2011/02/22/1960282.html

TWebBrowser的基本应用相关推荐

  1. TWebBrowser 与 MSHTML(2): 获取 window 对象的时机

    这是在页面下载完毕后即刻获取: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  2. Delphi处理TWebBrowser的Close事件

    当TWebBrowser控件访问的 Web 页上的脚本调用window.close方法时,TWebBrowser控件可能会在窗体中消失.我们的程序应该对此作出反应,否则再次访问TWebBrowser控 ...

  3. TWebBrowser禁止弹出Alert对话框

    以前介绍过通过编写Webbrowser1的OnDocumentComplete事件响应代码可以拦截网页弹出的Alert等对话框,代码如下: procedure TForm1.WebBrowser1Do ...

  4. 使用TWebBrowser组件保存网页为html和mht文件 收藏

    使用TWebBrowser组件保存网页为html和mht文件 收藏 一.保存为HTML文件 uses ActiveX; ... procedure WB_SaveAs_HTML(WB : TWebBr ...

  5. delphi TWebBrowser组件使用详解

    delphi TWebBrowser组件使用详解 该组件是一个浏览器组件,可以显示一个指定地址的网页.设置网页打开时的主页以及对网页进行相关的操作,同时也可以对HTML文件进行剪切.复制.粘贴.删除等 ...

  6. 给 TWebBrowser.Document 定义事件

    (该代码来自国外网站, 给 "神奇的科比" 参考) 代码: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variant ...

  7. 浏览器 制作---TWebBrowser 控件

    浏览器 制作---TWebBrowser 控件 http://che19870620.blog.163.com/blog/static/877858402010101141522393/ http:/ ...

  8. TWebBrowser的常见属性和方法

    GoBack:方法,后退到上一个页面. GoForward:方法,前进到下一个页面. GoHome:方法,调用默认的主页页面,该页面在IE的选项中设定. GoSearch:方法,调用默认的搜索页面,该 ...

  9. TWebBrowser 与 MSHTML(3): window 对象的属性、方法、事件纵览

    这还不是 TWebBrowser 控件的属性.方法.事件; 这和浏览器中 JavaScript 的 window 对象是基本一致的. window 对象是网页脚本中的顶层对象, 它代表网页的窗口.或一 ...

最新文章

  1. python资料书-史上最全Python从入门到资深书籍资料分享!
  2. weblogic管理2 - 创建并启动一个managed server
  3. swagger python自动化用例_如何让Swaggergenerated Python客户机正常工作?
  4. [CODEVS 1281] Xn数列
  5. 修改Linux系统默认语言
  6. 聚集索引和非聚集索引的区别有哪些
  7. 《高效程序员的45个习惯》-末篇
  8. php对二维数据进行排序
  9. php配置xdebug断点调试
  10. 知识图谱最新权威综述论文解读:知识图谱补全部分
  11. Q245R正火控扎一探-20℃冲击容器板切割,舞钢Q245R-20℃冲击
  12. 主引导记录mbr介绍
  13. oracle最小值寒素,新人教版备考2020年浙江中考语文复习专题:基础知识与古诗文专项特训(五十六)D卷...
  14. python爬取豆瓣书评排行榜_爬虫:爬取豆瓣读书排行榜
  15. Linux下的图片转换工具ImageMagick
  16. 深度学习如何参加阿里的天池比赛和进入天池实验室
  17. AndroidManifest merger failed with multiple errors, see logs
  18. Hadoop高频面试题(建议收藏)
  19. 《TPM原理及应用指南》学习 —— TPM历史1
  20. 泰裤辣!五一烧烤倒计时,还有人没做好攻略吗?

热门文章

  1. ubuntu文件、目录操作基本命令
  2. linux服务器拷贝目录文件夹,linux两台服务器之间文件/文件夹拷贝
  3. oracle自动化,oracle自动分析
  4. 怎样用matlab模型建立,怎样在matlab里建立一个BP神经网络模型?
  5. java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...
  6. 判断用户是否存在再进行新增_基于tableau从商业分析模型角度对业务数据进行多维度分析--【商业分析类】...
  7. strncasecmp的使用
  8. 优酷复制的html代码怎么用,关于网页上增加视频功能的代码
  9. 独家下载!《零售数据中台通关指南》,带你玩转新零售
  10. 监狱中的物联网用例:从尘土飞扬的监狱到智能监狱设施