[英]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.