Делать скриншот всей страницы с Python Selen и Firefox или Chrome без головы

Этот пост связан с этим:

Снимок экрана Python Selen не получить всю страницу

Решение с PhantomsJS, кажется, работает:

driver = webdriver.PhantomJS()    
driver.maximize_window()
driver.get('http://www.angelfire.com/super/badwebs/')  
scheight = .1
while scheight < 9.9:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight/%s);" % scheight)
    scheight += .01        
driver.save_screenshot('angelfire_phantomjs.png')

Однако решение от 2014 года и PhantomJS пока что устарела. Я получаю именно это сообщение об ошибке:

...
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '

Если я попытаюсь приспособиться, например, к Firefox без головы, вот так:

from selenium import webdriver

firefox_options = webdriver.FirefoxOptions()
firefox_options.set_headless() 
firefox_driver = webdriver.Firefox(firefox_options=firefox_options)

firefox_driver.get('http://www.angelfire.com/super/badwebs/')  
scheight = .1
while scheight < 9.9:
    firefox_driver.execute_script("window.scrollTo(0, document.body.scrollHeight/%s);" % scheight)
    scheight += .01        
firefox_driver.save_screenshot('angelfire_firefox.png')

снимок экрана сделан, но не всей страницы.

Есть идеи, как заставить его работать с Firefox или Chrome без головы?

(PS Я тоже нашел этот пост:

Снимок экрана полной страницы с помощью Selenium Python (chromedriver)

но, похоже, это не общее решение, а гораздо сложнее.)

1 ответ

Это метод, который я придумал, который делает идеальный скриншот веб-сайта любой длины. Он использует тот факт, что браузер без головы может установить окно любого размера до его запуска, задача состоит в том, чтобы получить высоту прокрутки перед запуском браузера без головы. Это единственный недостаток, запустить сайт дважды.

from selenium import webdriver
from PIL import Image
from selenium.webdriver.chrome.options import Options
import time

url = 'any website url'

#run first time to get scrollHeight
driver = webdriver.Chrome()
driver.get(url)
#pause 3 second to let page load
time.sleep(3)
#get scroll Height
height = driver.execute_script("return Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight )")
print(height)
#close browser
driver.close()

#Open another headless browser with height extracted above
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument(f"--window-size=1920,{height}")
chrome_options.add_argument("--hide-scrollbars")
driver = webdriver.Chrome(options=chrome_options)

driver.get(url)
#pause 3 second to let page loads
time.sleep(3)
#save screenshot
driver.save_screenshot('screen_shot.png')
driver.close()
Другие вопросы по тегам