如果我手动点击button1
然后点击button2
,我会获得整个HTML代码(410 KiB)。但是,如果我尝试使用下面的代码自动执行此过程,我只会得到它的一部分,而不是由javascript(40 KiB)生成的html。
是的,我试过把form1.Button2.Click; OnDocumentComplete,但仍然只写了40 KiB。有没有办法等待javascript的执行?
聚苯乙烯。不要太认真地对待这些代码。我只是用简单的脏示例代码学习一些东西。
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.EmbeddedWB1.Navigate('https://www.themoviedb.org/movie/87101-terminator-genisys/posters');
while EmbeddedWB1.ReadyState < READYSTATE_COMPLETE do Application.ProcessMessages;
form1.Button2.Click;
end;
procedure TForm1.Button2Click(Sender: TObject);
var Doc: IHtmlDocument2;
begin
Doc := EmbeddedWB1.Document as IHtmlDocument2;
Memo1.Lines.Text := Doc.body.innerHTML;
memo1.Lines.SaveToFile('C:\...\MoviePosters.html');
end;
答案 0 :(得分:0)
以下 - 请注意我使用的是vanilla TWebBrowser而不是TEmbeddedWB - 似乎按照您的要求行事,至少对于该特定的URL。它完全基于对ProgressChange事件的观察,并且我没有在任何其他URL上对其进行测试。希望有人能够为您发布一个更通用,更不易碎的解决方案。
procedure TForm1.LogHTML;
var
Doc: IHtmlDocument2;
begin
Memo1.Lines.Clear;
Doc := WebBrowser1.Document as IHtmlDocument2;
if (Doc <> Nil) and (Doc.body <> Nil) then
Memo1.Lines.Text := Doc.body.innerHTML;
Caption := Format('Length: %d', [Length(Memo1.Lines.Text)]);
end;
procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
begin
if (Progress = 0) and (ProgressMax = 0) then
LogHTML;
end;
当然,JS可以永远写入文档,因此您可能希望使用TTimer的OnTimer事件来重新阅读文档的HTML。
是的,我知道你只是&#34;搞乱&#34;在您的代码中,但避免在TForm1的方法之一中引用Form1的方法。TForm1
是类,而Form1
是它的特定实例,在TForm1
方法执行时可能创建或未创建,这一点至关重要差异会回来最终咬你。假设,f.i。您使用的TForm1
的实际实例是MyOtherForm
。