我已经找到了不同的方法来检查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;
我应该宣布什么结果以及何时获得它?有人可以向我解释一下吗?
感谢您的建议。
答案 0 :(得分:1)
我需要一些时间来理解现代页面无法“到最后”阅读,甚至对于代码的某些元素,您也不能考虑完成代码加载,因为它在页面操作期间生成。因此,这个问题并非毫无根据,因为它根本没有意义 - 现代技术的复杂性使我们无法说明页面是否已满载。
大多数可以查看此类浏览器的门户网站都有自己的API,基于“加载”页面到底的爬虫程序没有多大意义。我用无API页面解决了我的问题,因此我为自己设置了一个TTimer组件,例如第二个 - 也许是两个。程序如下 - TChromium.Load(链接),然后等待来自浏览器的信息它是免费的(如上所述),重置TTimer,然后当它出现时它的TTimer.OnTime加载浏览器代码。可能会调整等待时间。
主题已经结束,我为这样一个愚蠢的问题道歉。