Captura de pantalla de una página completa con Selenium Marionette en Python

Después de la reciente actualización de Firefox a la versión 47, nos vimos obligados a instalar la extensión Marionette para poder seguir usando el controlador web de selenium, y en mi caso también actualizar el selenium de 2.52 a 2.53.

Utilizo la versión de python de Selenium webdriver para adquirir imágenes de alta resolución de mapas renderizados en HTML y JavaScript. Anteriormente, esto funcionaba bien en Firefox y las capturas de pantalla podían tomarse de toda la página, mucho más allá de las dimensiones de mi propia pantalla. Sin embargo, con los cambios recientes, la captura de pantalla se toma solo del área visible en la pantalla. Yo uso el siguiente código:

import time from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities caps = DesiredCapabilities.FIREFOX caps["marionette"] = True browser = webdriver.Firefox(capabilities=caps) browser.get(html_file) time.sleep(15) browser.save_screenshot(image_name) browser.quit() 

Ya he considerado: degradar, unir varias capturas de pantalla o cambiar a Qgis. Sin embargo, preferiría una solución más elegante que me permita seguir usando la última versión de firefox y aproximadamente la misma metodología. ¿Alguien sabe una solución para esto? ¿Tal vez engañando al selenium al pensar que la ventana gráfica es más grande? ¿O utilizando otro navegador compatible con Linux que permita la captura de pantalla de la página completa?

Esto es lo que yo uso, solo lo coso:

 #!/usr/bin/python from selenium import webdriver from PIL import Image from cStringIO import StringIO verbose = 1 browser = webdriver.Firefox() browser.get('http://stackoverflow.com/questions/37906704/taking-a-whole-page-screenshot-with-selenium-marionette-in-python') # from here http://stackoverflow.com/questions/1145850/how-to-get-height-of-entire-document-with-javascript js = 'return Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);' scrollheight = browser.execute_script(js) if verbose > 0: print scrollheight slices = [] offset = 0 while offset < scrollheight: if verbose > 0: print offset browser.execute_script("window.scrollTo(0, %s);" % offset) img = Image.open(StringIO(browser.get_screenshot_as_png())) offset += img.size[1] slices.append(img) if verbose > 0: browser.get_screenshot_as_file('%s/screen_%s.png' % ('/tmp', offset)) print scrollheight screenshot = Image.new('RGB', (slices[0].size[0], scrollheight)) offset = 0 for img in slices: screenshot.paste(img, (0, offset)) offset += img.size[1] screenshot.save('/tmp/test.png') 

código también aquí: https://gist.github.com/fabtho/13e4a2e7cfbfde671b8fa81bbe9359fb

El problema con el desplazamiento / stich es que los nodos html configurados para “mostrar: fijo” se repiten en cada disparo que realice.

Obtuve buenos resultados con esto. No tiene cabeza, pero para el modo normal probablemente será el mismo resultado.

 from selenium import webdriver firefox_options = webdriver.FirefoxOptions() firefox_options.set_headless() firefox_driver = webdriver.Firefox(executable_path=, firefox_options=firefox_options) firefox_driver.get() firefox_elem = firefox_driver.find_element_by_tag_name('html') firefox_elem.screenshot() 

Parece que se puede hacer como:

 from selenium import webdriver browser = webdriver.PhantomJS() browser.get('http://sofes.miximages.com/python/taking-a-whole-page-screenshot-with-selenium-marionette-in-python') browser.save_screenshot('screen.png')