How to get a full-page screenshot in Python using Selenium and Screenshot

Question:

I’m trying to get a full-length screenshot and haven’t been able to make it work. Here’s the code I’m using:

from Screenshot import Screenshot
from selenium import webdriver
import time

ob = Screenshot.Screenshot()
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
url = "https://stackoverflow.com/questions/73298355/how-to-remove-duplicate-values-in-one-column-but-keep-the-rows-pandas"
driver.get(url)
img_url = ob.full_Screenshot(driver, save_path=r'.', image_name='example.png')
print(img_url)
driver.quit()

But this gives us a clipped screenshot:

enter image description here

So as you can see that’s just what the driver window is showing, not a full-length screenshot. How can I tweak this code to get what I’m looking for?

Asked By: matt_lnrd

||

Answers:

Here is an example of how you can take full <body> screenshot of a page:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time as t

chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument('disable-notifications')
chrome_options.add_argument("window-size=1280,720")

webdriver_service = Service("chromedriver/chromedriver") ## path to where you saved chromedriver binary
browser = webdriver.Chrome(service=webdriver_service, options=chrome_options)

url = 'https://stackoverflow.com/questions/7263824/get-html-source-of-webelement-in-selenium-webdriver-using-python?rq=1'


browser.get(url)
required_width = browser.execute_script('return document.body.parentNode.scrollWidth')
required_height = browser.execute_script('return document.body.parentNode.scrollHeight')
browser.set_window_size(required_width, required_height)
t.sleep(5)
browser.execute_script("window.scrollTo(0,document.body.scrollHeight);")
required_width = browser.execute_script('return document.body.parentNode.scrollWidth')
required_height = browser.execute_script('return document.body.parentNode.scrollHeight')
browser.set_window_size(required_width, required_height)
t.sleep(1)
body_el = WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.TAG_NAME, "body")))
body_el.screenshot('full_page_screenshot.png')
print('took full screenshot!')
t.sleep(1)
browser.quit()

Selenium setup is for linux, but just note the imports, and the part after defining the browser. Code above is starting from a small window, then it maximizes it to fit in the full page body, then it waits a bit and computes the body size again, just to account for some scripts kicking in on user’s input. Then it takes the screenshot – tested and working on a really long page.

Answered By: platipus_on_fire

To get a full-page screenshot using Selenium-Python clients you can use the GeckoDriver and based save_full_page_screenshot() method as follows:

  • Code:

    driver = webdriver.Firefox(service=s, options=options)
    driver.get('https://stackoverflow.com/questions/73298355/how-to-remove-duplicate-values-in-one-column-but-keep-the-rows-pandas')
    driver.save_full_page_screenshot('fullpage_gecko_firefox.png')
    driver.quit()
    
  • Screenshot:

fullpage_gecko_firefox


tl; dr

[py] Adding full page screenshot feature for Firefox

Answered By: undetected Selenium