Selenium Can Make Hi-DPI, Retina Style Screenshots (Firefox and Chrome)
With just a single line of code you can modify your Selenium browser to operate in (x.x) density mode. This means you can take higher-DPI screenshots as you might on retina screens.
With just a single line of code you can modify your Selenium browser to operate in (x.x) density mode. This means you can take higher-DPI screenshots as you might on retina screens.
Firefox Code Sample
my_dpi = 2.0
profile = webdriver.FirefoxProfile()
profile.set_preference("layout.css.devPixelsPerPx", str(my_dpi))
Yes kids, it is this simple. All you need to do is set a preference on your profile.
NOTE: The gotcha here is that you have to cast the float to a string using str()
. That is non-obvious and will save you a ton of time in debugging. Otherwise it is silently ignored.
Chrome Code Sample
Chrome is a little different. There is not a preferences profile that you tweak with various settings. In this case you simple pass in a command line option when launching the browser.
my_dpi = 2.0
options = ChromeOptions()
# ... other options..
options.add_argument(f"--force-device-scale-factor={my_dpi}")
Full Code Sample
This is an export from my Jupyter Notebook. Note, you will need to pip install selenium
as well as have the firefox-geckodriver
installed with brew or whatever linux flavor.
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.common.exceptions import NoSuchElementException, WebDriverException
from time import sleep
my_dpi = 2.0
profile = webdriver.FirefoxProfile()
profile.set_preference("layout.css.devPixelsPerPx", str(my_dpi))
options = Options()
options.headless = True
driver = webdriver.Firefox(options=options, firefox_profile=profile)
driver.set_page_load_timeout(60)
driver.set_window_size(1440, 800)
driver.get('https://www.simplecto.com')
driver.save_screenshot("simplecto-dpi2.0.png")
driver.quit()
NOTE: This was not tested on Windows. Sorry not sorry.
You can try DPI at 1.0
and 2.0
to see the sizable difference in disk space and memory required. This becomes a little more work for a CPU when running full-size page screenshots.