3

Disclaimer: I know, that there is a similar question already, but none of the answers works for headless browser, so I have decided to make 1 more and a bit more detailed one (the question I have mentioned: Take screenshot of full page with Selenium Python with chromedriver)

Hello everyone.

I have stumbled upon a quite easy looking, yet hard to solve problem. I need to take a screenshot of a NON-HEADLESS BROWSER on a display, that is 1920x1080 (will be important later) that is going to make a screenshot of the whole webpage, not only the part that you can currently see.

What have I tried:

import os
import time

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument("--start-maximized")
chromedriver = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'chromedriver.exe')
chrome = webdriver.Chrome(chromedriver, options=chrome_options)

url = 'https://stackoverflow.com/'

chrome.get(url)
time.sleep(2)

total_height = chrome.execute_script("return document.body.parentNode.scrollHeight") + 1000

chrome.set_window_size(1920, total_height)

time.sleep(2)
chrome.save_screenshot("screenshot1.png")
chrome.quit()

^ this one, with Headless works perfectly fine, unfortunately, when I remove the --headless option, selenium will try to resize itself, but since its trying to resize above the 1080 (height of the display) its immediately adjusted to the 1080 which leads to a screenshot 1920x1080. What I need in a "theoretical" way is to make selenium go headless only for the moment, when its taking the screenshot (that unfortunatelly to my knowledge is not possible).

Other commonly used methods that does not work when browser is not headless:

el = driver.find_element_by_tag_name('body')
el.screenshot(path)
original_size = driver.get_window_size()
required_width = driver.execute_script('return document.body.parentNode.scrollWidth')
required_height = driver.execute_script('return document.body.parentNode.scrollHeight')
driver.set_window_size(required_width, required_height)
driver.find_element_by_tag_name('body').screenshot(path)  # avoids scrollbar
driver.set_window_size(original_size['width'], original_size['height'])
element = chrome.find_element_by_tag_name('body')
element_png = element.screenshot_as_png
with open("test2.png", "wb") as file:
    file.write(element_png)

With headless option

With headless option

Without headless option

Without headless option

StyleZ
  • 1,276
  • 3
  • 11
  • 27

1 Answers1

5

You can use Screenshot_Clipping in order to scroll the page and take screenshot from each scroll.

Just run this command in python3

pip install Selenium-Screenshot

Then create an object of Screenshot:

ob=Screenshot_Clipping.Screenshot()

With that object you can use ob.full_Screenshot in order to capture full screen

Checkout PythonFullPageScreenShot project on Github for full source code

Note that screenshot can take only 10000 of height of website, You can scale to 100 in order to capture full height

Hana Bzh
  • 2,212
  • 3
  • 18
  • 38
  • Hi, The answer seems to be working the way I wanted it to work. Altho, I have a question regarding it ... is there a simple way how to make that screenshot not to be cut ? (there are a few places of the page that are missing. I have played with "viewport" width a height, but it doesnt look like its working. Thx in advance :) – StyleZ Sep 20 '21 at 12:31
  • 1
    found out how to do it right I typed that message :D ... didnt notice that I can easily manipulate the `viewport_height`. Thank you for the answer ! Altho it would be nice if it could be somehow automated – StyleZ Sep 20 '21 at 12:40