我已经从 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/