在使用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可能持续从服务器请求新资源,适当增加等待时间或监听特定事件来确认内容已加载完毕是必要的。
使用document.documentElement.outerHTML获取整个文档的HTML。
结果可以在TChromiumCore.OnConsoleMessage事件中接收。
等待动态内容加载完成:确保在尝试获取HTML之前,所有动态内容已经完全加载。由于JavaScript可能持续从服务器请求新资源,适当增加等待时间或监听特定事件来确认内容已加载完毕是必要的。
针对动态加载内容的网页,应优先考虑直接访问DOM获取最新的HTML内容,而不是依赖于页面加载完成时的基础HTML源码。同时,确保在执行任何模拟用户交互前,目标浏览器窗口处于焦点状态。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END