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

Art*_*hur 1 java chromium-embedded

我已经从https://bitbucket.org/chromiumembedded/java-cef/overview构建了 java-cef ,但我仍然无法在文档和 javadoc 中找到有关如何访问 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]");
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

cla*_*pas 5

您需要将负载处理程序附加到 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

然后,如果你想从浏览器接收脚本事件在Java代码中,你需要注册一个电话cefQueryCefBrowser::executeJavaScript(String code),通过所有必要的数据,一个参数,并配有消息路由器,如接受它:

CefMessageRouter msgRouter = CefMessageRouter.create();
msgRouter.addHandler(new MessageRouterHandler(), true);
cefClient.addMessageRouter(msgRouter);
...
browser.executeJavaScript("cefQuery('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"
    }
}
Run Code Online (Sandbox Code Playgroud)