最近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支持的浏览器,它允许整页截图?
答案 0 :(得分:4)
这就是我使用的,只需缝合它:
#!/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的问题是,html节点设置为&#34;显示:固定&#34;不断重复每一次拍摄。
答案 1 :(得分:1)
用这个得到了很好的结果。它是无头的,但对于正常模式可能会有相同的结果。
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>)
答案 2 :(得分:-1)
看起来可以这样做:
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')