Взятие целого скриншота страницы с Selenium Marionette в Python

После недавнего обновления Firefox до версии 47 мы были вынуждены установить расширение Marionette, чтобы иметь возможность использовать selenium webdriver, и в моем случае также обновить селен с 2,52 до 2,53.

Я использую версию selenium webdriver для python для получения изображений с высоким разрешением карт, отображаемых в HTML и JavaScript. ранее это отлично работало в firefox, и скриншоты могли быть взяты из всей страницы, далеко за пределы моего собственного экрана. Однако с недавними изменениями снимок экрана занимает только область, видимая на экране. Я использую следующий код:

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()

Я уже рассмотрел: понижение, сшивание нескольких скриншотов или переход на Qgis. Однако я предпочел бы более элегантное решение, которое позволило бы мне использовать последнюю версию firefox и примерно такую ​​же методологию. Кто-нибудь знает решение этого? возможно, обманывая селен, думая, что видовой экран больше? или с помощью другого поддерживаемого linux браузера, который позволяет полностью скриншот страницы?

Ответ 1

Это то, что я использую, просто сшить его:

#!/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/info/37906704/taking-a-whole-page-screenshot-with-selenium-marionette-in-python')

# from here http://stackoverflow.com/info/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')

также здесь: https://gist.github.com/fabtho/13e4a2e7cfbfde671b8fa81bbe9359fb

Проблема с прокруткой/стихом заключается в том, что узлы html, установленные на "display: fixed", повторяются при каждом снимке.