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

标签 java chromium-embedded

我已经从 https://bitbucket.org/chromiumembedded/java-cef/overview 构建了 java-cef ,但我仍然在 docs 和 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]");

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;
    }
}

关于Java CEF - 是否可以访问 DOM 文档和加载页面的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872128/

相关文章:

java - 如何在java中创建抗锯齿文本图像

java - 确定获得(纬度、经度)对的正确顺序以绘制 N 边的闭合正多边形的方法

java - ValueAnimator 改变背景颜色

java - 使用多线程读取单个文件 : should speed up?

java - 最新版本的 spring boot 问题

javascript - 查找 Chrome 正在运行点火或曲轴

c# - 如何在 cefsharp.winform chromium webbrowser 中渲染字符串(html/xhtml/xml)而不是来自 url

wpf - 使用 Protractor 对 WPF 中 CefSharp 浏览器下托管的 AngularJS 应用程序进行自动化测试

javascript - Chromium Embedded 如何从 C++ 执行 javascript 回调?