用Python中的Selenium木偶拍摄整页截图

2024-05-26 19:53:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在最近的Firefox升级到版本47之后,我们被迫安装了木偶扩展以保持能够使用selenium webdriver,在我的例子中,还将selenium从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的浏览器,允许完整的页面截图?


Tags: fromimport版本browser屏幕timeselenium页面
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

滚动/stich的问题是,设置为“display:fixed”的html节点在每次拍摄时都会重复。

看起来可以这样做:

from selenium import webdriver

browser = webdriver.PhantomJS()
browser.get('http://stackoverflow.com/questions/37906704/taking-a-whole-page-screenshot-with-selenium-marionette-in-python')
browser.save_screenshot('screen.png')

结果很好。它是无头的,但对于正常模式可能会得到相同的结果。

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

相关问题 更多 >

    热门问题