【问题标题】:CEF 3 offscreen rendering and page sourceCEF 3 离屏渲染和页面源
【发布时间】:2014-07-26 16:08:54
【问题描述】:

今天我正在使用 Chromium Embedded Framework 3。

我已经设置、编译和执行了所有内容。一切正常。

现在我想在渲染完所有内容并执行 JavaScript 后读取页面源代码。 我还想从屏幕外渲染中获取缓冲区。

我的基本应用结构是:

App实现CefApp、CefBrowserProcessHandler和CefRenderProcessHandler

Handler 实现 CefClient、CefDisplayHandler、CefLifeSpanHandler、CefLoadHandler 和 CefRenderHandler

Visitor 实现 CefStringVisitor

在 App::OnContextInitialized() 中我正在执行

CreateBrowser(window_info, handler.get(), "http://www.google.com/", browser_settings, NULL);

同时

window_info.SetAsWindowless(NULL, true);

现在只有在我使用单模式运行 CEF3 时才会调用 App::OnContextCreated()

main_settings.single_process = true;

否则它永远不会被调用。在 App::OnContextCreated() 我正在做

浏览器->GetMainFrame()->GetSource(new Visitor());

获取页面源并且它可以工作,但是该方法被多次调用并且此时似乎没有执行JavaScript。

我现在的问题是,在呈现所有内容并执行 JavaScript 之后,阅读页面源代码的最佳点是什么?

同时 Handler::OnPaint() 永远不会被调用,而 Handler::GetViewRect() 会被调用。

问候

挪威

【问题讨论】:

    标签: c++ chromium chromium-embedded


    【解决方案1】:

    OnContextCreated 在 Renderer 进程中运行,这可能是它仅在单进程模式下工作的原因。您应该在浏览器进程中运行的 CefLoadHandler::OnLoadEnd 或 OnLoadingStateChange 中调用 GetSource。

    未在 CefRenderHandler 中实现所有必要的回调可能是未调用 OnPaint 回调的原因。阅读头文件中的doc cmets。

    【讨论】:

    • 我之前使用过 CefLoadHandler::OnLoadEnd 但它在每一帧都被触发,似乎 OnLoadingStateChange 是要走的路。非常感谢:)
    • @Norwido OnLoadEnd 如果您添加条件也可以工作:if (browser->GetMainFrame()->GetIdentifier() == frame->GetIdentifier())。如果对您有帮助,请不要忘记 +1 / 接受答案。
    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 2011-04-20
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多