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