2013-06-04 2 views
19

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

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

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

+0

Вы посмотрели на Pypdf2? http://www.blog.pythonlibrary.org/tag/python-pdf-series/ – Amit

+0

@Amit: Довольно широко, поскольку я использую его все время. Даже сами Phaseit сказали, что «PyPDF2 не знает HTML». Он не будет надежно отображать любой HTML. – Rejected

+0

@Rejected вам нужен скриншот, который будет происходить в точном состоянии во время тестирования? Или вы просто хотите загрузить страницу и визуализировать в PDF? –

ответ

1

Вы можете использовать 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

+1

PDF является ключевым фактором. Я не могу свести к простому изображению по множеству причин, таких как поиск текста, формы, встроенные медиа и т. Д. – Rejected

1

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

+0

Я также изучил его. PDFKit преобразует HTML -> PDF, но не имеет дополнительной функциональности. Контентный анализ, чтобы определить, содержит ли страница желаемое содержимое до печатания PDF, не представляется возможным. – Rejected

+0

Да, у меня такие же проблемы с PDFKit, я хотел бы использовать более продвинутый рендеринг, используя его с помощью JS-фреймворка. Это довольно сложно :( – moodh

+0

«Анализ контента, чтобы определить, содержит ли страница нужный контент» - > Ну, не можете ли вы сделать контентный анализ самостоятельно, и если он будет соответствовать, вы просто отправите его для рендеринга с помощью pdfkit. Вот как я это сделаю. – Jonathan

0

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

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

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

Выполнение кода, полученного через stdin, необходимо выполнить с помощью 'eval', и из моего опыта попыток сделать это, это как inse лечения и ненадежности. Разве я не ошибаюсь? – Rejected

+0

Хотя вы хотите быть осторожным с вашим вводом (с точки зрения надежности), вам, вероятно, не придется беспокоиться о безопасности, поскольку (я предполагаю), что вы владеете процессом. –

+0

Вы также можете использовать команды белого списка и т. Д. Для ускорения бросков при неожиданных ошибках. Тем не менее, лучший сценарий, который я ожидал, заключается в том, что вы извлекаете свои тесты (или другую логику), которые могут возникнуть перед захватом экрана, в отдельный файл .js и загружать его на страницу (http://phantomjs.org/api/phantom/ Способ/впрыснуть-js.html). Вы могли бы иметь Python при максимальном проходе arg для конкретного файла JS для загрузки. –

8

Вот решение, используя селен и специальную команду для 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") 

смотри также мой ответ на тот же вопрос here.

Смежные вопросы