当页面完全加载到TChromium DCEF3(德尔福)中时?



我一直在寻找不同的方法来检查页面何时被 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;

我应该声明什么结果以及何时获得结果?有人可以向我解释一下吗?

谢谢你的建议。

我需要一些时间来理解现代页面无法"读到最后",即使对于代码的某些元素,您也不能考虑完成代码加载,因为它是在页面操作期间生成的。因此,这个问题并不是没有根据的,因为它根本没有意义 - 现代技术的复杂性不允许我们说明页面是否已完全加载。

大多数可以查看此类浏览器的门户都有自己的API,基于将页面"加载"到末尾的爬虫没有多大意义。我解决了无 API 页面的问题,因此我为自己设置了一个 TTimer 组件,例如一秒钟或两个。过程如下 - TChromium.Load(link),然后等待来自浏览器的信息是空闲的(如上所述),重置 TTimer,然后在它出现时加载浏览器代码。可以调整等待时间。

主题已关闭,对于这样一个愚蠢的问题,我深表歉意。

相关内容

  • 没有找到相关文章

最新更新