I spent some time playing with Selenium 4 trying to get a full page screenshot, this is what I found.
- We will use the devtools protocol of Chrome Driver
- this is done by driver.execute_cdp_cmd(command, parameters)
- The command is
Page.captureScreenshot
- Parameters are documented here
- the tricky param is
clip
# I am assuming we already have a driver object.
# We need the dimensions of the content
page_rect = driver.execute_cdp_cmd('Page.getLayoutMetrics', {})
# parameters needed for ful page screenshot
# note we are setting the width and height of the viewport to screenshot, same as the site's content size
screenshot_config = {'captureBeyondViewport': True,
'fromSurface': True,
'clip': {'width': page_rect['contentSize']['width'],
'height': page_rect['contentSize']['height'],
'x': 0,
'y': 0,
'scale': 1},
}
# Dictionary with 1 key: data
base_64_png = driver.execute_cdp_cmd('Page.captureScreenshot', screenshot_config)
# Write img to file
with open("imageToSave.png", "wb") as fh:
fh.write(base64.urlsafe_b64decode(base_64_png['data'))
Why am I writing this?
There is no good documentation related to the DevTools protocol and its integration to selenium is still in the works in Selenium 4 at the time I wrote this.
I Hope this helps any lost soul.
Top comments (3)
On latest release of the Selenium version 4.16 you need to configure the headless mode differently. as:
options.add_argument("--headless=new")
I have left the full code for taking full-size screenshots on my GitHub page here:
GitHub
This did help a lost soul! Please post it to stackoverflow!
There's a missing bracket on the last line - it should read
base_64_png['data']
Also, the screenshot I captured had extra whitespace at the bottom, but I should be able to troubleshoot that.
UPDATE: The reference docs you linked show that contentSize has been deprecated since you wrote this. I got a better result by using
page_rect['cssContentSize']
as advised in the docs.This code didn't work for me...
But eventually this helped:
driver.execute_script("document.body.style.zoom='80%'")