python - phantomjs 2.1 1 macosx zip
Python+Selenium+PhantomJS render en PDF (4)
¿Probado pdfkit ? Puede renderizar archivos PDF desde páginas html.
¿Es posible usar PhantomJS''s
renderizado PhantomJS''s
a las capacidades de PDF cuando PhantomJS se usa en combinación con Selenium y Python? (es decir, imite el page.render(''file.pdf'')
dentro de Python a través de Selenium).
Me doy cuenta de que esto utiliza GhostDriver
, y GhostDriver
realmente no admite mucho en la forma de imprimir.
Si es posible otra alternativa que no sea el selenio, soy todo oídos.
Aquí hay una solución que utiliza selenio y un comando especial para GhostDriver (debería funcionar desde GhostDriver 1.1.0 y PhantomJS 1.9.6, probado con 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://.com'')
download(driver, "save_me.pdf")
Véase también mi respuesta a la misma pregunta here .
Puedes usar selenium.selenium.capture_screenshot(''file.png'')
pero eso te dará una captura de pantalla como un png, no un pdf. No parece haber una manera de obtener una captura de pantalla como pdf.
Aquí están los documentos para capture_screenshot: http://selenium.googlecode.com/git/docs/api/py/selenium/selenium.selenium.html?highlight=screenshot#selenium.selenium.selenium.capture_screenshot
Rechazado, sé que mencionaste que no querías usar subprocesos, pero ...
Es posible que realmente pueda aprovechar la comunicación de subproceso más de lo que anticipó. Teóricamente, podría tomar el ejemplo estándar / estándar de Ariya y extenderlo para que sea un script de envoltorio relativamente genérico. Es posible que primero acepte una página para cargar, luego escuche (y ejecute) sus acciones de prueba en esa página. Eventualmente, puede iniciar el .render
o incluso hacer una captura genérica para el manejo de errores:
try {
// load page & execute stdin commands
} catch (e) {
page.render(page + ''-error-state.pdf'');
}