2006-12-13

Delphi - 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来实现。

精选文章

四家人天天同吃同乐,这个小集体成了一家人 | 南方周末

四家人天天同吃同乐,这个小集体成了一家人 | 南方周末 深秋的广州阳光明媚,碧空万里,适合外出走走、看看。近日,我联系上了一位久违的朋友阿乐。阿乐是地道的番禺人,家的准确位置是st街道st村,离我家不远,驱车半小时就到了。按照他发我的定位,我到了一处小山坡。 我以为这里是他家,但...