繁体   English   中英

加载AJAX后,Delphi TWebBrowser获得HTML源

[英]Delphi TWebBrowser get HTML source after AJAX load

我有以下函数,可以在DocumentComplete事件之后获取HTML文档的源代码。

function TBrowser.GetWebBrowserHTML(const WebBrowser: TWebBrowser): string;
var
  LStream: TStringStream;
  Stream : IStream;
  LPersistStreamInit : IPersistStreamInit;
begin
  try
    if not Assigned(WebBrowser.Document) then exit;
    LStream := TStringStream.Create('', TEncoding.UTF8);
    try
      LPersistStreamInit := WebBrowser.Document as IPersistStreamInit;
      Stream := TStreamAdapter.Create(LStream,soReference);
      LPersistStreamInit.Save(Stream,true);
      result := LStream.DataString;
    finally
      LStream.Free();
    end;
  except
  end;
end;

问题:在页面上执行AJAX调用之前已检索源代码。 页面完成加载(由WebBrowser确定),但是AJAX继续修改DOM,其他元素显示在页面上。 我需要的是Mozilla的“查看生成的源代码”,或者是用Firebug或Chrome Inspector或IE开发人员工具检查网页时出现的html源代码。

似乎C语言中有执行此操作的DocumentText属性 ,但在Delphi中找不到实现此功能的任何属性或方法。

有什么想法/提示/帮助吗?

您可以使用IHTMLDocument2接口,这是TWebBrowser.Document实现接口。 该属性以IDispatch的形式公开,但是您可以将其强制转换为接口或(Ole)Variant,尽管那样您将不会从代码完成中受益。

IHTMLDocument2接口支持DocumentElement属性,该属性指向文档的根元素。 该元素(和其他元素一样)具有属性outerHTML ,该属性为您提供该元素及其所有内容作为字符串:

var
  d: OleVariant;
begin
  d := WebBrowser1.Document;
  ShowMessage(d.documentElement.outerHTML);

据我所知,这是文档的实际状态,包括Javascript所做的任何更改。

它似乎没有包含doctype,但是再说一次,如果我通过Webbrowser1.Document.All找到doctype元素,则其externalHTML属性不会返回任何内容。 文档的其他部分也已更改(大写的标签名称为一个),但这仅确认这是基于加载的DOM而非文档的原始来源生成的文档结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM