2015-09-13 2 views
2

Если я вручную нажму на button1, а затем на button2 Я получаю весь код html (410 KiB). Однако, если я попытаюсь автоматизировать этот процесс с помощью приведенного ниже кода, я получаю только часть его, без html, сгенерированного javascript (40 KiB).Загрузить html, сгенерированный скриптом

Да, я попробовал положить form1.Button2.Click; OnDocumentComplete, но все же было написано только 40 KiB. Есть ли способ ждать выполнения javascript?

Ps. Не воспринимайте этот код слишком серьезно. Я просто изучил несколько вещей с помощью простого грязного примера кода.

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

Следующая - обратите внимание, что я использую ваниль 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 может пойти на письменном документе навсегда, так что вы можете захотеть использовать событие OnTimer TTimer, чтобы перечитать HTML документа.

Btw, я понимаю, вы просто «возитесь» в своем коде, но избегаете ссылаться на методы Form1 в одном из методов TForm1. TForm1 - это класс, тогда как Form1 - это конкретный экземпляр, который может быть создан или не был создан при выполнении метода TForm1, и это ключевое различие вернется, чтобы укусить вас в конечном итоге. Предположим, что f.i. что фактический экземпляр TForm1 ваш использование - MyOtherForm.

Смежные вопросы