Python + Selenium + PhantomJS визуализировать PDF
Можно ли использовать PhantomJS's
рендеринг для возможностей PDF, когда PhantomJS используется в сочетании с Selenium и Python? (т.е. mimic page.render('file.pdf')
поведение внутри Python через Selenium).
Я понимаю, что в этом случае используется GhostDriver
, а GhostDriver
существенно не поддерживает печать.
Если возможен другой вариант, который не является селеном, я все уши.
Ответы
Ответ 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")
см. также мой ответ на тот же вопрос здесь.
Ответ 2
Вы можете использовать selenium.selenium.capture_screenshot('file.png')
, но это даст вам снимок экрана как png, а не pdf. Кажется, что нет способа получить скриншот в формате pdf.
Вот документы для capture_screenshot: http://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html?highlight=screenshot#selenium.selenium.selenium.capture_screenshot
Ответ 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');
}