gpt4 book ai didi

javascript - 当页面完全加载到 TChromium DCEF3 (Delphi) 中时?

转载 作者:行者123 更新时间:2023-11-29 23:48:29 30 4
gpt4 key购买 nike

我一直在寻找不同的方法来检查页面何时被 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 注入(inject)并添加一个应该出现在末尾的对象:

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,然后当它出现时它的 TTimer.OnTime 加载浏览器代码。可能会调整等待时间。

主题已关闭,对于如此愚蠢的问题,我深表歉意。

关于javascript - 当页面完全加载到 TChromium DCEF3 (Delphi) 中时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43352698/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com