TWebBrowser的基本应用
偶然的機會需要使用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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的TWebBrowser的基本应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指针06 - 零基础入门学习C语言46
- 下一篇: PHP只下载不打开文件