3

在最近的 Firefox 升级到版本 47 之后,我们被迫安装 Marionette 扩展以继续使用 selenium webdriver,并且在我的情况下,还将 selenium 从 2.52 升级到 2.53。

我使用 python 版本的 selenium webdriver 来获取以 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 的浏览器,它允许整页截图?

4

2 回答 2

3

这是我使用的,只需缝合它:

#!/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')

代码也在这里: https ://gist.github.com/fabtho/13e4a2e7cfbfde671b8fa81bbe9359fb

滚动/缝合的问题是,设置为“显示:已修复”的 html 节点在您每次拍摄时都会重复。

于 2017-03-01T12:20:42.747 回答
3

以此取得了不错的成绩。它是无头的,但对于正常模式可能是相同的结果。

from selenium import webdriver

firefox_options = webdriver.FirefoxOptions()
firefox_options.set_headless() 

firefox_driver = webdriver.Firefox(executable_path=<path_to_gecko_driver>, firefox_options=firefox_options)
firefox_driver.get(<some_url>)

firefox_elem = firefox_driver.find_element_by_tag_name('html')
firefox_elem.screenshot(<png_screenshot_file_path>)
于 2018-03-28T13:20:24.357 回答