Подтвердить что ты не робот

Python + Selenium + PhantomJS визуализировать PDF

Можно ли использовать PhantomJS's рендеринг для возможностей PDF, когда PhantomJS используется в сочетании с Selenium и Python? (т.е. mimic page.render('file.pdf') поведение внутри Python через Selenium).

Я понимаю, что в этом случае используется GhostDriver, а GhostDriver существенно не поддерживает печать.

Если возможен другой вариант, который не является селеном, я все уши.

4b9b3361

Ответ 1

Вот решение, использующее селен и специальную команду для GhostDriver (он должен работать с GhostDriver 1.1.0 и PhantomJS 1.9.6, протестирован с PhantomJS 1.9.8):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Download a webpage as a PDF."""


from selenium import webdriver


def download(driver, target_path):
    """Download the currently displayed page to target_path."""
    def execute(script, args):
        driver.execute('executePhantomScript',
                       {'script': script, 'args': args})

    # hack while the python interface lags
    driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')
    # set page format
    # inside the execution script, webpage is "this"
    page_format = 'this.paperSize = {format: "A4", orientation: "portrait" };'
    execute(page_format, [])

    # render current page
    render = '''this.render("{}")'''.format(target_path)
    execute(render, [])


if __name__ == '__main__':
    driver = webdriver.PhantomJS('phantomjs')
    driver.get('http://stackoverflow.com')
    download(driver, "save_me.pdf")

см. также мой ответ на тот же вопрос здесь.

Ответ 3

Пробовал pdfkit? Он может отображать PDF файлы с html-страниц.

Ответ 4

@rejected, я знаю, что вы упомянули о том, что не хотите использовать подпроцессы, но...

Фактически вы можете использовать связь с подпроцессом больше, чем вы ожидали. Теоретически вы можете взять Ariya stdin/stdout example и расширить его как относительно общую оболочку script. Он может сначала принять загружаемую страницу, а затем прослушать (& выполнить) ваши тестовые действия на этой странице. В конце концов, вы можете запустить .render или даже сделать общий захват для обработки ошибок:

try {
  // load page & execute stdin commands
} catch (e) {
  page.render(page + '-error-state.pdf');
}