Схватить скриншот Chrome с помощью инструментов разработчика Chrome? - PullRequest
6 голосов
/ 28 января 2012

Можно ли получить снимок экрана с открытым окном с помощью удаленного отладчика Chrome Development Tools?

Например, я подключаюсь к удаленному порту отладки, и у меня есть это код, который появляется в пустом окне:

   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)

Затем я загружаю свой целевой URL с помощью:

    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

Где я открываю URL http://www.google.com в браузере Chromium с помощью loadPage () выше. Это прекрасно работает, пока всплывающее окно "Google - Chromium" не имеет препятствий и имеет фокус. Опустите еще одно окно поверх его, и я получу большую черную область, которая не была отрисована.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 09 декабря 2014

Протокол удаленной отладки 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()

(фрагмент из https://github.com/TeamMentor/TM_4_0_Design/blob/Issue_80_Jade_Cleanup/QA/API/QA-TM_4_0_Design.coffee#L54)

0 голосов
/ 30 апреля 2017

Если вам нужно решение на основе 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();
}

Screenshot.java

0 голосов
/ 28 января 2012
...