Selenium 屏幕截图性能
Selenium screenshot performance
我正在用视频软件处理网页中发生的动画。我目前正在使用带有 Chrome 的 Selenium 4,我希望获得更好的性能。
我找不到通过 Selenium 利用 Page.startScreencast
方法的方法,所以我目前的方法只是使用
定期截取屏幕截图
screenshotAs = ((TakesScreenshot) d).getScreenshotAs(OutputType.BYTES);
BufferedImage bi = ImageIO.read(new ByteArrayInputStream(screenshotAs));
在查看了 VisualVM 的性能后,我发现 getScreenshotAs
花费了大量时间,即使我使用非远程驱动程序实例,它似乎也通过 HTTP 与 Chrome 通信。
另一方面,屏幕截图以 Base64 编码的字符串形式返回,然后将其解码为 byte[],然后 ImageIO
读取它。因为我需要处理原始图像,所以效率很低,我想知道是否有更好的低级方法来处理图像数据。如果可能的话,我想消除 png 往返,甚至是 Base64 往返。
我也不会在发生任何更改时收到通知(与 startScreencast
的工作方式相反),因此如果没有更改,我可以避免拍摄不必要的屏幕截图。
有没有我想念的更好的方法?也许 JCEF 会让我更有效地做到这一点? (我在他们的文档中找不到这个)
我也在研究 OBS 如何在其浏览器源代码实现中使用 CEF,但不幸的是,我无法真正看到图像数据是如何从 CEF 浏览器中取出的,因为我不熟悉该级别的 C++。
我也一直在努力如何通过 Selenium 接口调用 startScreencast,但是还有其他库允许您这样做; Selenium 4 只是一个帮助包装器来抽象一些复杂性。
ChromeDriver driver=new ChromeDriver();
String addr = ((Map<String, String>) driver.getCapabilities().getCapability("goog:chromeOptions")).get("debuggerAddress");
ChromeService cs = new ChromeServiceImpl(addr.split(":")[0],
Integer.parseInt(addr.split(":")[1] ));
final ChromeTab tab = cs.getTabs().get(0);
final ChromeDevToolsService devToolsService = cs.createDevToolsService(tab);
final Page page = devToolsService.getPage();
page.startScreencast(StartScreencastFormat.JPEG, 20, 1000, 1000, 5);
page.onScreencastFrame(
event -> {
//Do you stuff...
page.screencastFrameAck(event.getSessionId());
}
);
此代码使用 https://github.com/kklisura/chrome-devtools-java-client
我正在用视频软件处理网页中发生的动画。我目前正在使用带有 Chrome 的 Selenium 4,我希望获得更好的性能。
我找不到通过 Selenium 利用 Page.startScreencast
方法的方法,所以我目前的方法只是使用
screenshotAs = ((TakesScreenshot) d).getScreenshotAs(OutputType.BYTES);
BufferedImage bi = ImageIO.read(new ByteArrayInputStream(screenshotAs));
在查看了 VisualVM 的性能后,我发现 getScreenshotAs
花费了大量时间,即使我使用非远程驱动程序实例,它似乎也通过 HTTP 与 Chrome 通信。
另一方面,屏幕截图以 Base64 编码的字符串形式返回,然后将其解码为 byte[],然后 ImageIO
读取它。因为我需要处理原始图像,所以效率很低,我想知道是否有更好的低级方法来处理图像数据。如果可能的话,我想消除 png 往返,甚至是 Base64 往返。
我也不会在发生任何更改时收到通知(与 startScreencast
的工作方式相反),因此如果没有更改,我可以避免拍摄不必要的屏幕截图。
有没有我想念的更好的方法?也许 JCEF 会让我更有效地做到这一点? (我在他们的文档中找不到这个)
我也在研究 OBS 如何在其浏览器源代码实现中使用 CEF,但不幸的是,我无法真正看到图像数据是如何从 CEF 浏览器中取出的,因为我不熟悉该级别的 C++。
我也一直在努力如何通过 Selenium 接口调用 startScreencast,但是还有其他库允许您这样做; Selenium 4 只是一个帮助包装器来抽象一些复杂性。
ChromeDriver driver=new ChromeDriver();
String addr = ((Map<String, String>) driver.getCapabilities().getCapability("goog:chromeOptions")).get("debuggerAddress");
ChromeService cs = new ChromeServiceImpl(addr.split(":")[0],
Integer.parseInt(addr.split(":")[1] ));
final ChromeTab tab = cs.getTabs().get(0);
final ChromeDevToolsService devToolsService = cs.createDevToolsService(tab);
final Page page = devToolsService.getPage();
page.startScreencast(StartScreencastFormat.JPEG, 20, 1000, 1000, 5);
page.onScreencastFrame(
event -> {
//Do you stuff...
page.screencastFrameAck(event.getSessionId());
}
);
此代码使用 https://github.com/kklisura/chrome-devtools-java-client