Java CEF - 是否可以访问 DOM 文档和加载页面的元素?

Java CEF - Is it possible to access DOM document and elements of loaded page?

我已经从 https://bitbucket.org/chromiumembedded/java-cef/overview 构建了 java-cef,但我仍然无法在文档和 java文档中找到有关如何访问 DOM 的任何信息加载页面的文档和元素。

我需要通过 document.getElementsByClassName("example");document.getElementsByTagName("div");.

之类的方式访问元素

类似于 JSoup 中的内容 - https://jsoup.org/cookbook/extracting-data/selector-syntax :

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]");

Java-CEF 中是否有相同的功能?

谢谢!

您需要将负载处理程序附加到 CEF 客户端并在处理程序内部调用 CefBrowser::executeJavaScript(String code),例如:

cefClient.addLoadHandler(new LoadHandler());
...
class LoadHandler extends CefLoadHandlerAdapter {
    @Override
    public void onLoadEnd(CefBrowser browser, int frameId, int status) {
        String jscode = "var x = document.getElementsByClassName('example')";
        browser.executeJavaScript(jscode);
    }
}

更新

然后,如果您想在 Java 代码中接收来自浏览器脚本的事件,您需要使用 CefBrowser::executeJavaScript(String code) 注册一个调用 cefQuery,并在单个文件中传递所有必要的数据参数,并使用消息路由器接收它,例如:

CefMessageRouter msgRouter = CefMessageRouter.create();
msgRouter.addHandler(new MessageRouterHandler(), true);
cefClient.addMessageRouter(msgRouter);
...
browser.executeJavaScript("cefQuery({request: 'Hello World'})");
...
class MessageRouterHandler extends CefMessageRouterHandlerAdapter {
    @Override
    public boolean onQuery(CefBrowser browser, long query_id, String request, boolean persistent, CefQueryCallback callback) {
        System.out.println(request); // prints "Hello World"
        
        return true;
    }
}