WebBrowser的用法

WebBrowser是一个简单的浏览器,我们可以通过它完成很多关于网页的操作。

在Delphi中,需要引用ShDocVw和MsHtml,下面会逐渐介绍一些使用办法

创建WebBrowser

WebBrowser := TWebBrowser.Create(nil);

WebBrowser.ParentWindow := Self.Handle;
WebBrowser.Height := 100;
WebBrowser.Width := 100;

WebBrowser.Silent := true;  //不会因为网页错误弹出对话框

WebBrowser.OnBeforeNavigate2 := OnNewWindow;  //可屏蔽不相关的网页
WebBrowser.OnDocumentComplete := OnComplete;  //流程处理的关键

 

打开某个页面
WerBrowser.Navigate('http://www.zixunwang.biz:8080/');

 

procedure  OnNewWindow(...);

begin

  cancel := Pos('http://www.zixunwang.biz:8080/', URL) = 0;

  //屏蔽不相关的网页,在这里会屏蔽http://www.zixunwang.biz:8080/以外的网页

end;

 

procedure OnComplete(...);

begin

  if url = 'http://www.zixunwang.biz:8080/login.aspx' then LoginProcess();

  if pos('default.aspx', url) <> 0 then defaultProcess();

end;

 

有的时候,我们想获取网页中的元素的信息,或是想设置网页中元素的信息,那么如下代码应该是你关心的了

以下的代码是演示设置信息,函数通过遍历网页中所有元素,将符合元素设置合适的值

procedure login;
var
  Doc: IHtmlDocument2;
  i: Integer;
  Input: IHTMLInputElement;
  Item: IDispatch;
  Data: String;
begin
  Doc := WebBrowser.Document as IHtmlDocument2;
  Data := Doc.body.innerHTML;
  for i := 0 to Doc.all.length - 1 do
  begin
    Item := Doc.all.item(i, 0);
    if SUCCEEDED(Item.QueryInterface(IHTMLInputElement, Input)) then
    begin
      if Input.name = 'FSI-UserName' then Input.value := '用户名';
      if Input.name = 'FSI-Password' then Input.value := '密码';
    end;
  end;
end;

问题1:'FSI-UserName'和'FSI-Password'是怎么得到的?

解答1:你可以通过查看网页原文件获得这些ID,这些ID都是唯一的

问题2:IHTMLInputElement是什么东西?

解答2:IHTMLInputElement是一个系统定义的接口,在网页中的所有元素,如button,textarea,select,frame,image等都定义有接口,选择合适的接口类型对网页元素进行转换,就可以得到该元素详细的值,具体请参看MSHTML中的定义或给我留言

 

有的网页内有frame或iframe,我们如何取到其中的信息?

 

//取得frame个数

function GetFrameCount: Integer;

var

  Doc: IHTMLDocument2;

begin

  Doc := WerBrowser.Document as IHTMLDocument2;

  Result := Doc.Frame.Length; 

end;

 

//取得第n个frame内容

function GetFrameDoc(n: Integer);

var

  Doc: IHTMLDocument2;

  OleContainer: IOleContainer;
  enum: IEnumUnknown;
  unk: IUnknown;
  Fetched: PLongint;

begin

  Doc := WebBrowser.Document as IHTMLDocument2;
  Fetched := nil;
  OleContainer:= Doc as IOleContainer;
  OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, enum);
  Enum.Skip(n);
  Enum.Next(OLECONTF_EMBEDDINGS, Unk, Fetched);
  IE := Unk as IWebbrowser2;
  return IE.Document as IHTMLDocument2;

end;

你说的都是在自己创建的WebBrowser中进行操作,能否在已经打开的浏览器中进行呢?

这个问题其实分2步,第1是找到你关注的浏览器窗口,第2是把这个窗口转换为IWebBrowser2

 

function getIEFromBrowser(URL: String): IWebBrowser2;

var

  ShellWindow: IShellWindows;
  nCount, i: integer;

  vi: OleVariant;
  spDisp: IDispatch;
begin

  ShellWindow := CoShellWindows.Create;
  nCount := ShellWindow.Count;
  for i := 0 to nCount - 1 do
  begin
    vi := i;
    spDisp := ShellWindow.Item(vi);
    if (spDisp = nil) then Continue;
    spDisp.QueryInterface(iWebBrowser2, Result);
    if (Result = nil) then Continue;
    if Pos(UpperCase(URL), UpperCase(Result.Get_LocationURL)) = 0 then Continue;

    exit;

  end;

  result := nil;

end;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值