在CEF4Delphi中重新触发页面更改后 去获取HTML

欢迎加入全网最大Delphi 技术交流群 682628230

在使用CEF4Delphi时,若需要在页面滚动后重新获取更新的HTML内容,您可能会发现无论怎样操作,获取到的HTML代码总是与初始加载时相同。这是因为现代网页通常使用JavaScript动态加载内容,而基础HTML结构保持不变。为了正确获取滚动加载的新内容,您需要访问DOM对象以获取当前页面的渲染状态。

解决方案:

模拟键盘事件:确保浏览器组件获得焦点后再发送按键事件。以下是一个模拟按下VK_NEXT键(翻页)的例子:

var 
  TempKeyEvent : TCefKeyEvent;
begin
  // WM_KEYDOWN
  TempKeyEvent.kind := KEYEVENT_RAWKEYDOWN;
  TempKeyEvent.modifiers := 0;
  TempKeyEvent.windows_key_code := VK_NEXT;
  TempKeyEvent.native_key_code := 0;
  TempKeyEvent.is_system_key := ord(False);
  TempKeyEvent.character := #0;
  TempKeyEvent.unmodified_character := #0;
  TempKeyEvent.focus_on_editable_field := ord(False);
  Chromium1.SendKeyEvent(@TempKeyEvent);
  // WM_CHAR
  TempKeyEvent.kind := KEYEVENT_CHAR;
  Chromium1.SendKeyEvent(@TempKeyEvent);
  // WM_KEYUP
  TempKeyEvent.kind := KEYEVENT_KEYUP;
  Chromium1.SendKeyEvent(@TempKeyEvent);
end;

使用JavaScript访问DOM:

利用CEF4Delphi提供的DOM访问能力,通过JavaScript获取动态加载的内容。可以参考最新版CEF4Delphi中的DOMVisitor演示示例,它展示了如何使用JavaScript获取HTML并通过控制台消息将结果返回给Delphi。
使用document.documentElement.outerHTML获取整个文档的HTML。
结果可以在TChromiumCore.OnConsoleMessage事件中接收。
等待动态内容加载完成:确保在尝试获取HTML之前,所有动态内容已经完全加载。由于JavaScript可能持续从服务器请求新资源,适当增加等待时间或监听特定事件来确认内容已加载完毕是必要的。
 
针对动态加载内容的网页,应优先考虑直接访问DOM获取最新的HTML内容,而不是依赖于页面加载完成时的基础HTML源码。同时,确保在执行任何模拟用户交互前,目标浏览器窗口处于焦点状态。
© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享