下载脚本生成的html

时间:2015-09-13 09:36:33

标签: javascript delphi downloading

如果我手动点击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;

1 个答案:

答案 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