Poszukiwałem różnych sposobów sprawdzania, kiedy strona jest w pełni załadowana przez składnik TChromium - na razie bezskutecznie.
Próbowałem użyć opóźnienia ładowania strony i przesłać informacje o zakończeniu przez dodatkową zmienną, ale zdarzenie OnLoadEnd jest wyzwalane przed JS i innymi podobnymi, więc nie zawsze uzyskać poprawne informacje.
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;
Czytałem, że mogę wykonać JS injection i dodać obiekt, który powinien pojawić się na końcu:
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;
Ale nie rozumiem użycia QuestDomProc (getResult) z procedurą wewnątrz (dlaczego procedura jest argumentem dla VisitDomProc?):
procedure getResult(const doc: ICefDomDocument);
var
q: ICefDomNode;
begin
q := doc.GetElementById('msoftval');
if Assigned(q) then
result := q.GetValue
else
result := '';
end;
Co należy zadeklarować jako rezultat i jak rezultat "wydobyć"? Czy ktoś mi to wytłumaczy?
Dzięki za porady.