是否可以使用Chrome开发工具远程调试器获取打开窗口的屏幕截图?
例如,我正在连接到远程调试端口,我有这个 弹出空窗口的代码:
private void sendWindowPop(int width, int height) throws
IOException {
hsc.send("{\"method\": \"Runtime.evaluate\", \"id\": "
+ hsc.nextInt()
+ ", \"params\": {"
+ "\"expression\":
\"window.open('about:blank','name','toolbar=0,scrollbars=0,"
+ "location=0,status=0,menubar=0,resizable=0,width="
+ width
+ ",height="
+ height
+ "');\""
+ "}}");
(hsc是我在http://localhost:9222处与调试器的连接)
然后,我用这个加载我的目标网址:
private void loadPage(String uriString) throws IOException {
hsc.send("{\"method\": \"Page.open\", \"id\": " +
hsc.nextInt() + ", \"params\": {\"url\": \"" + uriString + "\"}}");
hsc.waitFor(ChromeNotifications.PAGE_LOADEVENTFIRED, DEFAULT_TIMEOUT_MILLIS);
}
上面的代码工作正常,首先弹出一个窗口,然后加载 URL。理想情况下,我想做的下一件事就是抓住截图 已加载的网页。现在,这些浏览器窗口会弹出一个 Xvfb虚拟桌面,我可以使用ImageMagick的导入工具来抓取 目标窗口的屏幕截图,但只有在中才会显示 前景
这是一个问题,因为此应用程序旨在运行 并行多个窗口弹出到虚拟桌面。任何 窗口重叠我的目标窗口只会给我一个黑色 截图,因为Xfvb只呈现可见的内容。
我还查看了API参考,chrome.tabs.captureVisibleTab。那里没有运气,它没有捕捉到不可见的东西。
有没有办法,使用远程调试器,抓取一个截图 打开窗户?
(供参考,我的导入ImageMagick命令就是这个)
DISPLAY=:0.0 import -window "Google - Chromium" screenshot.png
我使用上面的loadPage()在我的chrome浏览器中打开URL http://www.google.com。只要弹出的“Google - Chromium”窗口畅通无阻且具有焦点,它就能很好地工作。在其中的一部分上放下另一个窗口,我得到一个未渲染的大黑区域。
谢谢!
答案 0 :(得分:4)
Chrome远程调试协议现在支持 Page.captureScreenshot 功能
这是咖啡脚本中的一个例子
screenshot: (name, callback)=>
safeName = name.replace(/[^()^a-z0-9._-]/gi, '_') + ".png"
png_File = "./_screenshots".append_To_Process_Cwd_Path().folder_Create()
.path_Combine(safeName)
@chrome._chrome.Page.captureScreenshot (err, image)->
require('fs').writeFile png_File, image.data, 'base64',(err)->
callback()
答案 1 :(得分:0)
检查此网站:
答案 2 :(得分:0)
如果您需要基于Java的解决方案,请使用cdp4j来捕获整页屏幕。
public static void main(String[] args) throws IOException, InterruptedException {
SessionFactory factory = new Launcher().launch();
Path file = createTempFile("screenshot", ".png");
try (Session session = factory.create()) {
session.navigate("https://webfolder.io");
session.waitDocumentReady();
byte[] data = session.captureScreenshot();
write(file, data);
}
if (isDesktopSupported()) {
getDesktop().open(file.toFile());
}
factory.close();
}