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