Когда страница полностью загружается в TChromium DCEF3 (Delphi)?

Я искал разные способы проверить, когда страница полностью загружена компонентом TChromium - пока безуспешно.

Пробовал использовать отложенную загрузку страницы и отправлять информацию о завершении через дополнительную переменную, но событие OnLoadEnd срабатывает раньше JS и других подобных, поэтому не всегда получается верная информация.

procedure Chromium1.OnLoadEnd(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; httpStatusCode: Integer);
var EndTime: TTime;
begin
  EndTime := IncSecond(Now, 2);

  repeat Application.ProcessMessages until (Now > EndTime);

  IsChromiumBusy := False;
end;

Я читал, что могу сделать JS-инъекцию и добавить объект, который должен появиться в конце:

Chromium1.Load('https://www.wp.pl');
Form1.Chromium1.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0);
Form1.Chromium1.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0);
Form1.Chromium1.Browser.MainFrame.VisitDomProc(getResult);
while result = '' do Application.ProcessMessages;

Но я не понимаю использование VisitDomProc(getResult) с процедурой внутри него (почему процедура является аргументом для VisitDomProc?):

procedure getResult(const doc: ICefDomDocument);
var
  q: ICefDomNode;
begin
  q := doc.GetElementById('msoftval');
  if Assigned(q) then
    result := q.GetValue
  else
    result := '';
end;

Что я должен объявить в качестве результата и когда его получить? Может ли кто-нибудь объяснить это мне?

Спасибо за советы.


person kwadratens    schedule 11.04.2017    source источник


Ответы (1)


Мне понадобилось некоторое время, чтобы понять, что современные страницы невозможно прочитать «до конца» и даже по некоторым элементам кода можно не считать завершение загрузки кода, потому что он генерируется в процессе работы страницы. Поэтому вопрос был не столько голословным, сколько вообще не имел смысла — сложность современных методик не позволяет констатировать, полностью ли загрузилась страница.

Большинство порталов, которые могут просматривать такой браузер, имеют свой собственный API, и краулер на основе «загрузки» страницы до конца не имеет особого смысла. Я решил свои проблемы со страницами без API тем, что поставил себе компонент TTimer, например на секунду-может две. Порядок действий такой - TChromium.Load(ссылка), затем дождаться информации от браузера, что он свободен (как описано выше), сбросить TTimer, а потом когда появится его TTimer.OnTime загрузить код браузера. Возможно скорректировать время ожидания.

Тема закрыта и прошу прощения за столь глупый вопрос.

person kwadratens    schedule 17.05.2018